ContactsPickerActivity.java
上传用户:szyujian
上传日期:2016-09-20
资源大小:320k
文件大小:6k
源码类别:

android开发

开发平台:

C/C++

  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. package com.android.im.app;
  18. import com.android.im.R;
  19. import android.app.ListActivity;
  20. import android.content.Context;
  21. import android.content.Intent;
  22. import android.database.Cursor;
  23. import android.database.DatabaseUtils;
  24. import android.net.Uri;
  25. import android.os.Bundle;
  26. import android.provider.Im;
  27. import android.text.Editable;
  28. import android.text.TextWatcher;
  29. import android.util.Log;
  30. import android.view.View;
  31. import android.widget.EditText;
  32. import android.widget.Filter;
  33. import android.widget.ListView;
  34. import android.widget.ResourceCursorAdapter;
  35. /**
  36.  * Activity used to pick a contact.
  37.  */
  38. public class ContactsPickerActivity extends ListActivity {
  39.     public final static String EXTRA_EXCLUDED_CONTACTS = "excludes";
  40.     public final static String EXTRA_RESULT_USERNAME = "result";
  41.     private ContactsAdapter mAdapter;
  42.     private String mExcludeClause;
  43.     Uri mData;
  44.     Filter mFilter;
  45.     private static final void log(String msg) {
  46.         Log.d(ImApp.LOG_TAG, "<ContactsPickerActivity> " + msg);
  47.     }
  48.     @Override
  49.     protected void onCreate(Bundle icicle) {
  50.         super.onCreate(icicle);
  51.         setContentView(R.layout.contacts_picker_activity);
  52.         if(!resolveIntent()){
  53.             if(Log.isLoggable(ImApp.LOG_TAG, Log.DEBUG)) {
  54.                 log("no data, finish");
  55.             }
  56.             finish();
  57.             return;
  58.         }
  59.         EditText filter = (EditText)findViewById(R.id.filter);
  60.         filter.addTextChangedListener(new TextWatcher() {
  61.             public void beforeTextChanged(CharSequence s, int start, int count, int after) {
  62.             }
  63.             public void onTextChanged(CharSequence s, int start, int before, int count) {
  64.                 mFilter.filter(s);
  65.             }
  66.             public void afterTextChanged(Editable s) {
  67.             }
  68.         });
  69.     }
  70.     private boolean resolveIntent() {
  71.         Intent i = getIntent();
  72.         mData = i.getData();
  73.         if(mData == null) {
  74.             return false;
  75.         }
  76.         mExcludeClause = buildExcludeClause(i.getStringArrayExtra(EXTRA_EXCLUDED_CONTACTS));
  77.         Cursor cursor = managedQuery(mData, ContactView.CONTACT_PROJECTION,
  78.                 mExcludeClause, Im.Contacts.DEFAULT_SORT_ORDER);
  79.         if (cursor == null) {
  80.             return false;
  81.         }
  82.         mAdapter = new ContactsAdapter(this, cursor);
  83.         mFilter = mAdapter.getFilter();
  84.         setListAdapter(mAdapter);
  85.         return true;
  86.     }
  87.     @Override
  88.     protected void onListItemClick(ListView l, View v, int position, long id) {
  89.         Cursor cursor = (Cursor)mAdapter.getItem(position);
  90.         Intent data = new Intent();
  91.         data.putExtra(EXTRA_RESULT_USERNAME,
  92.                 cursor.getString(ContactView.COLUMN_CONTACT_USERNAME));
  93.         setResult(RESULT_OK, data);
  94.         finish();
  95.     }
  96.     private static String buildExcludeClause(String[] excluded) {
  97.         if (excluded == null || excluded.length == 0) {
  98.             return null;
  99.         }
  100.         StringBuilder clause = new StringBuilder();
  101.         clause.append(Im.Contacts.USERNAME);
  102.         clause.append(" NOT IN (");
  103.         int len = excluded.length;
  104.         for (int i = 0; i < len - 1; i++) {
  105.             DatabaseUtils.appendValueToSql(clause, excluded[i]);
  106.             clause.append(',');
  107.         }
  108.         DatabaseUtils.appendValueToSql(clause, excluded[len - 1]);
  109.         clause.append(')');
  110.         return clause.toString();
  111.     }
  112.     Cursor runQuery(CharSequence constraint) {
  113.         String where;
  114.         if (constraint == null) {
  115.             where = mExcludeClause;
  116.         } else {
  117.             StringBuilder buf = new StringBuilder();
  118.             if (mExcludeClause != null) {
  119.                 buf.append(mExcludeClause).append(" AND ");
  120.             }
  121.             buf.append(Im.Contacts.NICKNAME);
  122.             buf.append(" LIKE ");
  123.             DatabaseUtils.appendValueToSql(buf, "%" + constraint + "%");
  124.             where = buf.toString();
  125.         }
  126.         return managedQuery(mData, ContactView.CONTACT_PROJECTION, where,
  127.                 Im.Contacts.DEFAULT_SORT_ORDER);
  128.     }
  129.     private class ContactsAdapter extends ResourceCursorAdapter {
  130.         private String mConstraints;
  131.         public ContactsAdapter(Context context, Cursor c) {
  132.             super(context, R.layout.contact_view, c);
  133.         }
  134.         @Override
  135.         public void bindView(View view, Context context, Cursor cursor) {
  136.             ContactView v = (ContactView)view;
  137.             v.setPadding(0, 0, 0, 0);
  138.             v.bind(cursor, mConstraints, false);
  139.         }
  140.         @Override
  141.         public void changeCursor(Cursor cursor) {
  142.             if(mCursor != null && mCursor != cursor) {
  143.                 mCursor.deactivate();
  144.             }
  145.             super.changeCursor(cursor);
  146.         }
  147.         @Override
  148.         public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
  149.             mConstraints = constraint.toString();
  150.             return ContactsPickerActivity.this.runQuery(constraint);
  151.         }
  152.     }
  153. }