[Multi-user] Change Backup Settings page to support multi-user.

With multi-user backup, backup will be available or secondary users and profiles too.

1. When there are profile users, this CL changes UI flow A to B
A. Settings Homepage -> System -> Google Backup Settings for primary user
to
B. Settings Homepage -> System -> Profile Select Dialog -> Google Backup Settings for chosen profile.
Change done as per https://g3doc.corp.google.com/company/teams/apps-android-settings/howto/ia.md?cl=head
2. Functionality remains the same when there are no profiles (BackupSettingsHelper, BackupSettingsContentProvider)
3.  Also, enabled Backup Settings for secondary users. (Previously, backup settings were only shown for
system user).(SettingsGateway)

Bug: 121198738

Test: 1) System -> Backup -> shows Profile Select Dialog -> Backup page for selected profile
2) On secondary user without profile, System -> Backup (with summary) -> Backup page for secondary user.

Change-Id: I6e21279978a5dfc6eca6f5a34bbfc15a34eac68b
This commit is contained in:
Chandan Nath
2019-01-28 21:15:13 +00:00
parent d3be363004
commit 0bfef63812
13 changed files with 179 additions and 249 deletions

View File

@@ -0,0 +1,128 @@
/*
* 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.settings.backup;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import com.android.settings.R;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.Indexable;
import com.android.settings.search.SearchIndexableRaw;
import com.android.settingslib.search.SearchIndexable;
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.
* Pre-Q, BackupSettingsActivity was disabled for non-system users. Therefore, for phones which
* upgrade to Q, BackupSettingsActivity is disabled for those users. However, we cannot simply
* enable it in Q since component enable can only be done by the user itself; which is not
* enough in Q we want it to be enabled for all profile users of the user.
* Therefore, as a simple workaround, we use a new class which is enabled by default.
*/
@SearchIndexable
public class UserBackupSettingsActivity extends FragmentActivity implements Indexable {
private static final String TAG = "BackupSettingsActivity";
private FragmentManager mFragmentManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
BackupSettingsHelper backupHelper = new BackupSettingsHelper(this);
if (!backupHelper.isBackupProvidedByManufacturer()) {
// If manufacturer specific backup settings are not provided then launch
// the backup settings provided by backup transport or the default one directly.
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG,
"No manufacturer settings found, launching the backup settings directly");
}
Intent intent = backupHelper.getIntentForBackupSettings();
try {
// enable the activity before launching it
getPackageManager().setComponentEnabledSetting(
intent.getComponent(),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
} catch (SecurityException e) {
Log.w(TAG, "Trying to enable activity " + intent.getComponent() + " but couldn't: "
+ e.getMessage());
// the activity may already be enabled
}
// use startActivityForResult to let the activity check the caller signature
startActivityForResult(intent, 1);
finish();
} else {
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "Manufacturer provided backup settings, showing the preference screen");
}
// mFragmentManager can be set by {@link #setFragmentManager()} for testing
if (mFragmentManager == null) {
mFragmentManager = getSupportFragmentManager();
}
mFragmentManager.beginTransaction()
.replace(android.R.id.content, new BackupSettingsFragment())
.commit();
}
}
/**
* 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.getString(R.string.privacy_settings_title);
data.screenTitle = context.getString(R.string.settings_label);
data.keywords = context.getString(R.string.keywords_backup);
data.intentTargetPackage = context.getPackageName();
data.intentTargetClass = com.android.settings.backup.UserBackupSettingsActivity.class.getName();
data.intentAction = Intent.ACTION_MAIN;
data.key = BACKUP_SEARCH_INDEX_KEY;
result.add(data);
return result;
}
};
@VisibleForTesting
void setFragmentManager(FragmentManager fragmentManager) {
mFragmentManager = fragmentManager;
}
}