OSDN Git Service

Fix search results for backup settings.
authorAnton Philippov <philippov@google.com>
Wed, 1 Mar 2017 21:08:56 +0000 (21:08 +0000)
committerAnton Philippov <philippov@google.com>
Fri, 3 Mar 2017 12:49:40 +0000 (12:49 +0000)
Make BackupSettingsAcitivity searchable and remove PrivacySettings from
the search index.

Bug: 35720213
Test: make RunSettingsRoboTests -j40
Change-Id: Id2e091c978e4da078dcc6bc57760ec830e439c0c

res/values/strings.xml
src/com/android/settings/PrivacySettings.java
src/com/android/settings/backup/BackupSettingsActivity.java
src/com/android/settings/backup/BackupSettingsFragment.java
src/com/android/settings/search/SearchIndexableResources.java
tests/robotests/src/com/android/settings/backup/BackupSettingsActivityTest.java

index 71fd094..821c7fe 100644 (file)
     <string name="keywords_unification">work profile, managed profile, unify, unification, work, profile</string>
     <string name="keywords_gesture">gesture</string>
     <string name="keywords_payment_settings">pay, tap, payments</string>
+    <string name="keywords_backup">backup, back up</string>
 
     <!-- NFC Wi-Fi pairing/setup strings-->
 
index e9d810a..a44e182 100644 (file)
@@ -50,7 +50,7 @@ import java.util.Set;
 /**
  * Gesture lock pattern settings.
  */
