summaryrefslogtreecommitdiff
path: root/java/com/android/dialer
diff options
context:
space:
mode:
authorcalderwoodra <calderwoodra@google.com>2017-07-25 16:19:03 -0700
committerEric Erfanian <erfanian@google.com>2017-07-26 09:00:19 -0700
commita8085783721fbeb26b4d58eaffabf7cbb8d4f90a (patch)
tree5e1c4c9f82aeef62deb17393d6168608ed2212e1 /java/com/android/dialer
parent753904d60efa39c4aed3c3a3688ceee8d8d730e5 (diff)
Added cursor loader to load the list of remote directories in contact search.
When Dialer users search for contacts, if they have an enterprise account on their device, they can also search for enterprise/remote contacts. This change adds the cursor loader needed to get the list of all remote directories associated with the accounts on the device. Bug: 37209462 Test: DirectoryCursorLoaderTest PiperOrigin-RevId: 163139517 Change-Id: If5e626507d5c337633a678fff5e8dac59f85658e
Diffstat (limited to 'java/com/android/dialer')
-rw-r--r--java/com/android/dialer/searchfragment/remote/RemoteDirectoriesCursorLoader.java117
1 files changed, 117 insertions, 0 deletions
diff --git a/java/com/android/dialer/searchfragment/remote/RemoteDirectoriesCursorLoader.java b/java/com/android/dialer/searchfragment/remote/RemoteDirectoriesCursorLoader.java
new file mode 100644
index 000000000..0a4ca0ecd
--- /dev/null
+++ b/java/com/android/dialer/searchfragment/remote/RemoteDirectoriesCursorLoader.java
@@ -0,0 +1,117 @@
+/*
+
+* Copyright (C) 2017 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.searchfragment.remote;
+
+import android.content.Context;
+import android.content.CursorLoader;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Build.VERSION;
+import android.os.Build.VERSION_CODES;
+import android.provider.ContactsContract;
+import android.support.annotation.Nullable;
+import android.support.annotation.VisibleForTesting;
+import android.text.TextUtils;
+import com.android.dialer.common.LogUtil;
+
+/** CursorLoader to load the list of remote directories on the device. */
+public final class RemoteDirectoriesCursorLoader extends CursorLoader {
+
+ /** Positions of columns in {@code PROJECTIONS}. */
+ private static final int ID = 0;
+
+ private static final int PACKAGE_NAME = 1;
+ private static final int TYPE_RESOURCE_ID = 2;
+ private static final int DISPLAY_NAME = 3;
+ private static final int PHOTO_SUPPORT = 4;
+
+ @VisibleForTesting
+ static final String[] PROJECTION = {
+ ContactsContract.Directory._ID,
+ ContactsContract.Directory.PACKAGE_NAME,
+ ContactsContract.Directory.TYPE_RESOURCE_ID,
+ ContactsContract.Directory.DISPLAY_NAME,
+ ContactsContract.Directory.PHOTO_SUPPORT,
+ };
+
+ RemoteDirectoriesCursorLoader(Context context) {
+ super(context, getContentUri(), PROJECTION, null, null, ContactsContract.Directory._ID);
+ }
+
+ /**
+ * Returns the type of directory as a String (e.g. "Corporate Directory"). Null if the directory
+ * type cannot be found.
+ */
+ @Nullable
+ private static String getDirectoryType(Context context, Cursor cursor) {
+ String packageName = cursor.getString(PACKAGE_NAME);
+ int typeResourceId = cursor.getInt(TYPE_RESOURCE_ID);
+ if (TextUtils.isEmpty(packageName) || typeResourceId == 0) {
+ return null;
+ }
+
+ try {
+ return context
+ .getPackageManager()
+ .getResourcesForApplication(packageName)
+ .getString(typeResourceId);
+ } catch (NameNotFoundException e) {
+ LogUtil.e(
+ "ContactEntryListAdapter.loadInBackground",
+ "cannot obtain directory type from package: %s",
+ packageName);
+ return null;
+ }
+ }
+
+ /** @return current cursor row represented as a {@link Directory}. */
+ public static Directory readDirectory(Context context, Cursor cursor) {
+ return new Directory(
+ cursor.getInt(ID),
+ cursor.getString(DISPLAY_NAME),
+ getDirectoryType(context, cursor),
+ cursor.getInt(PHOTO_SUPPORT) != 0);
+ }
+
+ private static Uri getContentUri() {
+ return VERSION.SDK_INT >= VERSION_CODES.N
+ ? ContactsContract.Directory.ENTERPRISE_CONTENT_URI
+ : ContactsContract.Directory.CONTENT_URI;
+ }
+
+ /** POJO representing the results returned from {@link RemoteDirectoriesCursorLoader}. */
+ public static class Directory {
+
+ public final int id;
+ // TODO(calderwoodra): investigate which of these fields will be used as the display name and
+ // update the fields and javadoc accordingly.
+ /** An optional name that can be used in the UI to represent the directory. */
+ @Nullable public final String name;
+
+ @Nullable public final String type;
+ public final boolean supportsPhotos;
+
+ public Directory(int id, String name, @Nullable String type, boolean supportsPhotos) {
+ this.id = id;
+ this.name = name;
+ this.type = type;
+ this.supportsPhotos = supportsPhotos;
+ }
+ }
+}