Disable factory reset for secondary users
Search in Settings makes it possible to find the factory reset screen. Disable the search index in PrivacySettings so that backup and reset keywords don't get indexed for secondary users. Also add additional safeguards for other entry points such as public intents, so that the backup/reset screen does not show any options. Bug: 18076086 Change-Id: Ie5135fbf4084038c99947a1a107ab4758f0c15a9
This commit is contained in:
@@ -28,6 +28,7 @@ import android.content.res.Resources;
|
|||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
|
import android.os.Process;
|
||||||
import android.os.SystemProperties;
|
import android.os.SystemProperties;
|
||||||
import android.os.UserManager;
|
import android.os.UserManager;
|
||||||
import android.preference.Preference;
|
import android.preference.Preference;
|
||||||
@@ -234,7 +235,8 @@ public class MasterClear extends Fragment {
|
|||||||
@Override
|
@Override
|
||||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||||
Bundle savedInstanceState) {
|
Bundle savedInstanceState) {
|
||||||
if (UserManager.get(getActivity()).hasUserRestriction(
|
if (!Process.myUserHandle().isOwner()
|
||||||
|
|| UserManager.get(getActivity()).hasUserRestriction(
|
||||||
UserManager.DISALLOW_FACTORY_RESET)) {
|
UserManager.DISALLOW_FACTORY_RESET)) {
|
||||||
return inflater.inflate(R.layout.master_clear_disallowed_screen, null);
|
return inflater.inflate(R.layout.master_clear_disallowed_screen, null);
|
||||||
}
|
}
|
||||||
|
@@ -24,15 +24,24 @@ import android.content.Context;
|
|||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.os.Process;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.os.ServiceManager;
|
import android.os.ServiceManager;
|
||||||
|
import android.os.UserHandle;
|
||||||
import android.os.UserManager;
|
import android.os.UserManager;
|
||||||
import android.preference.Preference;
|
import android.preference.Preference;
|
||||||
import android.preference.Preference.OnPreferenceChangeListener;
|
import android.preference.Preference.OnPreferenceChangeListener;
|
||||||
import android.preference.PreferenceScreen;
|
import android.preference.PreferenceScreen;
|
||||||
import android.preference.SwitchPreference;
|
import android.preference.SwitchPreference;
|
||||||
|
import android.provider.SearchIndexableResource;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
|
|
||||||
|
import com.android.settings.search.BaseSearchIndexProvider;
|
||||||
|
import com.android.settings.search.Indexable.SearchIndexProvider;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gesture lock pattern settings.
|
* Gesture lock pattern settings.
|
||||||
*/
|
*/
|
||||||
@@ -51,6 +60,7 @@ public class PrivacySettings extends SettingsPreferenceFragment implements
|
|||||||
private SwitchPreference mAutoRestore;
|
private SwitchPreference mAutoRestore;
|
||||||
private Dialog mConfirmDialog;
|
private Dialog mConfirmDialog;
|
||||||
private PreferenceScreen mConfigure;
|
private PreferenceScreen mConfigure;
|
||||||
|
private boolean mEnabled;
|
||||||
|
|
||||||
private static final int DIALOG_ERASE_BACKUP = 2;
|
private static final int DIALOG_ERASE_BACKUP = 2;
|
||||||
private int mDialogType;
|
private int mDialogType;
|
||||||
@@ -58,9 +68,14 @@ public class PrivacySettings extends SettingsPreferenceFragment implements
|
|||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
// Don't allow any access if this is a secondary user
|
||||||
|
mEnabled = Process.myUserHandle().isOwner();
|
||||||
|
if (!mEnabled) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
addPreferencesFromResource(R.xml.privacy_settings);
|
addPreferencesFromResource(R.xml.privacy_settings);
|
||||||
final PreferenceScreen screen = getPreferenceScreen();
|
final PreferenceScreen screen = getPreferenceScreen();
|
||||||
|
|
||||||
mBackupManager = IBackupManager.Stub.asInterface(
|
mBackupManager = IBackupManager.Stub.asInterface(
|
||||||
ServiceManager.getService(Context.BACKUP_SERVICE));
|
ServiceManager.getService(Context.BACKUP_SERVICE));
|
||||||
|
|
||||||
@@ -90,7 +105,9 @@ public class PrivacySettings extends SettingsPreferenceFragment implements
|
|||||||
super.onResume();
|
super.onResume();
|
||||||
|
|
||||||
// Refresh UI
|
// Refresh UI
|
||||||
updateToggles();
|
if (mEnabled) {
|
||||||
|
updateToggles();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -233,4 +250,40 @@ public class PrivacySettings extends SettingsPreferenceFragment implements
|
|||||||
protected int getHelpResource() {
|
protected int getHelpResource() {
|
||||||
return R.string.help_url_backup_reset;
|
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_OWNER;
|
||||||
|
}
|
||||||
|
|
||||||
|
@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
|
||||||
|
if (!mIsPrimary) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
SearchIndexableResource sir = new SearchIndexableResource(context);
|
||||||
|
sir.xmlResId = R.xml.privacy_settings;
|
||||||
|
result.add(sir);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@@ -224,7 +224,7 @@ public final class SearchIndexableResources {
|
|||||||
sResMap.put(PrivacySettings.class.getName(),
|
sResMap.put(PrivacySettings.class.getName(),
|
||||||
new SearchIndexableResource(
|
new SearchIndexableResource(
|
||||||
Ranking.getRankForClassName(PrivacySettings.class.getName()),
|
Ranking.getRankForClassName(PrivacySettings.class.getName()),
|
||||||
R.xml.privacy_settings,
|
NO_DATA_RES_ID,
|
||||||
PrivacySettings.class.getName(),
|
PrivacySettings.class.getName(),
|
||||||
R.drawable.ic_settings_backup));
|
R.drawable.ic_settings_backup));
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user