New Privacy settings screen and Backup settings toggle. See #2132044 & #2133178

Also fixes 2138367: Share with Google setting doesn't get updated on checking the setting
And 2098232: "Set unlock pattern" should be at the top of the section
This commit is contained in:
Amith Yamasani
2009-09-22 13:50:19 -07:00
parent 0ce6f6dbc8
commit e65c943f97
8 changed files with 366 additions and 132 deletions

View File

@@ -311,6 +311,19 @@
</intent-filter>
</activity>
<activity android:name="PrivacySettings"
android:label="@string/privacy_settings_title"
android:configChanges="orientation|keyboardHidden"
android:clearTaskOnLaunch="true"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.settings.PRIVACY_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.VOICE_LAUNCH" />
</intent-filter>
</activity>
<activity android:name="IccLockSettings" android:label="@string/sim_lock_settings"
android:process="com.android.phone">
<intent-filter>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -1177,9 +1177,9 @@
<!-- Security & location settings screen, setting summary when Assisted GPS check box is clear -->
<string name="assisted_gps_disabled">Use server to assist GPS (uncheck to improve GPS performance)</string>
<!-- Setting title for allow sending location to google -->
<string name="use_location_title">Share with Google</string>
<!-- Title of dialog to user requesting use of location information to improve services -->
<string name="use_location_summary">Allow Google to use location for improved search and other services</string>
<string name="use_location_title">Use My Location</string>
<!-- Setting summary for allowing Google to use location information for improved search results. -->
<string name="use_location_summary">Use My Location for Google search results and other Google services</string>
<!-- Message of dialog to user requesting use of location information -->
<string name="use_location_warning_message">Do you want to allow Google to use location for improved search results and other services?</string>
<!-- Agree -->
@@ -2091,4 +2091,22 @@ found in the list of installed applications.</string>
<string name="emergency_tone_title">Emergency tone</string>
<!-- Sound settings screen, setting option summary text -->
<string name="emergency_tone_summary">Set behavior when an emergency call is placed</string>
<!-- Privacy Settings screen --><skip/>
<!-- Privacy settings menu title -->
<string name="privacy_settings">Privacy</string>
<!-- Privacy settings activity title -->
<string name="privacy_settings_title">Privacy settings</string>
<!-- Location settings section title -->
<string name="location_section_title">Location</string>
<!-- Settings section title -->
<string name="settings_section_title">Settings</string>
<!-- Personal data section title -->
<string name="personal_data_section_title">Personal data</string>
<!-- Backup settings menu title -->
<string name="backup_settings_title">Back up my settings</string>
<!-- Dialog title for confirmation to erase backup data from server -->
<string name="backup_erase_dialog_title">Settings backup</string>
<!-- Dialog title for confirmation to erase backup data from server -->
<string name="backup_erase_dialog_message">Are you sure you want to stop backing up your settings and erase all copies on Google servers?</string>
</resources>

View File

@@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2009 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.
-->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:key="location_category"
android:title="@string/location_section_title">
<!-- Share location with Google -->
<CheckBoxPreference
android:key="use_location"
android:title="@string/use_location_title"
android:persistent="false"
android:summary="@string/use_location_summary"/>
</PreferenceCategory>
<PreferenceCategory android:key="settings_category"
android:title="@string/settings_section_title">
<!-- Backup settings -->
<CheckBoxPreference
android:key="backup_settings"
android:title="@string/backup_settings_title"
android:persistent="false" />
</PreferenceCategory>
<PreferenceCategory
android:title="@string/personal_data_section_title">
<!-- Factory reset -->
<PreferenceScreen
android:title="@string/master_clear_title"
android:summary="@string/master_clear_summary">
<intent android:action="android.intent.action.MAIN"
android:targetPackage="com.android.settings"
android:targetClass="com.android.settings.MasterClear" />
</PreferenceScreen>
</PreferenceCategory>
</PreferenceScreen>

View File

@@ -40,11 +40,6 @@
android:summaryOn="@string/assisted_gps_enabled"
android:summaryOff="@string/assisted_gps_disabled"/>
-->
<CheckBoxPreference
android:key="use_location"
android:title="@string/use_location_title"
android:persistent="false"
android:summary="@string/use_location_summary"/>
</PreferenceCategory>

