merge in klp-release history after reset to klp-dev
diff --git a/src/com/android/dialer/DialtactsActivity.java b/src/com/android/dialer/DialtactsActivity.java
index 93d31f3..bd2dbf3 100644
--- a/src/com/android/dialer/DialtactsActivity.java
+++ b/src/com/android/dialer/DialtactsActivity.java
@@ -68,8 +68,10 @@
import com.android.contacts.common.list.OnPhoneNumberPickerActionListener;
import com.android.contacts.common.list.PhoneNumberPickerFragment;
import com.android.dialer.calllog.CallLogActivity;
+import com.android.dialer.database.DialerDatabaseHelper;
import com.android.dialer.dialpad.DialpadFragment;
import com.android.dialer.dialpad.SmartDialNameMatcher;
+import com.android.dialer.dialpad.SmartDialPrefix;
import com.android.dialer.interactions.PhoneNumberInteraction;
import com.android.dialer.list.AllContactsActivity;
import com.android.dialer.list.PhoneFavoriteFragment;
@@ -165,6 +167,8 @@
private String mSearchQuery;
+ private DialerDatabaseHelper mDialerDatabaseHelper;
+
/**
* Listener used when one of phone numbers in search UI is selected. This will initiate a
* phone call using the phone number.
@@ -280,6 +284,9 @@
&& savedInstanceState == null) {
setupFilterText(intent);
}
+
+ mDialerDatabaseHelper = DialerDatabaseHelper.getInstance(this);
+ SmartDialPrefix.initializeNanpSettings(this);
}
@Override
@@ -289,6 +296,7 @@
displayFragment(getIntent());
}
mFirstLaunch = false;
+ mDialerDatabaseHelper.startSmartDialUpdateThread();
}
@Override
diff --git a/src/com/android/dialer/database/DialerDatabaseHelper.java b/src/com/android/dialer/database/DialerDatabaseHelper.java
index a802825..3bea980 100644
--- a/src/com/android/dialer/database/DialerDatabaseHelper.java
+++ b/src/com/android/dialer/database/DialerDatabaseHelper.java
@@ -293,7 +293,11 @@
Log.v(TAG, "Getting Instance");
}
if (sSingleton == null) {
- sSingleton = new DialerDatabaseHelper(context, SMARTDIAL_DATABASE_NAME);
+ // Use application context instead of activity context because this is a singleton,
+ // and we don't want to leak the activity if the activity is not running but the
+ // dialer database helper is still doing work.
+ sSingleton = new DialerDatabaseHelper(context.getApplicationContext(),
+ SMARTDIAL_DATABASE_NAME);
}
return sSingleton;
}
diff --git a/src/com/android/dialer/dialpad/DialpadFragment.java b/src/com/android/dialer/dialpad/DialpadFragment.java
index fefbcc4..82f5377 100644
--- a/src/com/android/dialer/dialpad/DialpadFragment.java
+++ b/src/com/android/dialer/dialpad/DialpadFragment.java
@@ -190,8 +190,6 @@
private ListView mDialpadChooser;
private DialpadChooserAdapter mDialpadChooserAdapter;
- private DialerDatabaseHelper mDialerDatabaseHelper;
-
/**
* Regular expression prohibiting manual phone call. Can be empty, which means "no rule".
*/
@@ -327,9 +325,6 @@
mContactsPrefs = new ContactsPreferences(getActivity());
mCurrentCountryIso = GeoUtil.getCurrentCountryIso(getActivity());
- mDialerDatabaseHelper = DialerDatabaseHelper.getInstance(getActivity());
- SmartDialPrefix.initializeNanpSettings(getActivity());
-
try {
mHaptic.init(getActivity(),
getResources().getBoolean(R.bool.config_enable_dialer_key_vibration));
@@ -674,10 +669,6 @@
// Prevent unnecessary confusion. Reset the press count anyway.
mDialpadPressCount = 0;
- // Initialize smart dialing state. This has to be done before anything is filled in before
- // the dialpad edittext to prevent entries from being loaded from a null cache.
- initializeSmartDialingState();
-
configureScreenFromIntent(getActivity());
stopWatch.lap("fdin");
@@ -1681,13 +1672,6 @@
return intent;
}
- private void initializeSmartDialingState() {
- // Handle smart dialing related state
- // TODO krelease: This should probably be moved to somewhere more appropriate, maybe
- // into DialtactsActivity
- mDialerDatabaseHelper.startSmartDialUpdateThread();
- }
-
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
diff --git a/src/com/android/dialer/list/PhoneFavoriteFragment.java b/src/com/android/dialer/list/PhoneFavoriteFragment.java
index b6a5fb4..a1406d2 100644
--- a/src/com/android/dialer/list/PhoneFavoriteFragment.java
+++ b/src/com/android/dialer/list/PhoneFavoriteFragment.java
@@ -91,9 +91,6 @@
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
if (DEBUG) Log.d(TAG, "ContactTileLoaderListener#onLoadFinished");
mContactTileAdapter.setContactCursor(data);
-
- // Show the filter header with "loading" state.
- mAccountFilterHeader.setVisibility(View.VISIBLE);
}
@Override
@@ -148,11 +145,6 @@
private TextView mEmptyView;
private ListView mListView;
private View mShowAllContactsButton;
- /**
- * Layout containing {@link #mAccountFilterHeader}. Used to limit area being "pressed".
- */
- private FrameLayout mAccountFilterHeaderContainer;
- private View mAccountFilterHeader;
/**
* Layout used when contacts load is slower than expected and thus "loading" view should be
@@ -214,13 +206,6 @@
mListView.setVerticalScrollbarPosition(View.SCROLLBAR_POSITION_RIGHT);
mListView.setScrollBarStyle(ListView.SCROLLBARS_OUTSIDE_OVERLAY);
- // TODO krelease: Don't show this header anymore
- // Create the account filter header but keep it hidden until "all" contacts are loaded.
- mAccountFilterHeaderContainer = new FrameLayout(getActivity(), null);
- mAccountFilterHeader = inflater.inflate(R.layout.account_filter_header_for_phone_favorite,
- mListView, false);
- mAccountFilterHeaderContainer.addView(mAccountFilterHeader);
-
mLoadingView = inflater.inflate(R.layout.phone_loading_contacts, mListView, false);
mShowAllContactsButton = inflater.inflate(R.layout.show_all_contact_button, mListView,
false);
@@ -232,8 +217,7 @@
});
mAdapter = new PhoneFavoriteMergedAdapter(getActivity(), mContactTileAdapter,
- mAccountFilterHeaderContainer, mCallLogAdapter, mLoadingView,
- mShowAllContactsButton);
+ mCallLogAdapter, mLoadingView, mShowAllContactsButton);
mListView.setAdapter(mAdapter);
diff --git a/src/com/android/dialer/list/PhoneFavoriteMergedAdapter.java b/src/com/android/dialer/list/PhoneFavoriteMergedAdapter.java
index 0e5594e..ce2b627 100644
--- a/src/com/android/dialer/list/PhoneFavoriteMergedAdapter.java
+++ b/src/com/android/dialer/list/PhoneFavoriteMergedAdapter.java
@@ -55,7 +55,6 @@
public PhoneFavoriteMergedAdapter(Context context,
PhoneFavoritesTileAdapter contactTileAdapter,
- View accountFilterHeaderContainer,
CallLogAdapter callLogAdapter,
View loadingView,
View showAllContactsButton) {
diff --git a/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java b/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java
index 614a0d3..3aa85e8 100644
--- a/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java
+++ b/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java
@@ -26,7 +26,9 @@
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.PinnedPositions;
+import android.text.TextUtils;
import android.util.Log;
+import android.util.LongSparseArray;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
@@ -99,6 +101,8 @@
/**
* Only valid when {@link DisplayType#STREQUENT_PHONE_ONLY} is true
+ *
+ * TODO krelease: Remove entirely if not needed
*/
private int mPhoneNumberIndex;
private int mPhoneNumberTypeIndex;
@@ -235,38 +239,62 @@
mContactEntries.clear();
cursor.moveToPosition(-1);
+
+ final LongSparseArray<Object> duplicates = new LongSparseArray<Object>(cursor.getCount());
+
+ // Dummy object that we're inserting into the sparse array as a value so that we can use
+ // the sparse array as a set to check for duplicates
+
+ final Object dummy = new Object();
+
while (cursor.moveToNext()) {
- final long id = cursor.getLong(mIdIndex);
- final String photoUri = cursor.getString(mPhotoUriIndex);
- final String lookupKey = cursor.getString(mLookupIndex);
-
- final ContactEntry contact = new ContactEntry();
-
- final int pinned = cursor.getInt(mPinnedIndex);
final int starred = cursor.getInt(mStarredIndex);
-
- final String name = cursor.getString(mNameIndex);
+ final long id;
if (starred > 0) {
- contact.id = id;
+ id = cursor.getLong(mIdIndex);
} else {
// The contact id for frequent contacts is stored in the .contact_id field rather
// than the _id field
- contact.id = cursor.getLong(mContactIdForFrequentIndex);
+ id = cursor.getLong(mContactIdForFrequentIndex);
}
- contact.name = (name != null) ? name : mResources.getString(R.string.missing_name);
- contact.status = cursor.getString(mStatusIndex);
+
+ if (duplicates.get(id) == null) {
+ duplicates.put(id, dummy);
+ } else {
+ continue;
+ }
+
+ final String photoUri = cursor.getString(mPhotoUriIndex);
+ final String lookupKey = cursor.getString(mLookupIndex);
+ final int pinned = cursor.getInt(mPinnedIndex);
+ final String name = cursor.getString(mNameIndex);
+
+ final ContactEntry contact = new ContactEntry();
+
+ contact.id = id;
+ contact.name = (!TextUtils.isEmpty(name)) ? name :
+ mResources.getString(R.string.missing_name);
contact.photoUri = (photoUri != null ? Uri.parse(photoUri) : null);
contact.lookupKey = ContentUris.withAppendedId(
Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, lookupKey), id);
- // Set phone number and label
- final int phoneNumberType = cursor.getInt(mPhoneNumberTypeIndex);
- final String phoneNumberCustomLabel = cursor.getString(mPhoneNumberLabelIndex);
- contact.phoneLabel = (String) Phone.getTypeLabel(mResources, phoneNumberType,
- phoneNumberCustomLabel);
- contact.phoneNumber = cursor.getString(mPhoneNumberIndex);
+
+ // TODO krelease: These columns are temporarily unused for now so that
+ // the contact tiles will be treated like favorites since they don't have a phone
+ // number. Depending on how the final UX goes we will either remove or enable
+ // them again.
+
+ /*
+ // Set phone number, label and status
+ final int phoneNumberType = cursor.getInt(mPhoneNumberTypeIndex);
+ final String phoneNumberCustomLabel = cursor.getString(mPhoneNumberLabelIndex);
+ contact.phoneLabel = (String) Phone.getTypeLabel(mResources, phoneNumberType,
+ phoneNumberCustomLabel);
+ contact.phoneNumber = cursor.getString(mPhoneNumberIndex);
+ contact.status = cursor.getString(mStatusIndex);
+ */
contact.pinned = pinned;
mContactEntries.add(contact);
@@ -508,17 +536,6 @@
}
/**
- * Returns the "frequent header" position. Only available when STREQUENT or
- * STREQUENT_PHONE_ONLY is used for its display type.
- *
- * TODO krelease: We shouldn't need this method once we get rid of the frequent header
- * in the merged adapter
- */
- public int getFrequentHeaderPosition() {
- return getRowCount(mNumStarred);
- }
-
- /**
* Temporarily removes a contact from the list for UI refresh. Stores data for this contact
* in the back-up variable.
*