package weiweiwang.github.quickdialer;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.text.Html;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import weiweiwang.github.search.AbstractSearchService;
import weiweiwang.github.search.SearchCallback;
import weiweiwang.github.search.SearchService;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
public class DialerActivity extends Activity implements AdapterView.OnItemClickListener {
private static final String TAG = DialerActivity.class.getSimpleName();
private static final int MAX_HITS = 20;
/**
* Called when the activity is first created.
*/
private AbstractSearchService searchService;
private TextView mInput;
private ListView list;
private ResultAdapter resultAdapter = new ResultAdapter();
private Handler mainHandler = new Handler(Looper.getMainLooper());
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mInput = (TextView) findViewById(R.id.digits);
list = ((ListView) findViewById(R.id.list));
list.setAdapter(resultAdapter);
list.setOnItemClickListener(this);
searchService = SearchService.getInstance(this);
search(null);
}
@Override
protected void onStop() {
super.onStop();
if (BuildConfig.DEBUG) {
Log.d(TAG, "onStop");
}
}
@Override
protected void onResume() {
super.onResume();
if (BuildConfig.DEBUG) {
Log.d(TAG, "onResume");
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (BuildConfig.DEBUG) {
Log.d(TAG, "onDestroy");
}
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Map<String, Object> searchRes = (Map<String, Object>) list.getAdapter().getItem(position);
if (searchRes.containsKey(SearchService.FIELD_NUMBER)) {
call(searchRes.get(SearchService.FIELD_NUMBER).toString());
}
}
private void call(String number) {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.fromParts("tel", number, null));
startActivity(intent);
}
public void onBtnClick(View view) {
switch (view.getId()) {
case R.id.deleteButton:
delChar();
break;
default:
addChar(((TextView) view).getText().toString());
}
String searchText = mInput.getText().toString();
if (TextUtils.isEmpty(searchText)) {
search(null);
} else if ("*#*".equals(searchText)) {
searchService.asyncRebuild(true);
} else if (searchText.indexOf('*') == -1) {
search(searchText);
}
}
private void addChar(String c) {
c = c.toLowerCase(Locale.CHINA);
mInput.setText(mInput.getText() + String.valueOf(c.charAt(0)));
}
private void delChar() {
String text = mInput.getText().toString();
if (text.length() > 0) {
text = text.substring(0, text.length() - 1);
mInput.setText(text);
}
}
private void search(String query) {
SearchCallback searchCallback = new SearchCallback() {
private long start = System.currentTimeMillis();
@Override
public void onSearchResult(String query, long hits,
final List<Map<String, Object>> result) {
mainHandler.post(new Runnable() {
@Override
public void run() {
resultAdapter.setItems(result);
resultAdapter.notifyDataSetChanged();
list.smoothScrollToPosition(0);
}
});
Log.v(SearchService.TAG, "query:" + query + ",result: " + result.size() + ",time used:" + (System.currentTimeMillis() - start));
}
};
searchService.query(query, MAX_HITS, true, searchCallback);
}
private static class ViewHolder {
public TextView name;
public TextView number;
}
private class ResultAdapter extends BaseAdapter {
private List<Map<String, Object>> items = new ArrayList<Map<String, Object>>();
@Override
public synchronized int getCount() {
return items.size();
}
public synchronized void setItems(List<Map<String, Object>> items) {
this.items = items;
}
@Override
public Object getItem(int position) {
return items.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View rowView = convertView;
if (rowView == null) {
rowView = LayoutInflater.from(getBaseContext()).inflate(
R.layout.list_item, parent, false);
ViewHolder viewHolder = new ViewHolder();
viewHolder.name = (TextView) rowView.findViewById(R.id.name);
viewHolder.number = (TextView) rowView
.findViewById(R.id.number);
rowView.setTag(viewHolder);
}
ViewHolder holder = (ViewHolder) rowView.getTag();
Map<String, Object> searchRes = items.get(position);
StringBuilder nameBuilder = new StringBuilder();
if (searchRes.containsKey(SearchService.FIELD_NAME)) {
nameBuilder.append(searchRes.get(
SearchService.FIELD_NAME).toString());
} else {
nameBuilder.append("陌生号码");
}
nameBuilder.append(' ');
if (searchRes.containsKey(SearchService.FIELD_PINYIN)) {
nameBuilder.append(searchRes.get(SearchService.FIELD_PINYIN).toString());
}
StringBuilder numberBuilder = new StringBuilder();
if (searchRes.containsKey(SearchService.FIELD_HIGHLIGHTED_NUMBER)) {
numberBuilder.append(searchRes.get(SearchService.FIELD_HIGHLIGHTED_NUMBER).toString());
} else if (searchRes.containsKey(SearchService.FIELD_NUMBER)) {
numberBuilder.append(searchRes.get(SearchService.FIELD_NUMBER));
}
holder.name.setText(Html.fromHtml(nameBuilder.toString()));
holder.number.setText(Html.fromHtml(numberBuilder.toString()));
return rowView;
}
}
}