View File

@@ -50,7 +50,7 @@
android:targetClass="com.android.settings.SoundAndDisplaySettings" />
</com.android.settings.IconPreferenceScreen>
<!-- Security & Privacy -->
<!-- Security & Location -->
<com.android.settings.IconPreferenceScreen
settings:icon="@drawable/ic_settings_security"
@@ -85,6 +85,18 @@
<intent android:action="android.settings.SYNC_SETTINGS" />
</com.android.settings.IconPreferenceScreen>
<!-- Privacy -->
<com.android.settings.IconPreferenceScreen
settings:icon="@drawable/ic_settings_privacy"
android:title="@string/privacy_settings"
android:key="privacy_settings">
<intent
android:action="android.intent.action.MAIN"
android:targetPackage="com.android.settings"
android:targetClass="com.android.settings.PrivacySettings" />
</com.android.settings.IconPreferenceScreen>
<!-- Storage -->
<com.android.settings.IconPreferenceScreen

View File

@@ -0,0 +1,260 @@
/*
* Copyright (C) 2009 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;
import android.app.AlertDialog;
import android.app.Dialog;
import android.backup.IBackupManager;
import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.preference.CheckBoxPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceScreen;
import android.provider.Settings;
import android.text.method.LinkMovementMethod;
import android.widget.TextView;
/**
* Gesture lock pattern settings.
*/
public class PrivacySettings extends PreferenceActivity implements
DialogInterface.OnDismissListener, DialogInterface.OnClickListener {
private static final String PREFS_NAME = "location_prefs";
private static final String PREFS_USE_LOCATION = "use_location";
// Vendor specific
private static final String GSETTINGS_PROVIDER = "com.google.android.providers.settings";
private static final String LOCATION_CATEGORY = "location_category";
private static final String SETTINGS_CATEGORY = "settings_category";
private static final String USE_LOCATION = "use_location";
private static final String BACKUP_SETTINGS = "backup_settings";
private static final String KEY_DONE_USE_LOCATION = "doneLocation";
private CheckBoxPreference mUseLocation;
private CheckBoxPreference mBackup;
private boolean mOkClicked;
private Dialog mConfirmDialog;
private static final int DIALOG_USE_LOCATION = 1;
private static final int DIALOG_ERASE_BACKUP = 2;
private int mDialogType;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.privacy_settings);
mUseLocation = (CheckBoxPreference) getPreferenceScreen().findPreference(USE_LOCATION);
mBackup = (CheckBoxPreference) getPreferenceScreen().findPreference(BACKUP_SETTINGS);
// Vendor specific
try {
if (mUseLocation != null) {
getPackageManager().getPackageInfo(GSETTINGS_PROVIDER, 0);
}
} catch (NameNotFoundException nnfe) {
getPreferenceScreen().removePreference(findPreference(LOCATION_CATEGORY));
getPreferenceScreen().removePreference(findPreference(SETTINGS_CATEGORY));
}
updateToggles();
boolean doneUseLocation = savedInstanceState == null
? false : savedInstanceState.getBoolean(KEY_DONE_USE_LOCATION, true);
if (!doneUseLocation && (getIntent().getBooleanExtra("SHOW_USE_LOCATION", false)
|| savedInstanceState != null)) {
showUseLocationDialog(true);
}
}
@Override
public void onStop() {
if (mConfirmDialog != null && mConfirmDialog.isShowing()) {
mConfirmDialog.dismiss();
}
mConfirmDialog = null;
mDialogType = 0;
super.onStop();
}
@Override
public void onSaveInstanceState(Bundle icicle) {
if (mConfirmDialog != null && mConfirmDialog.isShowing()
&& mDialogType == DIALOG_USE_LOCATION) {
icicle.putBoolean(KEY_DONE_USE_LOCATION, false);
}
super.onSaveInstanceState(icicle);
}
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
Preference preference) {
if (preference == mUseLocation) {
//normally called on the toggle click
if (mUseLocation.isChecked()) {
showUseLocationDialog(false);
} else {
updateUseLocation();
}
} else if (preference == mBackup) {
if (!mBackup.isChecked()) {
showEraseBackupDialog();
} else {
setBackupEnabled(true);
}
}
return false;
}
private void showUseLocationDialog(boolean force) {
// Show a warning to the user that location data will be shared
mOkClicked = false;
if (force) {
mUseLocation.setChecked(true);
}
if (hasAgreedToUseLocation()) {
updateUseLocation();
return;
}
mDialogType = DIALOG_USE_LOCATION;
CharSequence msg = getResources().getText(R.string.use_location_warning_message);
mConfirmDialog = new AlertDialog.Builder(this).setMessage(msg)
.setTitle(R.string.use_location_title)
.setIcon(android.R.drawable.ic_dialog_alert)
.setPositiveButton(R.string.agree, this)
.setNegativeButton(R.string.disagree, this)
.show();
((TextView)mConfirmDialog.findViewById(android.R.id.message))
.setMovementMethod(LinkMovementMethod.getInstance());
mConfirmDialog.setOnDismissListener(this);
}
private void showEraseBackupDialog() {
// Show a warning to the user that location data will be shared
mOkClicked = false;
mBackup.setChecked(true);
mDialogType = DIALOG_ERASE_BACKUP;
CharSequence msg = getResources().getText(R.string.backup_erase_dialog_message);
mConfirmDialog = new AlertDialog.Builder(this).setMessage(msg)
.setTitle(R.string.backup_erase_dialog_title)
.setIcon(android.R.drawable.ic_dialog_alert)
.setPositiveButton(android.R.string.ok, this)
.setNegativeButton(android.R.string.cancel, this)
.show();
mConfirmDialog.setOnDismissListener(this);
}
/*
* Creates toggles for each available location provider
*/
private void updateToggles() {
ContentResolver res = getContentResolver();
mUseLocation.setChecked(Settings.Secure.getInt(res,
Settings.Secure.USE_LOCATION_FOR_SERVICES, 2) == 1);
mBackup.setChecked(Settings.Secure.getInt(res,
Settings.Secure.BACKUP_ENABLED, 0) == 1);
}
private void updateUseLocation() {
boolean use = mUseLocation.isChecked();
Settings.Secure.putInt(getContentResolver(),
Settings.Secure.USE_LOCATION_FOR_SERVICES, use ? 1 : 0);
}
public void onClick(DialogInterface dialog, int which) {
if (which == DialogInterface.BUTTON_POSITIVE) {
//updateProviders();
mOkClicked = true;
if (mDialogType == DIALOG_USE_LOCATION) {
setAgreedToUseLocation(true);
} else if (mDialogType == DIALOG_ERASE_BACKUP) {
setBackupEnabled(false);
}
} else {
if (mDialogType == DIALOG_USE_LOCATION) {
// Reset the toggle
mUseLocation.setChecked(false);
} else if (mDialogType == DIALOG_ERASE_BACKUP) {
mBackup.setChecked(true);
}
}
updateUseLocation();
mDialogType = 0;
}
public void onDismiss(DialogInterface dialog) {
// Assuming that onClick gets called first
if (!mOkClicked) {
if (mDialogType == DIALOG_USE_LOCATION) {
mUseLocation.setChecked(false);
}
}
}
/**
* Checks if the user has agreed to the dialog in the past.
*/
private boolean hasAgreedToUseLocation() {
SharedPreferences sp = getSharedPreferences(PREFS_NAME, 0);
if (sp == null) {
return false;
}
return sp.getBoolean(PREFS_USE_LOCATION, false);
}
/**
* Notes that the user has agreed to the dialog and won't need to be prompted in the
* future.
*/
private void setAgreedToUseLocation(boolean agreed) {
if (agreed) {
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean(PREFS_USE_LOCATION, true);
editor.commit();
}
}
/**
* Informs the BackupManager of a change in backup state - if backup is disabled,
* the data on the server will be erased.
* @param enable whether to enable backup
*/
private void setBackupEnabled(boolean enable) {
IBackupManager bm = IBackupManager.Stub.asInterface(
ServiceManager.getService(Context.BACKUP_SERVICE));
if (bm != null) {
try {
bm.setBackupEnabled(enable);
} catch (RemoteException e) {
mBackup.setChecked(!enable);
return;
}
}
mBackup.setChecked(enable);
}
}

