• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007-2008 Esmertec AG.
3  * Copyright (C) 2007-2008 The Android Open Source Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 package com.android.im.app;
19 
20 import com.android.im.R;
21 
22 import android.app.ListActivity;
23 import android.content.Context;
24 import android.content.Intent;
25 import android.database.Cursor;
26 import android.database.DatabaseUtils;
27 import android.net.Uri;
28 import android.os.Bundle;
29 import android.provider.Im;
30 import android.text.Editable;
31 import android.text.TextWatcher;
32 import android.util.Log;
33 import android.view.View;
34 import android.widget.EditText;
35 import android.widget.Filter;
36 import android.widget.ListView;
37 import android.widget.ResourceCursorAdapter;
38 
39 /**
40  * Activity used to pick a contact.
41  */
42 public class ContactsPickerActivity extends ListActivity {
43     public final static String EXTRA_EXCLUDED_CONTACTS = "excludes";
44 
45     public final static String EXTRA_RESULT_USERNAME = "result";
46 
47     private ContactsAdapter mAdapter;
48     private String mExcludeClause;
49     Uri mData;
50     Filter mFilter;
51 
log(String msg)52     private static final void log(String msg) {
53         Log.d(ImApp.LOG_TAG, "<ContactsPickerActivity> " + msg);
54     }
55 
56     @Override
onCreate(Bundle icicle)57     protected void onCreate(Bundle icicle) {
58         super.onCreate(icicle);
59 
60         setContentView(R.layout.contacts_picker_activity);
61         if(!resolveIntent()){
62             if(Log.isLoggable(ImApp.LOG_TAG, Log.DEBUG)) {
63                 log("no data, finish");
64             }
65             finish();
66             return;
67         }
68 
69         EditText filter = (EditText)findViewById(R.id.filter);
70         filter.addTextChangedListener(new TextWatcher() {
71             public void beforeTextChanged(CharSequence s, int start, int count, int after) {
72             }
73 
74             public void onTextChanged(CharSequence s, int start, int before, int count) {
75                 mFilter.filter(s);
76             }
77 
78             public void afterTextChanged(Editable s) {
79             }
80         });
81     }
82 
resolveIntent()83     private boolean resolveIntent() {
84         Intent i = getIntent();
85         mData = i.getData();
86 
87         if(mData == null) {
88             return false;
89         }
90         mExcludeClause = buildExcludeClause(i.getStringArrayExtra(EXTRA_EXCLUDED_CONTACTS));
91         Cursor cursor = managedQuery(mData, ContactView.CONTACT_PROJECTION,
92                 mExcludeClause, Im.Contacts.DEFAULT_SORT_ORDER);
93         if (cursor == null) {
94             return false;
95         }
96 
97         mAdapter = new ContactsAdapter(this, cursor);
98         mFilter = mAdapter.getFilter();
99         setListAdapter(mAdapter);
100         return true;
101     }
102 
103     @Override
onListItemClick(ListView l, View v, int position, long id)104     protected void onListItemClick(ListView l, View v, int position, long id) {
105         Cursor cursor = (Cursor)mAdapter.getItem(position);
106         Intent data = new Intent();
107         data.putExtra(EXTRA_RESULT_USERNAME,
108                 cursor.getString(ContactView.COLUMN_CONTACT_USERNAME));
109         setResult(RESULT_OK, data);
110         finish();
111     }
112 
buildExcludeClause(String[] excluded)113     private static String buildExcludeClause(String[] excluded) {
114         if (excluded == null || excluded.length == 0) {
115             return null;
116         }
117 
118         StringBuilder clause = new StringBuilder();
119         clause.append(Im.Contacts.USERNAME);
120         clause.append(" NOT IN (");
121         int len = excluded.length;
122         for (int i = 0; i < len - 1; i++) {
123             DatabaseUtils.appendValueToSql(clause, excluded[i]);
124             clause.append(',');
125         }
126         DatabaseUtils.appendValueToSql(clause, excluded[len - 1]);
127         clause.append(')');
128         return clause.toString();
129     }
130 
runQuery(CharSequence constraint)131     Cursor runQuery(CharSequence constraint) {
132         String where;
133         if (constraint == null) {
134             where = mExcludeClause;
135         } else {
136             StringBuilder buf = new StringBuilder();
137             if (mExcludeClause != null) {
138                 buf.append(mExcludeClause).append(" AND ");
139             }
140 
141             buf.append(Im.Contacts.NICKNAME);
142             buf.append(" LIKE ");
143             DatabaseUtils.appendValueToSql(buf, "%" + constraint + "%");
144 
145             where = buf.toString();
146         }
147         return managedQuery(mData, ContactView.CONTACT_PROJECTION, where,
148                 Im.Contacts.DEFAULT_SORT_ORDER);
149     }
150 
151     private class ContactsAdapter extends ResourceCursorAdapter {
152         private String mConstraints;
153 
ContactsAdapter(Context context, Cursor c)154         public ContactsAdapter(Context context, Cursor c) {
155             super(context, R.layout.contact_view, c);
156         }
157 
158         @Override
bindView(View view, Context context, Cursor cursor)159         public void bindView(View view, Context context, Cursor cursor) {
160             ContactView v = (ContactView)view;
161             v.setPadding(0, 0, 0, 0);
162             v.bind(cursor, mConstraints, false);
163         }
164 
165         @Override
changeCursor(Cursor cursor)166         public void changeCursor(Cursor cursor) {
167             if(mCursor != null && mCursor != cursor) {
168                 mCursor.deactivate();
169             }
170             super.changeCursor(cursor);
171         }
172 
173         @Override
runQueryOnBackgroundThread(CharSequence constraint)174         public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
175             mConstraints = constraint.toString();
176 
177             return ContactsPickerActivity.this.runQuery(constraint);
178         }
179     }
180 
181 }
182