diff --git a/res/values/strings.xml b/res/values/strings.xml index 71fd0947d92..821c7fe2db9 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -6068,6 +6068,7 @@ work profile, managed profile, unify, unification, work, profile gesture pay, tap, payments + backup, back up diff --git a/src/com/android/settings/PrivacySettings.java b/src/com/android/settings/PrivacySettings.java index e9d810a25b9..a44e18253f0 100644 --- a/src/com/android/settings/PrivacySettings.java +++ b/src/com/android/settings/PrivacySettings.java @@ -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 getXmlResourcesToIndex( - Context context, boolean enabled) { - - List result = new ArrayList(); - - // 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 getNonIndexableKeys(Context context) { - final List nonVisibleKeys = new ArrayList<>(); - getNonVisibleKeys(context, nonVisibleKeys); - return nonVisibleKeys; - } - } - private static void getNonVisibleKeys(Context context, Collection nonVisibleKeys) { final IBackupManager backupManager = IBackupManager.Stub.asInterface( ServiceManager.getService(Context.BACKUP_SERVICE)); diff --git a/src/com/android/settings/backup/BackupSettingsActivity.java b/src/com/android/settings/backup/BackupSettingsActivity.java index f5c7ff83b44..f8bab3d3c70 100644 --- a/src/com/android/settings/backup/BackupSettingsActivity.java +++ b/src/com/android/settings/backup/BackupSettingsActivity.java @@ -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 getRawDataToIndex(Context context, + boolean enabled) { + + final List 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 getNonIndexableKeys(Context context) { + final List keys = new ArrayList(); + + // 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; diff --git a/src/com/android/settings/backup/BackupSettingsFragment.java b/src/com/android/settings/backup/BackupSettingsFragment.java index dcc160828a5..a4512724638 100644 --- a/src/com/android/settings/backup/BackupSettingsFragment.java +++ b/src/com/android/settings/backup/BackupSettingsFragment.java @@ -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 getXmlResourcesToIndex(Context context, - boolean enabled) { - final SearchIndexableResource sir = new SearchIndexableResource(context); - sir.xmlResId = R.xml.backup_settings; - return Arrays.asList(sir); - } }; @Override diff --git a/src/com/android/settings/search/SearchIndexableResources.java b/src/com/android/settings/search/SearchIndexableResources.java index 1968c7aff6f..076e6c0804d 100644 --- a/src/com/android/settings/search/SearchIndexableResources.java +++ b/src/com/android/settings/search/SearchIndexableResources.java @@ -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); diff --git a/tests/robotests/src/com/android/settings/backup/BackupSettingsActivityTest.java b/tests/robotests/src/com/android/settings/backup/BackupSettingsActivityTest.java index d6dab55990c..ae67b04f13b 100644 --- a/tests/robotests/src/com/android/settings/backup/BackupSettingsActivityTest.java +++ b/tests/robotests/src/com/android/settings/backup/BackupSettingsActivityTest.java @@ -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 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 indexableRaws = + BackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex( + mApplication.getApplicationContext(), true); + final List 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 indexableRaws = + BackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex( + mApplication.getApplicationContext(), true); + final List 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; + } + } }