View File

@@ -59,8 +59,7 @@ import java.util.Observer;
/**
* Gesture lock pattern settings.
*/
public class SecuritySettings extends PreferenceActivity implements
DialogInterface.OnDismissListener, DialogInterface.OnClickListener {
public class SecuritySettings extends PreferenceActivity {
// Lock Settings
@@ -96,14 +95,6 @@ public class SecuritySettings extends PreferenceActivity implements
private CstorHelper mCstorHelper = new CstorHelper();
// Vendor specific
private static final String GSETTINGS_PROVIDER = "com.google.android.providers.settings";
private static final String USE_LOCATION = "use_location";
private static final String KEY_DONE_USE_LOCATION = "doneLocation";
private CheckBoxPreference mUseLocation;
private boolean mOkClicked;
private Dialog mUseLocationDialog;
private CheckBoxPreference mNetwork;
private CheckBoxPreference mGps;
private CheckBoxPreference mAssistedGps;
@@ -130,17 +121,7 @@ public class SecuritySettings extends PreferenceActivity implements
mNetwork = (CheckBoxPreference) getPreferenceScreen().findPreference(LOCATION_NETWORK);
mGps = (CheckBoxPreference) getPreferenceScreen().findPreference(LOCATION_GPS);
mAssistedGps = (CheckBoxPreference) getPreferenceScreen().findPreference(ASSISTED_GPS);
mUseLocation = (CheckBoxPreference) getPreferenceScreen().findPreference(USE_LOCATION);
// Vendor specific
try {
if (mUseLocation != null
&& getPackageManager().getPackageInfo(GSETTINGS_PROVIDER, 0) == null) {
((PreferenceGroup)findPreference(LOCATION_CATEGORY))
.removePreference(mUseLocation);
}
} catch (NameNotFoundException nnfe) {
}
updateToggles();
// listen for Location Manager settings changes
@@ -150,12 +131,6 @@ public class SecuritySettings extends PreferenceActivity implements
null);
mContentQueryMap = new ContentQueryMap(settingsCursor, Settings.System.NAME, true, null);
mContentQueryMap.addObserver(new SettingsObserver());
boolean doneUseLocation = savedInstanceState == null
? false : savedInstanceState.getBoolean(KEY_DONE_USE_LOCATION, true);
if (!doneUseLocation && (getIntent().getBooleanExtra("SHOW_USE_LOCATION", false)
|| savedInstanceState != null)) {
showUseLocationDialog(true);
}
mCstorHelper.handleIntent(getIntent());
}
@@ -169,6 +144,14 @@ public class SecuritySettings extends PreferenceActivity implements
inlinePrefCat.setTitle(R.string.lock_settings_title);
root.addPreference(inlinePrefCat);
// change pattern lock
Intent intent = new Intent();
intent.setClassName("com.android.settings",
"com.android.settings.ChooseLockPatternTutorial");
mChoosePattern = getPreferenceManager().createPreferenceScreen(this);
mChoosePattern.setIntent(intent);
inlinePrefCat.addPreference(mChoosePattern);
// autolock toggle
mLockEnabled = new LockEnabledPref(this);
mLockEnabled.setTitle(R.string.lockpattern_settings_enable_title);
@@ -188,14 +171,6 @@ public class SecuritySettings extends PreferenceActivity implements
mTactileFeedback.setTitle(R.string.lockpattern_settings_enable_tactile_feedback_title);
inlinePrefCat.addPreference(mTactileFeedback);
// change pattern lock
Intent intent = new Intent();
intent.setClassName("com.android.settings",
"com.android.settings.ChooseLockPatternTutorial");
mChoosePattern = getPreferenceManager().createPreferenceScreen(this);
mChoosePattern.setIntent(intent);
inlinePrefCat.addPreference(mChoosePattern);
int activePhoneType = TelephonyManager.getDefault().getPhoneType();
// do not display SIM lock for CDMA phone
@@ -258,23 +233,6 @@ public class SecuritySettings extends PreferenceActivity implements
Settings.System.TEXT_SHOW_PASSWORD, 1) != 0);
}
@Override
public void onStop() {
if (mUseLocationDialog != null && mUseLocationDialog.isShowing()) {
mUseLocationDialog.dismiss();
}
mUseLocationDialog = null;
super.onStop();
}
@Override
public void onSaveInstanceState(Bundle icicle) {
if (mUseLocationDialog != null && mUseLocationDialog.isShowing()) {
icicle.putBoolean(KEY_DONE_USE_LOCATION, false);
}
super.onSaveInstanceState(icicle);
}
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
Preference preference) {
@@ -302,13 +260,6 @@ public class SecuritySettings extends PreferenceActivity implements
} else if (preference == mAssistedGps) {
Settings.Secure.putInt(getContentResolver(), Settings.Secure.ASSISTED_GPS_ENABLED,
mAssistedGps.isChecked() ? 1 : 0);
} else if (preference == mUseLocation) {
//normally called on the toggle click
if (mUseLocation.isChecked()) {
showUseLocationDialog(false);
} else {
updateUseLocation();
}
}
return false;
@@ -319,27 +270,6 @@ public class SecuritySettings extends PreferenceActivity implements
startActivity(intent);
}
private void showUseLocationDialog(boolean force) {
// Show a warning to the user that location data will be shared
mOkClicked = false;
if (force) {
mUseLocation.setChecked(true);
}
if (hasAgreedToUseLocation()) return;
CharSequence msg = getResources().getText(R.string.use_location_warning_message);
mUseLocationDialog = new AlertDialog.Builder(this).setMessage(msg)
.setTitle(R.string.use_location_title)
.setIcon(android.R.drawable.ic_dialog_alert)
.setPositiveButton(R.string.agree, this)
.setNegativeButton(R.string.disagree, this)
.show();
((TextView)mUseLocationDialog.findViewById(android.R.id.message))
.setMovementMethod(LinkMovementMethod.getInstance());
mUseLocationDialog.setOnDismissListener(this);
}
/*
* Creates toggles for each available location provider
*/
@@ -355,20 +285,12 @@ public class SecuritySettings extends PreferenceActivity implements
Settings.Secure.ASSISTED_GPS_ENABLED, 2) == 1);
mAssistedGps.setEnabled(gpsEnabled);
}
mUseLocation.setChecked(Settings.Secure.getInt(res,
Settings.Secure.USE_LOCATION_FOR_SERVICES, 2) == 1);
}
private boolean isToggled(Preference pref) {
return ((CheckBoxPreference) pref).isChecked();
}
private void updateUseLocation() {
boolean use = mUseLocation.isChecked();
Settings.Secure.putInt(getContentResolver(),
Settings.Secure.USE_LOCATION_FOR_SERVICES, use ? 1 : 0);
}
/**
* For the user to disable keyguard, we first make them verify their
* existing pattern.
@@ -415,25 +337,6 @@ public class SecuritySettings extends PreferenceActivity implements
}
}
public void onClick(DialogInterface dialog, int which) {
if (which == DialogInterface.BUTTON_POSITIVE) {
//updateProviders();
mOkClicked = true;
setAgreedToUseLocation(true);
} else {
// Reset the toggle
mUseLocation.setChecked(false);
}
updateUseLocation();
}
public void onDismiss(DialogInterface dialog) {
// Assuming that onClick gets called first
if (!mOkClicked) {
mUseLocation.setChecked(false);
}
}
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
@@ -452,23 +355,6 @@ public class SecuritySettings extends PreferenceActivity implements
}
}
private boolean hasAgreedToUseLocation() {
SharedPreferences sp = getSharedPreferences(PREFS_NAME, 0);
if (sp == null) {
return false;
}
return sp.getBoolean(PREFS_USE_LOCATION, false);
}
private void setAgreedToUseLocation(boolean agreed) {
if (agreed) {
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean(PREFS_USE_LOCATION, true);
editor.commit();
}
}
private class CstorHelper implements DialogInterface.OnClickListener,
DialogInterface.OnDismissListener {
private KeyStore mKeyStore = KeyStore.getInstance();