package ru.shutoff.cgstarter;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.BaseColumns;
import android.provider.ContactsContract;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class SMSActivity extends Activity {
Vector<SMS> smsList;
int addr_pos;
BaseAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list);
setResult(RESULT_CANCELED);
LoadSMS task = new LoadSMS();
task.execute();
}
static class SMS {
String body;
String to;
String address;
Bitmap photo;
long date;
double lat;
double lon;
}
class LoadSMS extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... voids) {
smsList = new Vector<SMS>();
Uri message = Uri.parse("content://sms/");
ContentResolver cr = getContentResolver();
Cursor c = cr.query(message, null, null, null, null);
startManagingCursor(c);
int totalSMS = c.getCount();
Pattern pattern = Pattern.compile("^([0-9]{1,2}\\.[0-9]{4,7})[^0-9]+([0-9]{1,2}\\.[0-9]{4,7})");
if (c.moveToFirst()) {
for (int i = 0; i < totalSMS; i++) {
String body = c.getString(c.getColumnIndexOrThrow("body"));
if (body != null) {
Matcher matcher = pattern.matcher(body);
try {
if (matcher.find()) {
SMS sms = new SMS();
sms.body = body;
sms.date = c.getLong(c.getColumnIndexOrThrow("date"));
sms.to = c.getString(c.getColumnIndex("address"));
sms.lat = Double.parseDouble(matcher.group(1));
sms.lon = Double.parseDouble(matcher.group(2));
Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(sms.to));
ContentResolver contentResolver = getContentResolver();
Cursor contactLookup = contentResolver.query(uri, new String[]{BaseColumns._ID,
ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null);
try {
if (contactLookup != null && contactLookup.getCount() > 0) {
contactLookup.moveToNext();
sms.to = contactLookup.getString(contactLookup.getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
long id = contactLookup.getLong(contactLookup.getColumnIndex(BaseColumns._ID));
Uri photo_uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id);
InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(contentResolver, photo_uri);
if (input != null)
sms.photo = BitmapFactory.decodeStream(input);
}
} finally {
if (contactLookup != null) {
contactLookup.close();
}
}
smsList.add(sms);
}
} catch (Exception ex) {
// State.print(ex);
}
}
c.moveToNext();
}
}
c.close();
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
findViewById(R.id.progress).setVisibility(View.GONE);
ListView lv = (ListView) findViewById(R.id.list);
lv.setVisibility(View.VISIBLE);
adapter = new BaseAdapter() {
@Override
public int getCount() {
return smsList.size();
}
@Override
public Object getItem(int i) {
return smsList.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
View v = view;
if (v == null) {
final LayoutInflater layoutInflater = LayoutInflater.from(SMSActivity.this);
v = layoutInflater.inflate(R.layout.sms_item, null);
}
SMS sms = smsList.get(i);
TextView date = (TextView) v.findViewById(R.id.date);
Date time = new Date(sms.date);
SimpleDateFormat format = new SimpleDateFormat("hh:mm dd.MM.yy");
date.setText(format.format(time));
TextView text = (TextView) v.findViewById(R.id.text);
text.setText(sms.body);
TextView to = (TextView) v.findViewById(R.id.to);
to.setText(sms.to);
TextView addr = (TextView) v.findViewById(R.id.address);
addr.setText(sms.address);
ImageView iv = (ImageView) v.findViewById(R.id.pict);
if (sms.photo != null) {
iv.setVisibility(View.VISIBLE);
iv.setImageBitmap(sms.photo);
} else {
iv.setVisibility(View.GONE);
}
return v;
}
};
lv.setAdapter(adapter);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
SMS sms = smsList.get(i);
if (OnExitService.isRunCG(SMSActivity.this))
CarMonitor.killCG(SMSActivity.this);
CarMonitor.startCG(SMSActivity.this, sms.lat + "|" + sms.lon, null, null);
setResult(RESULT_OK);
finish();
}
});
if (smsList.size() == 0)
return;
new AddrResolver();
}
}
class AddrResolver extends AddressRequest {
AddrResolver() {
if (addr_pos >= smsList.size())
return;
SMS sms = smsList.get(addr_pos);
execute(sms.lat, sms.lon);
}
@Override
protected void address(String s) {
if (s != null) {
smsList.get(addr_pos).address = s;
adapter.notifyDataSetChanged();
}
if (++addr_pos < smsList.size())
new AddrResolver();
}
}
}