Merge "Move PowerWhitelistBackend to SettingsLib"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 0418d51..4beaf8f 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -178,7 +178,6 @@
</activity>
<activity android:name=".Settings$ConnectedDeviceDashboardActivity"
- android:enabled="false"
android:taskAffinity="com.android.settings"
android:label="@string/connected_devices_dashboard_title"
android:icon="@drawable/ic_devices_other"
@@ -204,6 +203,7 @@
</activity>
<activity android:name=".Settings$ConnectedDeviceDashboardActivityOld"
+ android:enabled="false"
android:taskAffinity="com.android.settings"
android:label="@string/connected_devices_dashboard_title"
android:icon="@drawable/ic_devices_other"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 694a1b0..4a8e7e3 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4353,6 +4353,8 @@
<string name="accessibility_power_button_ends_call_prerefence_title">Power button ends call</string>
<!-- Title for the accessibility preference for enabling/disabling large icons for mouse/trackpad pointers. [CHAR LIMIT=35] -->
<string name="accessibility_toggle_large_pointer_icon_title">Large mouse pointer</string>
+ <!-- Title for the accessibility preference for disabling animations. [CHAR LIMIT=35] -->
+ <string name="accessibility_disable_animations">Remove animations</string>
<!-- Title for the accessibility preference for master mono. [CHAR LIMIT=35] -->
<string name="accessibility_toggle_master_mono_title">Mono audio</string>
<!-- Summary for the accessibility preference for master mono. [CHAR LIMIT=50] -->
diff --git a/res/xml/accessibility_settings.xml b/res/xml/accessibility_settings.xml
index d7d2e02..b5da848 100644
--- a/res/xml/accessibility_settings.xml
+++ b/res/xml/accessibility_settings.xml
@@ -62,6 +62,10 @@
<SwitchPreference
android:key="toggle_large_pointer_icon"
android:title="@string/accessibility_toggle_large_pointer_icon_title" />
+
+ <SwitchPreference
+ android:key="toggle_disable_animations"
+ android:title="@string/accessibility_disable_animations" />
</PreferenceCategory>
<PreferenceCategory
diff --git a/src/com/android/settings/UserCredentialsSettings.java b/src/com/android/settings/UserCredentialsSettings.java
index 54e12a8..7d0fca0 100644
--- a/src/com/android/settings/UserCredentialsSettings.java
+++ b/src/com/android/settings/UserCredentialsSettings.java
@@ -37,6 +37,8 @@
import android.security.KeyChain;
import android.security.KeyChain.KeyChainConnection;
import android.security.KeyStore;
+import android.security.keymaster.KeyCharacteristics;
+import android.security.keymaster.KeymasterDefs;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.util.SparseArray;
@@ -48,19 +50,15 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.widget.LockPatternUtils;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
-import com.android.settings.SettingsPreferenceFragment;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
-
+import java.security.UnrecoverableKeyException;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
import java.util.SortedMap;
import java.util.TreeMap;
-import static android.view.View.GONE;
-import static android.view.View.VISIBLE;
-
public class UserCredentialsSettings extends SettingsPreferenceFragment
implements View.OnClickListener {
private static final String TAG = "UserCredentialsSettings";
@@ -254,27 +252,57 @@
return credentials;
}
+ private boolean isAsymmetric(KeyStore keyStore, String alias, int uid)
+ throws UnrecoverableKeyException {
+ KeyCharacteristics keyCharacteristics = new KeyCharacteristics();
+ int errorCode = keyStore.getKeyCharacteristics(alias, null, null, uid,
+ keyCharacteristics);
+ if (errorCode != KeyStore.NO_ERROR) {
+ throw (UnrecoverableKeyException)
+ new UnrecoverableKeyException("Failed to obtain information about key")
+ .initCause(KeyStore.getKeyStoreException(errorCode));
+ }
+ Integer keymasterAlgorithm = keyCharacteristics.getEnum(
+ KeymasterDefs.KM_TAG_ALGORITHM);
+ if (keymasterAlgorithm == null) {
+ throw new UnrecoverableKeyException("Key algorithm unknown");
+ }
+ return keymasterAlgorithm == KeymasterDefs.KM_ALGORITHM_RSA ||
+ keymasterAlgorithm == KeymasterDefs.KM_ALGORITHM_EC;
+ }
+
private SortedMap<String, Credential> getCredentialsForUid(KeyStore keyStore, int uid) {
final SortedMap<String, Credential> aliasMap = new TreeMap<>();
for (final Credential.Type type : Credential.Type.values()) {
- for (final String alias : keyStore.list(type.prefix, uid)) {
- if (UserHandle.getAppId(uid) == Process.SYSTEM_UID) {
- // Do not show work profile keys in user credentials
- if (alias.startsWith(LockPatternUtils.PROFILE_KEY_NAME_ENCRYPT) ||
- alias.startsWith(LockPatternUtils.PROFILE_KEY_NAME_DECRYPT)) {
+ for (final String prefix : type.prefix) {
+ for (final String alias : keyStore.list(prefix, uid)) {
+ if (UserHandle.getAppId(uid) == Process.SYSTEM_UID) {
+ // Do not show work profile keys in user credentials
+ if (alias.startsWith(LockPatternUtils.PROFILE_KEY_NAME_ENCRYPT) ||
+ alias.startsWith(LockPatternUtils.PROFILE_KEY_NAME_DECRYPT)) {
+ continue;
+ }
+ // Do not show synthetic password keys in user credential
+ if (alias.startsWith(LockPatternUtils.SYNTHETIC_PASSWORD_KEY_PREFIX)) {
+ continue;
+ }
+ }
+ try {
+ if (type == Credential.Type.USER_KEY &&
+ !isAsymmetric(keyStore, prefix + alias, uid)) {
+ continue;
+ }
+ } catch (UnrecoverableKeyException e) {
+ Log.e(TAG, "Unable to determine algorithm of key: " + prefix + alias, e);
continue;
}
- // Do not show synthetic password keys in user credential
- if (alias.startsWith(LockPatternUtils.SYNTHETIC_PASSWORD_KEY_PREFIX)) {
- continue;
+ Credential c = aliasMap.get(alias);
+ if (c == null) {
+ c = new Credential(alias, uid);
+ aliasMap.put(alias, c);
}
+ c.storedTypes.add(type);
}
- Credential c = aliasMap.get(alias);
- if (c == null) {
- c = new Credential(alias, uid);
- aliasMap.put(alias, c);
- }
- c.storedTypes.add(type);
}
}
return aliasMap;
@@ -344,7 +372,7 @@
*/
private static final SparseArray<Credential.Type> credentialViewTypes = new SparseArray<>();
static {
- credentialViewTypes.put(R.id.contents_userkey, Credential.Type.USER_PRIVATE_KEY);
+ credentialViewTypes.put(R.id.contents_userkey, Credential.Type.USER_KEY);
credentialViewTypes.put(R.id.contents_usercrt, Credential.Type.USER_CERTIFICATE);
credentialViewTypes.put(R.id.contents_cacrt, Credential.Type.CA_CERTIFICATE);
}
@@ -380,12 +408,11 @@
static enum Type {
CA_CERTIFICATE (Credentials.CA_CERTIFICATE),
USER_CERTIFICATE (Credentials.USER_CERTIFICATE),
- USER_PRIVATE_KEY (Credentials.USER_PRIVATE_KEY),
- USER_SECRET_KEY (Credentials.USER_SECRET_KEY);
+ USER_KEY(Credentials.USER_PRIVATE_KEY, Credentials.USER_SECRET_KEY);
- final String prefix;
+ final String[] prefix;
- Type(String prefix) {
+ Type(String... prefix) {
this.prefix = prefix;
}
}
@@ -407,8 +434,7 @@
* <ul>
* <li>{@link Credentials.CA_CERTIFICATE}</li>
* <li>{@link Credentials.USER_CERTIFICATE}</li>
- * <li>{@link Credentials.USER_PRIVATE_KEY}</li>
- * <li>{@link Credentials.USER_SECRET_KEY}</li>
+ * <li>{@link Credentials.USER_KEY}</li>
* </ul>
*/
final EnumSet<Type> storedTypes = EnumSet.noneOf(Type.class);
diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java
index 2161415..160176e 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettings.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettings.java
@@ -97,6 +97,7 @@
"toggle_lock_screen_rotation_preference";
private static final String TOGGLE_LARGE_POINTER_ICON =
"toggle_large_pointer_icon";
+ private static final String TOGGLE_DISABLE_ANIMATIONS = "toggle_disable_animations";
private static final String TOGGLE_MASTER_MONO =
"toggle_master_mono";
private static final String SELECT_LONG_PRESS_TIMEOUT_PREFERENCE =
@@ -135,6 +136,14 @@
// presentation.
private static final long DELAY_UPDATE_SERVICES_MILLIS = 1000;
+ // Settings that should be changed when toggling animations
+ private static final String[] TOGGLE_ANIMATION_TARGETS = {
+ Settings.Global.WINDOW_ANIMATION_SCALE, Settings.Global.TRANSITION_ANIMATION_SCALE,
+ Settings.Global.ANIMATOR_DURATION_SCALE
+ };
+ private static final String ANIMATION_ON_VALUE = "1";
+ private static final String ANIMATION_OFF_VALUE = "0";
+
private final Map<String, String> mLongPressTimeoutValueToTitleMap = new HashMap<>();
private final Handler mHandler = new Handler();
@@ -194,6 +203,7 @@
private SwitchPreference mTogglePowerButtonEndsCallPreference;
private SwitchPreference mToggleLockScreenRotationPreference;
private SwitchPreference mToggleLargePointerIconPreference;
+ private SwitchPreference mToggleDisableAnimationsPreference;
private SwitchPreference mToggleMasterMonoPreference;
private ListPreference mSelectLongPressTimeoutPreference;
private Preference mNoServicesMessagePreference;
@@ -317,6 +327,9 @@
} else if (mToggleLargePointerIconPreference == preference) {
handleToggleLargePointerIconPreferenceClick();
return true;
+ } else if (mToggleDisableAnimationsPreference == preference) {
+ handleToggleDisableAnimations();
+ return true;
} else if (mToggleMasterMonoPreference == preference) {
handleToggleMasterMonoPreferenceClick();
return true;
@@ -349,6 +362,14 @@
mToggleLargePointerIconPreference.isChecked() ? 1 : 0);
}
+ private void handleToggleDisableAnimations() {
+ String newAnimationValue = mToggleDisableAnimationsPreference.isChecked()
+ ? ANIMATION_OFF_VALUE : ANIMATION_ON_VALUE;
+ for (String animationPreference : TOGGLE_ANIMATION_TARGETS) {
+ Settings.Global.putString(getContentResolver(), animationPreference, newAnimationValue);
+ }
+ }
+
private void handleToggleMasterMonoPreferenceClick() {
Settings.System.putIntForUser(getContentResolver(), Settings.System.MASTER_MONO,
mToggleMasterMonoPreference.isChecked() ? 1 : 0, UserHandle.USER_CURRENT);
@@ -389,6 +410,9 @@
mToggleLargePointerIconPreference =
(SwitchPreference) findPreference(TOGGLE_LARGE_POINTER_ICON);
+ mToggleDisableAnimationsPreference =
+ (SwitchPreference) findPreference(TOGGLE_DISABLE_ANIMATIONS);
+
// Master Mono
mToggleMasterMonoPreference =
(SwitchPreference) findPreference(TOGGLE_MASTER_MONO);
@@ -620,6 +644,8 @@
mToggleLargePointerIconPreference.setChecked(Settings.Secure.getInt(getContentResolver(),
Settings.Secure.ACCESSIBILITY_LARGE_POINTER_ICON, 0) != 0);
+ updateDisableAnimationsToggle();
+
// Master mono
updateMasterMono();
@@ -702,6 +728,19 @@
}
}
+ private void updateDisableAnimationsToggle() {
+ boolean allAnimationsDisabled = true;
+ for (String animationSetting : TOGGLE_ANIMATION_TARGETS) {
+ if (!TextUtils.equals(
+ Settings.Global.getString(getContentResolver(), animationSetting),
+ ANIMATION_OFF_VALUE)) {
+ allAnimationsDisabled = false;
+ break;
+ }
+ }
+ mToggleDisableAnimationsPreference.setChecked(allAnimationsDisabled);
+ }
+
private void updateMasterMono() {
final boolean masterMono = Settings.System.getIntForUser(
getContentResolver(), Settings.System.MASTER_MONO,
diff --git a/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragment.java b/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragment.java
index a4f6e5c..02b1012 100644
--- a/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragment.java
+++ b/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragment.java
@@ -68,12 +68,6 @@
}
@Override
- public String getCategoryKey() {
- //TODO(b/69926683): remove this method and change DashboardFragmentRegistry directly for P
- return CategoryKey.CATEGORY_DEVICE;
- }
-
- @Override
protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
final Lifecycle lifecycle = getLifecycle();
diff --git a/src/com/android/settings/dashboard/DashboardFragmentRegistry.java b/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
index af00dc6..e841496 100644
--- a/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
+++ b/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
@@ -23,6 +23,7 @@
import com.android.settings.accounts.UserAndAccountDashboardFragment;
import com.android.settings.applications.AppAndNotificationDashboardFragment;
import com.android.settings.applications.DefaultAppSettings;
+import com.android.settings.connecteddevice.AdvancedConnectedDeviceDashboardFragment;
import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragmentOld;
import com.android.settings.development.DevelopmentSettingsDashboardFragment;
import com.android.settings.deviceinfo.StorageDashboardFragment;
@@ -62,6 +63,8 @@
//TODO(b/69471219): update ConnectedDeviceDashboardFragment once new feature is done.
PARENT_TO_CATEGORY_KEY_MAP.put(ConnectedDeviceDashboardFragmentOld.class.getName(),
CategoryKey.CATEGORY_DEVICE);
+ PARENT_TO_CATEGORY_KEY_MAP.put(AdvancedConnectedDeviceDashboardFragment.class.getName(),
+ CategoryKey.CATEGORY_DEVICE);
PARENT_TO_CATEGORY_KEY_MAP.put(AppAndNotificationDashboardFragment.class.getName(),
CategoryKey.CATEGORY_APPS);
PARENT_TO_CATEGORY_KEY_MAP.put(PowerUsageSummary.class.getName(),
diff --git a/src/com/android/settings/tts/TextToSpeechSettings.java b/src/com/android/settings/tts/TextToSpeechSettings.java
index 9092c0d..9bb7958 100644
--- a/src/com/android/settings/tts/TextToSpeechSettings.java
+++ b/src/com/android/settings/tts/TextToSpeechSettings.java
@@ -770,7 +770,11 @@
if (KEY_TTS_ENGINE_PREFERENCE.equals(p.getKey())) {
EngineInfo info = mEnginesHelper.getEngineInfo(mCurrentEngine);
final Intent settingsIntent = mEnginesHelper.getSettingsIntent(info.name);
- startActivity(settingsIntent);
+ if (settingsIntent != null) {
+ startActivity(settingsIntent);
+ } else {
+ Log.e(TAG, "settingsIntent is null");
+ }
}
}
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragmentTest.java
index 2767570..37ccb76 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragmentTest.java
@@ -148,6 +148,11 @@
}
@Test
+ public void testGetCategoryKey_returnCategoryDevice() {
+ assertThat(mFragment.getCategoryKey()).isEqualTo(CategoryKey.CATEGORY_DEVICE);
+ }
+
+ @Test
public void testNonIndexableKeys_existInXmlLayout() {
final Context context = RuntimeEnvironment.application;
when(mManager.hasSystemFeature(PackageManager.FEATURE_NFC)).thenReturn(false);
diff --git a/tests/unit/src/com/android/settings/UserCredentialsTest.java b/tests/unit/src/com/android/settings/UserCredentialsTest.java
index 41ef4de..8a72797 100644
--- a/tests/unit/src/com/android/settings/UserCredentialsTest.java
+++ b/tests/unit/src/com/android/settings/UserCredentialsTest.java
@@ -40,7 +40,7 @@
Credential c = new Credential(alias, Process.SYSTEM_UID);
c.storedTypes.add(Credential.Type.CA_CERTIFICATE);
- c.storedTypes.add(Credential.Type.USER_SECRET_KEY);
+ c.storedTypes.add(Credential.Type.USER_KEY);
Parcel p = Parcel.obtain();
c.writeToParcel(p, /* flags */ 0);