-public class PrivacySettings extends SettingsPreferenceFragment implements Indexable {
+public class PrivacySettings extends SettingsPreferenceFragment {
 
     // Vendor specific
     private static final String GSETTINGS_PROVIDER = "com.google.settings";
@@ -225,49 +225,6 @@ public class PrivacySettings extends SettingsPreferenceFragment implements Index
         return R.string.help_url_backup_reset;
     }
 
-    /**
-     * For Search.
-     */
-    public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
-            new PrivacySearchIndexProvider();
-
-    private static class PrivacySearchIndexProvider extends BaseSearchIndexProvider {
-
-        boolean mIsPrimary;
-
-        public PrivacySearchIndexProvider() {
-            super();
-
-            mIsPrimary = UserHandle.myUserId() == UserHandle.USER_SYSTEM;
-        }
-
-        @Override
-        public List<SearchIndexableResource> getXmlResourcesToIndex(
-                Context context, boolean enabled) {
-
-            List<SearchIndexableResource> result = new ArrayList<SearchIndexableResource>();
-
-            // For non-primary user, no backup or reset is available
-            // TODO: http://b/22388012
-            if (!mIsPrimary) {
-                return result;
-            }
-
-            SearchIndexableResource sir = new SearchIndexableResource(context);
-            sir.xmlResId = R.xml.privacy_settings;
-            result.add(sir);
-
-            return result;
-        }
-
-        @Override
-        public List<String> getNonIndexableKeys(Context context) {
-            final List<String> nonVisibleKeys = new ArrayList<>();
-            getNonVisibleKeys(context, nonVisibleKeys);
-            return nonVisibleKeys;
-        }
-    }
-
     private static void getNonVisibleKeys(Context context, Collection<String> nonVisibleKeys) {
         final IBackupManager backupManager = IBackupManager.Stub.asInterface(
                 ServiceManager.getService(Context.BACKUP_SERVICE));
index f5c7ff8..f8bab3d 100644 (file)
@@ -18,18 +18,29 @@ package com.android.settings.backup;
 
 import android.app.Activity;
 import android.app.FragmentManager;
+import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.os.Bundle;
+import android.os.UserHandle;
 import android.support.annotation.VisibleForTesting;
 import android.util.Log;
 
+import com.android.settings.R;
+
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.search.Indexable;
+import com.android.settings.search.SearchIndexableRaw;
+
+import java.util.ArrayList;
+import java.util.List;
+
 
 /**
  * The activity used to launch the configured Backup activity or the preference screen
  * if the manufacturer provided their backup settings.
  */
-public class BackupSettingsActivity extends Activity {
+public class BackupSettingsActivity extends Activity implements Indexable {
     private static final String TAG = "BackupSettingsActivity";
     private FragmentManager mFragmentManager;
 
@@ -68,6 +79,52 @@ public class BackupSettingsActivity extends Activity {
         }
     }
 
+    /**
+     * For Search.
+     */
+    public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+            new BaseSearchIndexProvider() {
+                private static final String BACKUP_SEARCH_INDEX_KEY = "backup";
+
+                @Override
+                public List<SearchIndexableRaw> getRawDataToIndex(Context context,
+                        boolean enabled) {
+
+                    final List<SearchIndexableRaw> result = new ArrayList<>();
+
+                    // Add the activity title
+                    SearchIndexableRaw data = new SearchIndexableRaw(context);
+                    data.title = context.getResources().getString(R.string.privacy_settings_title);
+                    data.screenTitle = context.getResources().getString(
+                            R.string.privacy_settings_title);
+                    data.keywords = context.getResources().getString(
+                            R.string.keywords_backup);
+                    data.intentTargetPackage = context.getPackageName();
+                    data.intentTargetClass = BackupSettingsActivity.class.getName();
+                    data.intentAction = "android.intent.action.MAIN";
+                    data.key = BACKUP_SEARCH_INDEX_KEY;
+                    result.add(data);
+
+                    return result;
+                }
+
+                @Override
+                public List<String> getNonIndexableKeys(Context context) {
+                    final List<String> keys = new ArrayList<String>();
+
+                    // For non-primary user, no backup is available, so don't show it in search
+                    // TODO: http://b/22388012
+                    if (UserHandle.myUserId() != UserHandle.USER_SYSTEM) {
+                        if (Log.isLoggable(TAG, Log.DEBUG)) {
+                            Log.d(TAG, "Not a system user, not indexing the screen");
+                        }
+                        keys.add(BACKUP_SEARCH_INDEX_KEY);
+                    }
+
+                    return keys;
+                }
+            };
+
     @VisibleForTesting
     void setFragmentManager(FragmentManager fragmentManager) {
         mFragmentManager = fragmentManager;
index dcc1608..a451272 100644 (file)
@@ -18,11 +18,6 @@ package com.android.settings.backup;
 
 import android.content.Context;
 import android.os.Bundle;
-import android.provider.SearchIndexableResource;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
-import android.util.Log;
-
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
@@ -32,7 +27,6 @@ import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 
 /**
@@ -72,15 +66,10 @@ public class BackupSettingsFragment extends DashboardFragment {
         return controllers;
     }
 
+    // The intention is to index {@link BackupSettingsActivity} instead of the fragments,
+    // therefore leaving this index provider empty.
     public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider() {
-                @Override
-                public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
-                        boolean enabled) {
-                    final SearchIndexableResource sir = new SearchIndexableResource(context);
-                    sir.xmlResId = R.xml.backup_settings;
-                    return Arrays.asList(sir);
-                }
             };
 
     @Override
index 1968c7a..076e6c0 100644 (file)
@@ -38,6 +38,7 @@ import com.android.settings.applications.AdvancedAppSettings;
 import com.android.settings.applications.AppAndNotificationDashboardFragment;
 import com.android.settings.applications.SpecialAccessSettings;
 import com.android.settings.applications.assist.ManageAssist;
+import com.android.settings.backup.BackupSettingsActivity;
 import com.android.settings.backup.BackupSettingsFragment;
 import com.android.settings.bluetooth.BluetoothSettings;
 import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
@@ -162,7 +163,7 @@ public final class SearchIndexableResources {
         addIndex(AvailableVirtualKeyboardFragment.class,
                 NO_DATA_RES_ID, R.drawable.ic_settings_language);
         addIndex(PhysicalKeyboardFragment.class, NO_DATA_RES_ID, R.drawable.ic_settings_language);
-        addIndex(PrivacySettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_backup);
+        addIndex(BackupSettingsActivity.class, NO_DATA_RES_ID, R.drawable.ic_settings_backup);
         addIndex(BackupSettingsFragment.class, NO_DATA_RES_ID, R.drawable.ic_settings_backup);
         addIndex(DateTimeSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_date_time);
         addIndex(AccessibilitySettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_accessibility);
index d6dab55..ae67b04 100644 (file)
@@ -20,8 +20,6 @@ import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyInt;
 import static org.mockito.Matchers.isA;
 import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.robolectric.Shadows.shadowOf;
 
@@ -29,16 +27,16 @@ import android.app.Application;
 import android.app.Fragment;
 import android.app.FragmentManager;
 import android.app.FragmentTransaction;
-import android.app.backup.IBackupManager;
 import android.content.ComponentName;
-import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
-import android.os.IBinder;
+import android.os.UserHandle;
 
 import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
+import com.android.settings.search.SearchIndexableRaw;
 
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -49,16 +47,20 @@ import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
 import org.robolectric.res.builder.RobolectricPackageManager;
 import org.robolectric.util.ActivityController;
 import org.robolectric.shadows.ShadowActivity;
 
 import static com.google.common.truth.Truth.assertThat;
 
+import java.util.List;
+
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
-        shadows = {BackupSettingsActivityTest.ShadowBackupSettingsHelper.class})
+        shadows = {BackupSettingsActivityTest.ShadowBackupSettingsHelper.class,
+                BackupSettingsActivityTest.ShadowUserHandle.class})
 public class BackupSettingsActivityTest {
     private ActivityController<BackupSettingsActivity> mActivityController;
     private BackupSettingsActivity mActivity;
@@ -85,7 +87,6 @@ public class BackupSettingsActivityTest {
         mActivity = mActivityController.get();
         mPackageManager = (RobolectricPackageManager) mApplication.getPackageManager();
         doReturn(mComponent).when(mIntent).getComponent();
-
     }
 
     @Test
@@ -124,6 +125,41 @@ public class BackupSettingsActivityTest {
 
     }
 
+    @Test
+    public void getNonIndexableKeys_SystemUser() {
+        final List<SearchIndexableRaw> indexableRaws =
+                BackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex(
+                        mApplication.getApplicationContext(), true);
+        final List<String> nonIndexableKeys =
+                BackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(
+                        mApplication.getApplicationContext());
+
+        assertThat(indexableRaws).isNotNull();
+        assertThat(indexableRaws).isNotEmpty();
+        assertThat(nonIndexableKeys).isEmpty();
+    }
+
+    @Test
+    public void getNonIndexableKeys_NonSystemUser() {
+        ShadowUserHandle.setUid(1); // Non-SYSTEM user.
+
+        final List<SearchIndexableRaw> indexableRaws =
+                BackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex(
+                        mApplication.getApplicationContext(), true);
+        final List<String> nonIndexableKeys =
+                BackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(
+                        mApplication.getApplicationContext());
+
+        assertThat(indexableRaws).isNotNull();
+        assertThat(indexableRaws).isNotEmpty();
+        assertThat(nonIndexableKeys).isNotEmpty();
+    }
+
+    @After
+    public void resetShadows() {
+        ShadowUserHandle.reset();
+    }
+
     @Implements(BackupSettingsHelper.class)
     public static class ShadowBackupSettingsHelper {
         @Implementation
@@ -136,4 +172,23 @@ public class BackupSettingsActivityTest {
             return mIsBackupProvidedByOEM;
         }
     }
+
+    @Implements(UserHandle.class)
+    public static class ShadowUserHandle {
+        private static int sUid = 0; // SYSTEM by default
+
+        public static void setUid(int uid) {
+            sUid = uid;
+        }
+
+        @Implementation
+        public static int myUserId() {
+            return sUid;
+        }
+
+        @Resetter
+        public static void reset() {
+            sUid = 0;
+        }
+    }
 }