diff options
author | calderwoodra <calderwoodra@google.com> | 2017-07-25 16:19:03 -0700 |
---|---|---|
committer | Eric Erfanian <erfanian@google.com> | 2017-07-26 09:00:19 -0700 |
commit | a8085783721fbeb26b4d58eaffabf7cbb8d4f90a (patch) | |
tree | 5e1c4c9f82aeef62deb17393d6168608ed2212e1 | |
parent | 753904d60efa39c4aed3c3a3688ceee8d8d730e5 (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
-rw-r--r-- | java/com/android/dialer/searchfragment/remote/RemoteDirectoriesCursorLoader.java | 117 |
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; + } + } +} |