<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-->
/**
* 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";
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));
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;
}
}
+ /**
+ * 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;
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;
import com.android.settings.search.Indexable;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
/**
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
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;
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);
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;
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;
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;
mActivity = mActivityController.get();
mPackageManager = (RobolectricPackageManager) mApplication.getPackageManager();
doReturn(mComponent).when(mIntent).getComponent();
-
}
@Test
}
+ @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
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;
+ }
+ }
}