diff options
author | linyuh <linyuh@google.com> | 2017-12-21 15:42:00 -0800 |
---|---|---|
committer | Eric Erfanian <erfanian@google.com> | 2017-12-22 08:57:09 -0800 |
commit | bf4bb0555ca827e660ad05b4caf982a030211c03 (patch) | |
tree | acbccec794536c7d06985f8f7f00475004e0eeed /java/com/android/dialer/smartdial | |
parent | 507340c5b86799320454811b3fca1b8534028fb1 (diff) |
Reorganize classes related to smart dial.
Bug: 30215380,70633239
Test: Existing tests
PiperOrigin-RevId: 179868033
Change-Id: If8cdbdfafb3a66397623578131649cb8adc18733
Diffstat (limited to 'java/com/android/dialer/smartdial')
-rw-r--r-- | java/com/android/dialer/smartdial/SmartDialCursorLoader.java | 182 | ||||
-rw-r--r-- | java/com/android/dialer/smartdial/map/BulgarianSmartDialMap.java (renamed from java/com/android/dialer/smartdial/BulgarianSmartDialMap.java) | 2 | ||||
-rw-r--r-- | java/com/android/dialer/smartdial/map/CompositeSmartDialMap.java (renamed from java/com/android/dialer/smartdial/CompositeSmartDialMap.java) | 14 | ||||
-rw-r--r-- | java/com/android/dialer/smartdial/map/LatinSmartDialMap.java (renamed from java/com/android/dialer/smartdial/LatinSmartDialMap.java) | 2 | ||||
-rw-r--r-- | java/com/android/dialer/smartdial/map/RussianSmartDialMap.java (renamed from java/com/android/dialer/smartdial/RussianSmartDialMap.java) | 2 | ||||
-rw-r--r-- | java/com/android/dialer/smartdial/map/SmartDialMap.java (renamed from java/com/android/dialer/smartdial/SmartDialMap.java) | 2 | ||||
-rw-r--r-- | java/com/android/dialer/smartdial/map/UkrainianSmartDialMap.java (renamed from java/com/android/dialer/smartdial/UkrainianSmartDialMap.java) | 2 | ||||
-rw-r--r-- | java/com/android/dialer/smartdial/util/SmartDialMatchPosition.java (renamed from java/com/android/dialer/smartdial/SmartDialMatchPosition.java) | 6 | ||||
-rw-r--r-- | java/com/android/dialer/smartdial/util/SmartDialNameMatcher.java (renamed from java/com/android/dialer/smartdial/SmartDialNameMatcher.java) | 5 | ||||
-rw-r--r-- | java/com/android/dialer/smartdial/util/SmartDialPrefix.java (renamed from java/com/android/dialer/smartdial/SmartDialPrefix.java) | 3 |
10 files changed, 202 insertions, 18 deletions
diff --git a/java/com/android/dialer/smartdial/SmartDialCursorLoader.java b/java/com/android/dialer/smartdial/SmartDialCursorLoader.java new file mode 100644 index 000000000..f6bc9325a --- /dev/null +++ b/java/com/android/dialer/smartdial/SmartDialCursorLoader.java @@ -0,0 +1,182 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dialer.smartdial; + +import android.content.AsyncTaskLoader; +import android.content.Context; +import android.database.Cursor; +import android.database.MatrixCursor; +import com.android.contacts.common.list.PhoneNumberListAdapter.PhoneQuery; +import com.android.dialer.common.LogUtil; +import com.android.dialer.database.Database; +import com.android.dialer.database.DialerDatabaseHelper; +import com.android.dialer.database.DialerDatabaseHelper.ContactNumber; +import com.android.dialer.smartdial.util.SmartDialNameMatcher; +import com.android.dialer.util.PermissionsUtil; +import java.util.ArrayList; + +/** Implements a Loader<Cursor> class to asynchronously load SmartDial search results. */ +public class SmartDialCursorLoader extends AsyncTaskLoader<Cursor> { + + private static final String TAG = "SmartDialCursorLoader"; + private static final boolean DEBUG = false; + + private final Context mContext; + + private Cursor mCursor; + + private String mQuery; + private SmartDialNameMatcher mNameMatcher; + + private boolean mShowEmptyListForNullQuery = true; + + public SmartDialCursorLoader(Context context) { + super(context); + mContext = context; + } + + /** + * Configures the query string to be used to find SmartDial matches. + * + * @param query The query string user typed. + */ + public void configureQuery(String query) { + if (DEBUG) { + LogUtil.v(TAG, "Configure new query to be " + query); + } + mQuery = SmartDialNameMatcher.normalizeNumber(mContext, query); + + /** Constructs a name matcher object for matching names. */ + mNameMatcher = new SmartDialNameMatcher(mQuery); + mNameMatcher.setShouldMatchEmptyQuery(!mShowEmptyListForNullQuery); + } + + /** + * Queries the SmartDial database and loads results in background. + * + * @return Cursor of contacts that matches the SmartDial query. + */ + @Override + public Cursor loadInBackground() { + if (DEBUG) { + LogUtil.v(TAG, "Load in background " + mQuery); + } + + if (!PermissionsUtil.hasContactsReadPermissions(mContext)) { + return new MatrixCursor(PhoneQuery.PROJECTION_PRIMARY); + } + + /** Loads results from the database helper. */ + final DialerDatabaseHelper dialerDatabaseHelper = + Database.get(mContext).getDatabaseHelper(mContext); + final ArrayList<ContactNumber> allMatches = + dialerDatabaseHelper.getLooseMatches(mQuery, mNameMatcher); + + if (DEBUG) { + LogUtil.v(TAG, "Loaded matches " + allMatches.size()); + } + + /** Constructs a cursor for the returned array of results. */ + final MatrixCursor cursor = new MatrixCursor(PhoneQuery.PROJECTION_PRIMARY); + Object[] row = new Object[PhoneQuery.PROJECTION_PRIMARY.length]; + for (ContactNumber contact : allMatches) { + row[PhoneQuery.PHONE_ID] = contact.dataId; + row[PhoneQuery.PHONE_NUMBER] = contact.phoneNumber; + row[PhoneQuery.CONTACT_ID] = contact.id; + row[PhoneQuery.LOOKUP_KEY] = contact.lookupKey; + row[PhoneQuery.PHOTO_ID] = contact.photoId; + row[PhoneQuery.DISPLAY_NAME] = contact.displayName; + row[PhoneQuery.CARRIER_PRESENCE] = contact.carrierPresence; + cursor.addRow(row); + } + return cursor; + } + + @Override + public void deliverResult(Cursor cursor) { + if (isReset()) { + /** The Loader has been reset; ignore the result and invalidate the data. */ + releaseResources(cursor); + return; + } + + /** Hold a reference to the old data so it doesn't get garbage collected. */ + Cursor oldCursor = mCursor; + mCursor = cursor; + + if (isStarted()) { + /** If the Loader is in a started state, deliver the results to the client. */ + super.deliverResult(cursor); + } + + /** Invalidate the old data as we don't need it any more. */ + if (oldCursor != null && oldCursor != cursor) { + releaseResources(oldCursor); + } + } + + @Override + protected void onStartLoading() { + if (mCursor != null) { + /** Deliver any previously loaded data immediately. */ + deliverResult(mCursor); + } + if (mCursor == null) { + /** Force loads every time as our results change with queries. */ + forceLoad(); + } + } + + @Override + protected void onStopLoading() { + /** The Loader is in a stopped state, so we should attempt to cancel the current load. */ + cancelLoad(); + } + + @Override + protected void onReset() { + /** Ensure the loader has been stopped. */ + onStopLoading(); + + /** Release all previously saved query results. */ + if (mCursor != null) { + releaseResources(mCursor); + mCursor = null; + } + } + + @Override + public void onCanceled(Cursor cursor) { + super.onCanceled(cursor); + + /** The load has been canceled, so we should release the resources associated with 'data'. */ + releaseResources(cursor); + } + + private void releaseResources(Cursor cursor) { + if (cursor != null) { + cursor.close(); + } + } + + public void setShowEmptyListForNullQuery(boolean show) { + mShowEmptyListForNullQuery = show; + if (mNameMatcher != null) { + mNameMatcher.setShouldMatchEmptyQuery(!show); + } + } +} diff --git a/java/com/android/dialer/smartdial/BulgarianSmartDialMap.java b/java/com/android/dialer/smartdial/map/BulgarianSmartDialMap.java index a16d15919..cbe6afa97 100644 --- a/java/com/android/dialer/smartdial/BulgarianSmartDialMap.java +++ b/java/com/android/dialer/smartdial/map/BulgarianSmartDialMap.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.dialer.smartdial; +package com.android.dialer.smartdial.map; import android.support.v4.util.SimpleArrayMap; import com.google.common.base.Optional; diff --git a/java/com/android/dialer/smartdial/CompositeSmartDialMap.java b/java/com/android/dialer/smartdial/map/CompositeSmartDialMap.java index e9f237f01..df32d4ce7 100644 --- a/java/com/android/dialer/smartdial/CompositeSmartDialMap.java +++ b/java/com/android/dialer/smartdial/map/CompositeSmartDialMap.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.dialer.smartdial; +package com.android.dialer.smartdial.map; import android.content.Context; import android.support.annotation.VisibleForTesting; @@ -58,7 +58,7 @@ public class CompositeSmartDialMap { * <p>The provided character is expected to be a normalized character. See {@link * SmartDialMap#normalizeCharacter(char)} for details. */ - static boolean isValidDialpadCharacter(Context context, char ch) { + public static boolean isValidDialpadCharacter(Context context, char ch) { if (DEFAULT_MAP.isValidDialpadCharacter(ch)) { return true; } @@ -73,7 +73,7 @@ public class CompositeSmartDialMap { * <p>The provided character is expected to be a normalized character. See {@link * SmartDialMap#normalizeCharacter(char)} for details. */ - static boolean isValidDialpadAlphabeticChar(Context context, char ch) { + public static boolean isValidDialpadAlphabeticChar(Context context, char ch) { if (DEFAULT_MAP.isValidDialpadAlphabeticChar(ch)) { return true; } @@ -85,7 +85,7 @@ public class CompositeSmartDialMap { /** * Returns true if the provided character is a digit, and can be mapped to a key on the dialpad. */ - static boolean isValidDialpadNumericChar(Context context, char ch) { + public static boolean isValidDialpadNumericChar(Context context, char ch) { if (DEFAULT_MAP.isValidDialpadNumericChar(ch)) { return true; } @@ -102,7 +102,7 @@ public class CompositeSmartDialMap { * * <p>If the provided character can't be mapped to a key on the dialpad, return -1. */ - static byte getDialpadIndex(Context context, char ch) { + public static byte getDialpadIndex(Context context, char ch) { Optional<Byte> dialpadIndex = DEFAULT_MAP.getDialpadIndex(ch); if (dialpadIndex.isPresent()) { return dialpadIndex.get(); @@ -124,7 +124,7 @@ public class CompositeSmartDialMap { * * <p>If the provided character can't be mapped to a key on the dialpad, return the character. */ - static char getDialpadNumericCharacter(Context context, char ch) { + public static char getDialpadNumericCharacter(Context context, char ch) { Optional<Character> dialpadNumericChar = DEFAULT_MAP.getDialpadNumericCharacter(ch); if (dialpadNumericChar.isPresent()) { return dialpadNumericChar.get(); @@ -144,7 +144,7 @@ public class CompositeSmartDialMap { * * <p>If the provided character can't be mapped to a key on the dialpad, return the character. */ - static char normalizeCharacter(Context context, char ch) { + public static char normalizeCharacter(Context context, char ch) { Optional<Character> normalizedChar = DEFAULT_MAP.normalizeCharacter(ch); if (normalizedChar.isPresent()) { return normalizedChar.get(); diff --git a/java/com/android/dialer/smartdial/LatinSmartDialMap.java b/java/com/android/dialer/smartdial/map/LatinSmartDialMap.java index b67901bbe..052af05c0 100644 --- a/java/com/android/dialer/smartdial/LatinSmartDialMap.java +++ b/java/com/android/dialer/smartdial/map/LatinSmartDialMap.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.dialer.smartdial; +package com.android.dialer.smartdial.map; import android.support.v4.util.SimpleArrayMap; import com.google.common.base.Optional; diff --git a/java/com/android/dialer/smartdial/RussianSmartDialMap.java b/java/com/android/dialer/smartdial/map/RussianSmartDialMap.java index ada9182e1..5038520c2 100644 --- a/java/com/android/dialer/smartdial/RussianSmartDialMap.java +++ b/java/com/android/dialer/smartdial/map/RussianSmartDialMap.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.dialer.smartdial; +package com.android.dialer.smartdial.map; import android.support.v4.util.SimpleArrayMap; import com.google.common.base.Optional; diff --git a/java/com/android/dialer/smartdial/SmartDialMap.java b/java/com/android/dialer/smartdial/map/SmartDialMap.java index bc5c9ea72..c74dd2893 100644 --- a/java/com/android/dialer/smartdial/SmartDialMap.java +++ b/java/com/android/dialer/smartdial/map/SmartDialMap.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.dialer.smartdial; +package com.android.dialer.smartdial.map; import android.support.v4.util.SimpleArrayMap; import com.google.common.base.Optional; diff --git a/java/com/android/dialer/smartdial/UkrainianSmartDialMap.java b/java/com/android/dialer/smartdial/map/UkrainianSmartDialMap.java index 8ba53c45f..28dbc0d61 100644 --- a/java/com/android/dialer/smartdial/UkrainianSmartDialMap.java +++ b/java/com/android/dialer/smartdial/map/UkrainianSmartDialMap.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.dialer.smartdial; +package com.android.dialer.smartdial.map; import android.support.v4.util.SimpleArrayMap; import com.google.common.base.Optional; diff --git a/java/com/android/dialer/smartdial/SmartDialMatchPosition.java b/java/com/android/dialer/smartdial/util/SmartDialMatchPosition.java index 8056ad723..db317ae6b 100644 --- a/java/com/android/dialer/smartdial/SmartDialMatchPosition.java +++ b/java/com/android/dialer/smartdial/util/SmartDialMatchPosition.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package com.android.dialer.smartdial; +package com.android.dialer.smartdial.util; -import android.util.Log; +import com.android.dialer.common.LogUtil; import java.util.ArrayList; /** @@ -59,7 +59,7 @@ public class SmartDialMatchPosition { public static void print(ArrayList<SmartDialMatchPosition> list) { for (int i = 0; i < list.size(); i++) { SmartDialMatchPosition m = list.get(i); - Log.d(TAG, "[" + m.start + "," + m.end + "]"); + LogUtil.d(TAG, "[" + m.start + "," + m.end + "]"); } } diff --git a/java/com/android/dialer/smartdial/SmartDialNameMatcher.java b/java/com/android/dialer/smartdial/util/SmartDialNameMatcher.java index 4e3e0cc3f..725c88c57 100644 --- a/java/com/android/dialer/smartdial/SmartDialNameMatcher.java +++ b/java/com/android/dialer/smartdial/util/SmartDialNameMatcher.java @@ -14,12 +14,13 @@ * limitations under the License. */ -package com.android.dialer.smartdial; +package com.android.dialer.smartdial.util; import android.content.Context; import android.support.annotation.Nullable; import android.text.TextUtils; -import com.android.dialer.smartdial.SmartDialPrefix.PhoneNumberTokens; +import com.android.dialer.smartdial.map.CompositeSmartDialMap; +import com.android.dialer.smartdial.util.SmartDialPrefix.PhoneNumberTokens; import java.util.ArrayList; /** diff --git a/java/com/android/dialer/smartdial/SmartDialPrefix.java b/java/com/android/dialer/smartdial/util/SmartDialPrefix.java index b9c1f8c11..9af411913 100644 --- a/java/com/android/dialer/smartdial/SmartDialPrefix.java +++ b/java/com/android/dialer/smartdial/util/SmartDialPrefix.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.dialer.smartdial; +package com.android.dialer.smartdial.util; import android.content.Context; import android.content.SharedPreferences; @@ -22,6 +22,7 @@ import android.preference.PreferenceManager; import android.support.annotation.VisibleForTesting; import android.telephony.TelephonyManager; import android.text.TextUtils; +import com.android.dialer.smartdial.map.CompositeSmartDialMap; import java.util.ArrayList; import java.util.HashSet; import java.util.Set; |