Merge "Fix jank when switching themes" into oc-dr1-dev
diff --git a/core/java/android/security/IKeystoreService.aidl b/core/java/android/security/IKeystoreService.aidl
index bfc8636c..42282ac 100644
--- a/core/java/android/security/IKeystoreService.aidl
+++ b/core/java/android/security/IKeystoreService.aidl
@@ -48,7 +48,7 @@
byte[] sign(String name, in byte[] data);
int verify(String name, in byte[] data, in byte[] signature);
byte[] get_pubkey(String name);
- int grant(String name, int granteeUid);
+ String grant(String name, int granteeUid);
int ungrant(String name, int granteeUid);
long getmtime(String name, int uid);
int duplicate(String srcKey, int srcUid, String destKey, int destUid);
diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl
index 04f7c76..a44fd67 100644
--- a/core/java/com/android/internal/app/IBatteryStats.aidl
+++ b/core/java/com/android/internal/app/IBatteryStats.aidl
@@ -130,7 +130,7 @@
long getAwakeTimePlugged();
void noteBleScanStarted(in WorkSource ws, boolean isUnoptimized);
- void noteBleScanStopped(in WorkSource ws);
+ void noteBleScanStopped(in WorkSource ws, boolean isUnoptimized);
void noteResetBleScan();
void noteBleScanResults(in WorkSource ws, int numNewResults);
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index dd7d43d..30875a8 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -4852,7 +4852,7 @@
}
}
- private void noteBluetoothScanStoppedLocked(int uid) {
+ private void noteBluetoothScanStoppedLocked(int uid, boolean isUnoptimized) {
uid = mapUid(uid);
final long elapsedRealtime = mClocks.elapsedRealtime();
final long uptime = mClocks.uptimeMillis();
@@ -4864,13 +4864,13 @@
addHistoryRecordLocked(elapsedRealtime, uptime);
mBluetoothScanTimer.stopRunningLocked(elapsedRealtime);
}
- getUidStatsLocked(uid).noteBluetoothScanStoppedLocked(elapsedRealtime);
+ getUidStatsLocked(uid).noteBluetoothScanStoppedLocked(elapsedRealtime, isUnoptimized);
}
- public void noteBluetoothScanStoppedFromSourceLocked(WorkSource ws) {
+ public void noteBluetoothScanStoppedFromSourceLocked(WorkSource ws, boolean isUnoptimized) {
final int N = ws.size();
for (int i = 0; i < N; i++) {
- noteBluetoothScanStoppedLocked(ws.get(i));
+ noteBluetoothScanStoppedLocked(ws.get(i), isUnoptimized);
}
}
@@ -6121,14 +6121,11 @@
}
}
- public void noteBluetoothScanStoppedLocked(long elapsedRealtimeMs) {
+ public void noteBluetoothScanStoppedLocked(long elapsedRealtimeMs, boolean isUnoptimized) {
if (mBluetoothScanTimer != null) {
mBluetoothScanTimer.stopRunningLocked(elapsedRealtimeMs);
}
- // In the ble code, a scan cannot change types and nested starts are not possible.
- // So if an unoptimizedScan is running, it is now being stopped.
- if (mBluetoothUnoptimizedScanTimer != null
- && mBluetoothUnoptimizedScanTimer.isRunningLocked()) {
+ if (isUnoptimized && mBluetoothUnoptimizedScanTimer != null) {
mBluetoothUnoptimizedScanTimer.stopRunningLocked(elapsedRealtimeMs);
}
}
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index f56abc3..8c18dd6 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -2780,18 +2780,6 @@
<!-- Component that runs demo mode when it is enabled. -->
<string name="config_demoModePackage" translatable="false"></string>
- <!-- Component that is the default launcher when demo mode is enabled. -->
- <string name="config_demoModeLauncherComponent">com.android.retaildemo/.DemoPlayer</string>
-
- <!-- Hashed password (SHA-256) used to restrict carrier demo mode operation. -->
- <string name="config_carrierDemoModePassword" translatable="false"></string>
-
- <!-- Secure setting used to activate carrier demo mode. -->
- <string name="config_carrierDemoModeSetting" translatable="false"></string>
-
- <!-- List of packages to enable in carrier demo mode (comma separated). -->
- <string name="config_carrierDemoModePackages" translatable="false"></string>
-
<!-- Number of days preloaded file cache should be preserved on a device before it can be
deleted -->
<integer name="config_keepPreloadsMinDays">7</integer>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index a3b7ee8..8fa2269 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1167,10 +1167,6 @@
<java-symbol type="string" name="config_ethernet_tcp_buffers" />
<java-symbol type="string" name="config_wifi_tcp_buffers" />
<java-symbol type="string" name="config_demoModePackage" />
- <java-symbol type="string" name="config_demoModeLauncherComponent" />
- <java-symbol type="string" name="config_carrierDemoModePassword" />
- <java-symbol type="string" name="config_carrierDemoModeSetting" />
- <java-symbol type="string" name="config_carrierDemoModePackages" />
<java-symbol type="string" name="demo_starting_message" />
<java-symbol type="string" name="demo_restarting_message" />
<java-symbol type="string" name="conference_call" />
@@ -2018,12 +2014,6 @@
<java-symbol type="string" name="config_customVpnConfirmDialogComponent" />
<java-symbol type="string" name="config_defaultNetworkScorerPackageName" />
<java-symbol type="string" name="config_persistentDataPackageName" />
- <java-symbol type="string" name="reset_retail_demo_mode_title" />
- <java-symbol type="string" name="reset_retail_demo_mode_text" />
- <java-symbol type="string" name="demo_user_inactivity_timeout_title" />
- <java-symbol type="string" name="demo_user_inactivity_timeout_countdown" />
- <java-symbol type="string" name="demo_user_inactivity_timeout_left_button" />
- <java-symbol type="string" name="demo_user_inactivity_timeout_right_button" />
<java-symbol type="layout" name="resolver_list" />
<java-symbol type="id" name="resolver_list" />
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java
index c539f78..c21c3be 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java
@@ -217,10 +217,6 @@
curr = 1000 * (clocks.realtime = clocks.uptime = 305);
bi.updateTimeBasesLocked(false, false, curr, curr); // off battery
- // Stop timer
- curr = 1000 * (clocks.realtime = clocks.uptime = 409);
- bi.noteBluetoothScanStoppedFromSourceLocked(ws);
-
// Start timer (unoptimized)
curr = 1000 * (clocks.realtime = clocks.uptime = 1000);
bi.noteBluetoothScanStartedFromSourceLocked(ws, true);
@@ -233,9 +229,13 @@
curr = 1000 * (clocks.realtime = clocks.uptime = 3004);
bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_TOP);
- // Stop timer
+ // Stop timer (optimized)
+ curr = 1000 * (clocks.realtime = clocks.uptime = 3409);
+ bi.noteBluetoothScanStoppedFromSourceLocked(ws, false);
+
+ // Stop timer (unoptimized)
curr = 1000 * (clocks.realtime = clocks.uptime = 4008);
- bi.noteBluetoothScanStoppedFromSourceLocked(ws);
+ bi.noteBluetoothScanStoppedFromSourceLocked(ws, true);
// Test
curr = 1000 * (clocks.realtime = clocks.uptime = 5000);
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java
index 4e8ab31..ed54f53 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java
@@ -44,8 +44,6 @@
assertEquals(101,
bi.getUidStats().get(UID).getBluetoothScanResultCounter()
.getCountLocked(STATS_SINCE_CHARGED));
- // TODO: remove next line when Counter misreporting values when plugged-in bug is fixed.
- bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND);
BatteryStats.Counter bgCntr = bi.getUidStats().get(UID).getBluetoothScanResultBgCounter();
if (bgCntr != null) {
assertEquals(0, bgCntr.getCountLocked(STATS_SINCE_CHARGED));
diff --git a/keystore/java/android/security/KeyStore.java b/keystore/java/android/security/KeyStore.java
index bfd1422..ccf9de0 100644
--- a/keystore/java/android/security/KeyStore.java
+++ b/keystore/java/android/security/KeyStore.java
@@ -341,12 +341,14 @@
}
}
- public boolean grant(String key, int uid) {
+ public String grant(String key, int uid) {
try {
- return mBinder.grant(key, uid) == NO_ERROR;
+ String grantAlias = mBinder.grant(key, uid);
+ if (grantAlias == "") return null;
+ return grantAlias;
} catch (RemoteException e) {
Log.w(TAG, "Cannot connect to keystore", e);
- return false;
+ return null;
}
}
diff --git a/keystore/tests/src/android/security/KeyStoreTest.java b/keystore/tests/src/android/security/KeyStoreTest.java
index 319cf32..1d5bf12 100644
--- a/keystore/tests/src/android/security/KeyStoreTest.java
+++ b/keystore/tests/src/android/security/KeyStoreTest.java
@@ -483,7 +483,7 @@
mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeConstants.EVP_PKEY_RSA,
RSA_KEY_SIZE, KeyStore.FLAG_ENCRYPTED, null));
- assertTrue("Should be able to grant key to other user",
+ assertNotNull("Should be able to grant key to other user",
mKeyStore.grant(TEST_KEYNAME, 0));
}
@@ -493,19 +493,19 @@
assertTrue("Should be able to import key for testcase", mKeyStore.importKey(TEST_KEYNAME,
PRIVKEY_BYTES, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
- assertTrue("Should be able to grant key to other user", mKeyStore.grant(TEST_KEYNAME, 0));
+ assertNotNull("Should be able to grant key to other user", mKeyStore.grant(TEST_KEYNAME, 0));
}
public void testGrant_NoKey_Failure() throws Exception {
assertTrue("Should be able to unlock keystore for test",
mKeyStore.onUserPasswordChanged(TEST_PASSWD));
- assertFalse("Should not be able to grant without first initializing the keystore",
+ assertNull("Should not be able to grant without first initializing the keystore",
mKeyStore.grant(TEST_KEYNAME, 0));
}
public void testGrant_NotInitialized_Failure() throws Exception {
- assertFalse("Should not be able to grant without first initializing the keystore",
+ assertNull("Should not be able to grant without first initializing the keystore",
mKeyStore.grant(TEST_KEYNAME, 0));
}
@@ -517,7 +517,7 @@
mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeConstants.EVP_PKEY_RSA,
RSA_KEY_SIZE, KeyStore.FLAG_ENCRYPTED, null));
- assertTrue("Should be able to grant key to other user",
+ assertNotNull("Should be able to grant key to other user",
mKeyStore.grant(TEST_KEYNAME, 0));
assertTrue("Should be able to ungrant key to other user",
@@ -531,7 +531,7 @@
assertTrue("Should be able to import key for testcase", mKeyStore.importKey(TEST_KEYNAME,
PRIVKEY_BYTES, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
- assertTrue("Should be able to grant key to other user",
+ assertNotNull("Should be able to grant key to other user",
mKeyStore.grant(TEST_KEYNAME, 0));
assertTrue("Should be able to ungrant key to other user",
@@ -563,7 +563,7 @@
mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeConstants.EVP_PKEY_RSA,
RSA_KEY_SIZE, KeyStore.FLAG_ENCRYPTED, null));
- assertTrue("Should be able to grant key to other user",
+ assertNotNull("Should be able to grant key to other user",
mKeyStore.grant(TEST_KEYNAME, 0));
assertTrue("Should be able to ungrant key to other user",
@@ -581,10 +581,10 @@
mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeConstants.EVP_PKEY_RSA,
RSA_KEY_SIZE, KeyStore.FLAG_ENCRYPTED, null));
- assertTrue("Should be able to grant key to other user",
+ assertNotNull("Should be able to grant key to other user",
mKeyStore.grant(TEST_KEYNAME, 0));
- assertTrue("Should be able to grant key to other user a second time",
+ assertNotNull("Should be able to grant key to other user a second time",
mKeyStore.grant(TEST_KEYNAME, 0));
assertTrue("Should be able to ungrant key to other user",
diff --git a/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CaptivePortalLoginActivity.java b/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CaptivePortalLoginActivity.java
index ae8fc80..6194b87 100644
--- a/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CaptivePortalLoginActivity.java
+++ b/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CaptivePortalLoginActivity.java
@@ -77,6 +77,7 @@
private WebView mWebView;
private MyWebViewClient mWebViewClient;
private boolean mLaunchBrowser = false;
+ private Thread mTestingThread = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -127,8 +128,6 @@
@Override
public void onDestroy() {
- super.onDestroy();
- releaseNetworkRequest();
if (mLaunchBrowser) {
// Give time for this network to become default. After 500ms just proceed.
for (int i = 0; i < 5; i++) {
@@ -143,6 +142,13 @@
if (DBG) logd("starting activity with intent ACTION_VIEW for " + url);
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
}
+
+ if (mTestingThread != null) {
+ mTestingThread.interrupt();
+ }
+ mWebView.destroy();
+ releaseNetworkRequest();
+ super.onDestroy();
}
// Find WebView's proxy BroadcastReceiver and prompt it to read proxy system properties.
@@ -215,13 +221,14 @@
}
private void testForCaptivePortal() {
- new Thread(new Runnable() {
+ mTestingThread = new Thread(new Runnable() {
public void run() {
// Give time for captive portal to open.
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
+ if (isFinishing() || isDestroyed()) return;
HttpURLConnection urlConnection = null;
int httpResponseCode = 500;
int oldTag = TrafficStats.getAndSetThreadStatsTag(TrafficStats.TAG_SYSTEM_PROBE);
@@ -244,7 +251,8 @@
done(true);
}
}
- }).start();
+ });
+ mTestingThread.start();
}
private Network getNetworkForCaptivePortal() {
diff --git a/packages/SystemUI/res/drawable/ic_landscape_from_auto_rotate.xml b/packages/SettingsLib/res/drawable/ic_landscape_from_auto_rotate.xml
similarity index 100%
rename from packages/SystemUI/res/drawable/ic_landscape_from_auto_rotate.xml
rename to packages/SettingsLib/res/drawable/ic_landscape_from_auto_rotate.xml
diff --git a/packages/SystemUI/res-keyguard/values/strings.xml b/packages/SystemUI/res-keyguard/values/strings.xml
index b951c4c..589f1c1 100644
--- a/packages/SystemUI/res-keyguard/values/strings.xml
+++ b/packages/SystemUI/res-keyguard/values/strings.xml
@@ -99,12 +99,12 @@
<string name="keyguard_sim_unlock_progress_dialog_message">Unlocking SIM card\u2026</string>
<!-- Time format strings for fall-back clock widget -->
- <string name="keyguard_widget_12_hours_format" translatable="false">h\uee01mm</string>
+ <string name="keyguard_widget_12_hours_format" translatable="false">h:mm</string>
<!-- Time format strings for fall-back clock widget -->
- <string name="keyguard_widget_24_hours_format" translatable="false">kk\uee01mm</string>
+ <string name="keyguard_widget_24_hours_format" translatable="false">kk:mm</string>
<!-- The character used in keyguard_widget_12_hours_format and keyguard_widget_24_hours_format
to represent a ":". -->
- <string name="keyguard_fancy_colon" translatable="false">\uee01</string>
+ <string name="keyguard_fancy_colon" translatable="false"></string>
<!-- Accessibility description of the PIN password view. [CHAR_LIMIT=none] -->
<string name="keyguard_accessibility_pin_area">PIN area</string>
diff --git a/packages/SystemUI/res/layout/volume_zen_footer.xml b/packages/SystemUI/res/layout/volume_zen_footer.xml
index 91dc617..38627b6 100644
--- a/packages/SystemUI/res/layout/volume_zen_footer.xml
+++ b/packages/SystemUI/res/layout/volume_zen_footer.xml
@@ -51,8 +51,7 @@
android:clickable="true"
android:contentDescription="@string/accessibility_desc_close"
android:scaleType="center"
- android:src="@drawable/ic_close"
- android:tint="@android:color/white" />
+ android:src="@drawable/ic_close_white" />
<TextView
android:id="@+id/zen_introduction_message"
@@ -128,4 +127,4 @@
android:textColor="?android:attr/colorAccent"
android:textAppearance="@style/TextAppearance.QS.DetailButton" />
-</com.android.systemui.volume.ZenFooter>
\ No newline at end of file
+</com.android.systemui.volume.ZenFooter>
diff --git a/packages/SystemUI/res/layout/zen_mode_panel.xml b/packages/SystemUI/res/layout/zen_mode_panel.xml
index 200eabf..4261641 100644
--- a/packages/SystemUI/res/layout/zen_mode_panel.xml
+++ b/packages/SystemUI/res/layout/zen_mode_panel.xml
@@ -59,8 +59,7 @@
android:clickable="true"
android:contentDescription="@string/accessibility_desc_close"
android:scaleType="center"
- android:src="@drawable/ic_close"
- android:tint="@android:color/white" />
+ android:src="@drawable/ic_close_white" />
<TextView
android:id="@+id/zen_introduction_message"
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index 0ab44ed..054d520 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -146,4 +146,6 @@
<color name="instant_apps_color">#ff4d5a64</color>
+ <color name="zen_introduction">#ffffffff</color>
+
</resources>
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index a608a8e..99111f8 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -218,6 +218,7 @@
<style name="TextAppearance.QS.Introduction">
<item name="android:textSize">14sp</item>
+ <item name="android:textColor">@color/zen_introduction</item>
</style>
<style name="TextAppearance.QS.Warning">
@@ -234,7 +235,7 @@
</style>
<style name="TextAppearance.QS.DetailButton.White">
- <item name="android:textColor">@color/qs_detail_button_white</item>
+ <item name="android:textColor">@color/zen_introduction</item>
</style>
<style name="TextAppearance.QS.DetailEmpty">
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockAccessibilityDelegate.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockAccessibilityDelegate.java
index 80509a6..6a83c71 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockAccessibilityDelegate.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockAccessibilityDelegate.java
@@ -36,6 +36,9 @@
@Override
public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
super.onInitializeAccessibilityEvent(host, event);
+ if (TextUtils.isEmpty(mFancyColon)) {
+ return;
+ }
CharSequence text = event.getContentDescription();
if (!TextUtils.isEmpty(text)) {
event.setContentDescription(replaceFancyColon(text));
@@ -44,15 +47,22 @@
@Override
public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
- CharSequence text = ((TextView) host).getText();
- if (!TextUtils.isEmpty(text)) {
- event.getText().add(replaceFancyColon(text));
+ if (TextUtils.isEmpty(mFancyColon)) {
+ super.onPopulateAccessibilityEvent(host, event);
+ } else {
+ CharSequence text = ((TextView) host).getText();
+ if (!TextUtils.isEmpty(text)) {
+ event.getText().add(replaceFancyColon(text));
+ }
}
}
@Override
public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(host, info);
+ if (TextUtils.isEmpty(mFancyColon)) {
+ return;
+ }
if (!TextUtils.isEmpty(info.getText())) {
info.setText(replaceFancyColon(info.getText()));
}
@@ -62,6 +72,13 @@
}
private CharSequence replaceFancyColon(CharSequence text) {
+ if (TextUtils.isEmpty(mFancyColon)) {
+ return text;
+ }
return text.toString().replace(mFancyColon, ":");
}
+
+ public static boolean isNeeded(Context context) {
+ return !TextUtils.isEmpty(context.getString(R.string.keyguard_fancy_colon));
+ }
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
index a9d583f..bc2a59d 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
@@ -153,7 +153,9 @@
mDateView = findViewById(R.id.date_view);
mClockView = findViewById(R.id.clock_view);
mClockView.setShowCurrentUserTime(true);
- mClockView.setAccessibilityDelegate(new KeyguardClockAccessibilityDelegate(mContext));
+ if (KeyguardClockAccessibilityDelegate.isNeeded(mContext)) {
+ mClockView.setAccessibilityDelegate(new KeyguardClockAccessibilityDelegate(mContext));
+ }
mOwnerInfo = findViewById(R.id.owner_info);
mBatteryDoze = findViewById(R.id.battery_doze);
mKeyguardStatusArea = findViewById(R.id.keyguard_status_area);
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
index 0d5527c..bf1c060 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
@@ -184,6 +184,13 @@
pw.print("ProxSensor: "); pw.println(mProxSensor.toString());
}
+ /**
+ * @return true if prox is currently far, false if near or null if unknown.
+ */
+ public Boolean isProximityCurrentlyFar() {
+ return mProxSensor.mCurrentlyFar;
+ }
+
private class ProxSensor implements SensorEventListener {
static final long COOLDOWN_TRIGGER = 2 * 1000;
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
index d1f5337..ea06479 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
@@ -103,8 +103,11 @@
private void proximityCheckThenCall(IntConsumer callback,
boolean alreadyPerformedProxCheck,
int pulseReason) {
+ Boolean cachedProxFar = mDozeSensors.isProximityCurrentlyFar();
if (alreadyPerformedProxCheck) {
callback.accept(ProximityCheck.RESULT_NOT_CHECKED);
+ } else if (cachedProxFar != null) {
+ callback.accept(cachedProxFar ? ProximityCheck.RESULT_FAR : ProximityCheck.RESULT_NEAR);
} else {
final long start = SystemClock.uptimeMillis();
new ProximityCheck() {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java b/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java
index 56fca1f..3ce1465c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java
@@ -15,13 +15,16 @@
*/
package com.android.systemui.qs;
+import android.app.ActivityManager;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
+import android.content.pm.UserInfo;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
+import android.os.UserManager;
import android.provider.Settings;
import android.text.SpannableStringBuilder;
import android.text.method.LinkMovementMethod;
@@ -59,6 +62,8 @@
private final Handler mMainHandler;
private final View mDivider;
+ private final UserManager mUm;
+
private AlertDialog mDialog;
private QSTileHost mHost;
protected H mHandler;
@@ -81,6 +86,7 @@
mSecurityController = Dependency.get(SecurityController.class);
mHandler = new H(Dependency.get(Dependency.BG_LOOPER));
mDivider = qsPanel == null ? null : qsPanel.getDivider();
+ mUm = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
}
public void setHostEnvironment(QSTileHost host) {
@@ -128,6 +134,9 @@
private void handleRefreshState() {
final boolean isDeviceManaged = mSecurityController.isDeviceManaged();
+ final UserInfo currentUser = mUm.getUserInfo(ActivityManager.getCurrentUser());
+ final boolean isDemoDevice = UserManager.isDeviceInDemoMode(mContext) && currentUser != null
+ && currentUser.isDemo();
final boolean hasWorkProfile = mSecurityController.hasWorkProfile();
final boolean hasCACerts = mSecurityController.hasCACertInCurrentUser();
final boolean hasCACertsInWorkProfile = mSecurityController.hasCACertInWorkProfile();
@@ -137,7 +146,7 @@
final CharSequence organizationName = mSecurityController.getDeviceOwnerOrganizationName();
final CharSequence workProfileName = mSecurityController.getWorkProfileOrganizationName();
// Update visibility of footer
- mIsVisible = isDeviceManaged || hasCACerts || hasCACertsInWorkProfile ||
+ mIsVisible = (isDeviceManaged && !isDemoDevice) || hasCACerts || hasCACertsInWorkProfile ||
vpnName != null || vpnNameWorkProfile != null;
// Update the string
mFooterTextContent = getFooterText(isDeviceManaged, hasWorkProfile,
diff --git a/packages/SystemUI/src/com/android/systemui/recents/IRecentsSystemUserCallbacks.aidl b/packages/SystemUI/src/com/android/systemui/recents/IRecentsSystemUserCallbacks.aidl
index 1240e05..cc7798e 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/IRecentsSystemUserCallbacks.aidl
+++ b/packages/SystemUI/src/com/android/systemui/recents/IRecentsSystemUserCallbacks.aidl
@@ -31,4 +31,5 @@
void sendRecentsDrawnEvent();
void sendDockingTopTaskEvent(int dragMode, in Rect initialRect);
void sendLaunchRecentsEvent();
+ void setWaitingForTransitionStartEvent(boolean waitingForTransitionStart);
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/Recents.java b/packages/SystemUI/src/com/android/systemui/recents/Recents.java
index de2ace4..3800c8d 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/Recents.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/Recents.java
@@ -57,6 +57,7 @@
import com.android.systemui.recents.events.activity.RecentsActivityStartingEvent;
import com.android.systemui.recents.events.component.RecentsVisibilityChangedEvent;
import com.android.systemui.recents.events.component.ScreenPinningRequestEvent;
+import com.android.systemui.recents.events.component.SetWaitingForTransitionStartEvent;
import com.android.systemui.recents.events.component.ShowUserToastEvent;
import com.android.systemui.recents.events.ui.RecentsDrawnEvent;
import com.android.systemui.recents.misc.SystemServicesProxy;
@@ -711,6 +712,25 @@
}
}
+ public final void onBusEvent(SetWaitingForTransitionStartEvent event) {
+ int processUser = sSystemServicesProxy.getProcessUser();
+ if (sSystemServicesProxy.isSystemUser(processUser)) {
+ mImpl.setWaitingForTransitionStart(event.waitingForTransitionStart);
+ } else {
+ postToSystemUser(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ mUserToSystemCallbacks.setWaitingForTransitionStartEvent(
+ event.waitingForTransitionStart);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Callback failed", e);
+ }
+ }
+ });
+ }
+ }
+
/**
* Attempts to register with the system user.
*/
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
index 42e8921..cfc49a8 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
@@ -24,12 +24,11 @@
import android.app.ActivityManager;
import android.app.ActivityManager.TaskSnapshot;
import android.app.ActivityOptions;
+import android.app.ActivityOptions.OnAnimationStartedListener;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
import android.graphics.GraphicBuffer;
import android.graphics.Rect;
import android.graphics.RectF;
@@ -208,6 +207,20 @@
protected static RecentsTaskLoadPlan sInstanceLoadPlan;
// Stores the last pinned task time
protected static long sLastPipTime = -1;
+ // Stores whether we are waiting for a transition to/from recents to start. During this time,
+ // we disallow the user from manually toggling recents until the transition has started.
+ private static boolean mWaitingForTransitionStart = false;
+ // Stores whether or not the user toggled while we were waiting for a transition to/from
+ // recents. In this case, we defer the toggle state until then and apply it immediately after.
+ private static boolean mToggleFollowingTransitionStart = true;
+
+ private ActivityOptions.OnAnimationStartedListener mResetToggleFlagListener =
+ new OnAnimationStartedListener() {
+ @Override
+ public void onAnimationStarted() {
+ setWaitingForTransitionStart(false);
+ }
+ };
protected Context mContext;
protected Handler mHandler;
@@ -365,6 +378,11 @@
return;
}
+ if (mWaitingForTransitionStart) {
+ mToggleFollowingTransitionStart = true;
+ return;
+ }
+
mDraggingInRecents = false;
mLaunchedWhileDocking = false;
mTriggeredFromAltTab = false;
@@ -638,6 +656,18 @@
}
}
+ public void setWaitingForTransitionStart(boolean waitingForTransitionStart) {
+ if (mWaitingForTransitionStart == waitingForTransitionStart) {
+ return;
+ }
+
+ mWaitingForTransitionStart = waitingForTransitionStart;
+ if (!waitingForTransitionStart && mToggleFollowingTransitionStart) {
+ toggleRecents(DividerView.INVALID_RECENTS_GROW_TARGET);
+ }
+ mToggleFollowingTransitionStart = false;
+ }
+
/**
* Returns the preloaded load plan and invalidates it.
*/
@@ -865,8 +895,9 @@
}
AppTransitionAnimationSpec[] specsArray = new AppTransitionAnimationSpec[specs.size()];
specs.toArray(specsArray);
+
return new Pair<>(ActivityOptions.makeThumbnailAspectScaleDownAnimation(mDummyStackView,
- specsArray, mHandler, null, this), null);
+ specsArray, mHandler, mResetToggleFlagListener, this), null);
} else {
// Update the destination rect
Task toTask = new Task();
@@ -884,8 +915,10 @@
return Lists.newArrayList(new AppTransitionAnimationSpec(
toTask.key.id, thumbnail, rect));
});
+
return new Pair<>(ActivityOptions.makeMultiThumbFutureAspectScaleAnimation(mContext,
- mHandler, future.getFuture(), null, false /* scaleUp */), future);
+ mHandler, future.getFuture(), mResetToggleFlagListener, false /* scaleUp */),
+ future);
}
}
@@ -991,6 +1024,10 @@
launchState.launchedToTaskId = runningTaskId;
launchState.launchedWithAltTab = mTriggeredFromAltTab;
+ // Disable toggling of recents between starting the activity and it is visible and the app
+ // has started its transition into recents.
+ setWaitingForTransitionStart(useThumbnailTransition);
+
// Preload the icon (this will be a null-op if we have preloaded the icon already in
// preloadRecents())
preloadIcon(runningTaskId);
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsSystemUser.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsSystemUser.java
index 3921a20..1285626 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsSystemUser.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsSystemUser.java
@@ -29,6 +29,7 @@
import com.android.systemui.recents.events.EventBus;
import com.android.systemui.recents.events.activity.DockedTopTaskEvent;
import com.android.systemui.recents.events.activity.RecentsActivityStartingEvent;
+import com.android.systemui.recents.events.component.SetWaitingForTransitionStartEvent;
import com.android.systemui.recents.events.ui.RecentsDrawnEvent;
import com.android.systemui.recents.misc.ForegroundThread;
@@ -105,4 +106,10 @@
public void sendLaunchRecentsEvent() throws RemoteException {
EventBus.getDefault().post(new RecentsActivityStartingEvent());
}
+
+ @Override
+ public void setWaitingForTransitionStartEvent(boolean waitingForTransitionStart) {
+ EventBus.getDefault().post(new SetWaitingForTransitionStartEvent(
+ waitingForTransitionStart));
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/events/component/SetWaitingForTransitionStartEvent.java b/packages/SystemUI/src/com/android/systemui/recents/events/component/SetWaitingForTransitionStartEvent.java
new file mode 100644
index 0000000..d9cf5fb
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/recents/events/component/SetWaitingForTransitionStartEvent.java
@@ -0,0 +1,31 @@
+/*
+ * 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.systemui.recents.events.component;
+
+import com.android.systemui.recents.events.EventBus;
+
+/**
+ * This is sent when we are setting/resetting the flag to wait for the transition to start.
+ */
+public class SetWaitingForTransitionStartEvent extends EventBus.Event {
+
+ public final boolean waitingForTransitionStart;
+
+ public SetWaitingForTransitionStartEvent(boolean waitingForTransitionStart) {
+ this.waitingForTransitionStart = waitingForTransitionStart;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsTransitionHelper.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsTransitionHelper.java
index 968b77f..67685b8 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsTransitionHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsTransitionHelper.java
@@ -54,6 +54,7 @@
import com.android.systemui.recents.events.activity.LaunchTaskStartedEvent;
import com.android.systemui.recents.events.activity.LaunchTaskSucceededEvent;
import com.android.systemui.recents.events.component.ScreenPinningRequestEvent;
+import com.android.systemui.recents.events.component.SetWaitingForTransitionStartEvent;
import com.android.systemui.recents.misc.SystemServicesProxy;
import com.android.systemui.recents.model.Task;
import com.android.systemui.recents.model.TaskStack;
@@ -117,31 +118,58 @@
final Rect windowRect = Recents.getSystemServices().getWindowRect();
transitionFuture = getAppTransitionFuture(
() -> composeAnimationSpecs(task, stackView, destinationStack, windowRect));
- animStartedListener = () -> {
- // If we are launching into another task, cancel the previous task's
- // window transition
- EventBus.getDefault().send(new CancelEnterRecentsWindowAnimationEvent(task));
- EventBus.getDefault().send(new ExitRecentsWindowFirstAnimationFrameEvent());
- stackView.cancelAllTaskViewAnimations();
+ animStartedListener = new OnAnimationStartedListener() {
+ private boolean mHandled;
- if (screenPinningRequested) {
- // Request screen pinning after the animation runs
- mStartScreenPinningRunnable.taskId = task.key.id;
- mHandler.postDelayed(mStartScreenPinningRunnable, 350);
+ @Override
+ public void onAnimationStarted() {
+ if (mHandled) {
+ return;
+ }
+ mHandled = true;
+
+ // If we are launching into another task, cancel the previous task's
+ // window transition
+ EventBus.getDefault().send(new CancelEnterRecentsWindowAnimationEvent(task));
+ EventBus.getDefault().send(new ExitRecentsWindowFirstAnimationFrameEvent());
+ stackView.cancelAllTaskViewAnimations();
+
+ if (screenPinningRequested) {
+ // Request screen pinning after the animation runs
+ mStartScreenPinningRunnable.taskId = task.key.id;
+ mHandler.postDelayed(mStartScreenPinningRunnable, 350);
+ }
+
+ // Reset the state where we are waiting for the transition to start
+ EventBus.getDefault().send(new SetWaitingForTransitionStartEvent(false));
}
};
} else {
// This is only the case if the task is not on screen (scrolled offscreen for example)
transitionFuture = null;
- animStartedListener = () -> {
- // If we are launching into another task, cancel the previous task's
- // window transition
- EventBus.getDefault().send(new CancelEnterRecentsWindowAnimationEvent(task));
- EventBus.getDefault().send(new ExitRecentsWindowFirstAnimationFrameEvent());
- stackView.cancelAllTaskViewAnimations();
+ animStartedListener = new OnAnimationStartedListener() {
+ private boolean mHandled;
+
+ @Override
+ public void onAnimationStarted() {
+ if (mHandled) {
+ return;
+ }
+ mHandled = true;
+
+ // If we are launching into another task, cancel the previous task's
+ // window transition
+ EventBus.getDefault().send(new CancelEnterRecentsWindowAnimationEvent(task));
+ EventBus.getDefault().send(new ExitRecentsWindowFirstAnimationFrameEvent());
+ stackView.cancelAllTaskViewAnimations();
+
+ // Reset the state where we are waiting for the transition to start
+ EventBus.getDefault().send(new SetWaitingForTransitionStartEvent(false));
+ }
};
}
+ EventBus.getDefault().send(new SetWaitingForTransitionStartEvent(true));
final ActivityOptions opts = ActivityOptions.makeMultiThumbFutureAspectScaleAnimation(mContext,
mHandler, transitionFuture != null ? transitionFuture.future : null,
animStartedListener, true /* scaleUp */);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
index 25ef478..74737c4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
@@ -280,13 +280,10 @@
if (mDozing) {
// If we're dozing, never show a persistent indication.
if (!TextUtils.isEmpty(mTransientIndication)) {
- // When dozing we ignore the initial text color and use white instead.
- // We don't wait to draw black text on a black background.
- int color = mTransientTextColor == mInitialTextColor ?
- Color.WHITE : mTransientTextColor;
+ // When dozing we ignore any text color and use white instead, because
+ // colors can be hard to read in low brightness.
+ mTextView.setTextColor(Color.WHITE);
mTextView.switchIndication(mTransientIndication);
- mTextView.setTextColor(color);
-
} else {
mTextView.switchIndication(null);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java
index df059e3..b4fe900 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java
@@ -29,6 +29,7 @@
import com.android.keyguard.LatencyTracker;
import com.android.systemui.Dependency;
import com.android.systemui.keyguard.KeyguardViewMediator;
+import com.android.systemui.keyguard.WakefulnessLifecycle;
/**
* Controller which coordinates all the fingerprint unlocking actions with the UI.
@@ -99,6 +100,7 @@
private final UnlockMethodCache mUnlockMethodCache;
private final Context mContext;
private int mPendingAuthenticatedUserId = -1;
+ private boolean mPendingShowBouncer;
public FingerprintUnlockController(Context context,
DozeScrimController dozeScrimController,
@@ -110,6 +112,7 @@
mPowerManager = context.getSystemService(PowerManager.class);
mUpdateMonitor = KeyguardUpdateMonitor.getInstance(context);
mUpdateMonitor.registerCallback(this);
+ Dependency.get(WakefulnessLifecycle.class).addObserver(mWakefulnessObserver);
mStatusBarWindowManager = Dependency.get(StatusBarWindowManager.class);
mDozeScrimController = dozeScrimController;
mKeyguardViewMediator = keyguardViewMediator;
@@ -212,9 +215,10 @@
Trace.beginSection("MODE_UNLOCK or MODE_SHOW_BOUNCER");
if (!wasDeviceInteractive) {
mStatusBarKeyguardViewManager.notifyDeviceWakeUpRequested();
+ mPendingShowBouncer = true;
+ } else {
+ showBouncer();
}
- mStatusBarKeyguardViewManager.animateCollapsePanels(
- FINGERPRINT_COLLAPSE_SPEEDUP_FACTOR);
Trace.endSection();
break;
case MODE_WAKE_AND_UNLOCK_PULSING:
@@ -247,6 +251,12 @@
Trace.endSection();
}
+ private void showBouncer() {
+ mStatusBarKeyguardViewManager.animateCollapsePanels(
+ FINGERPRINT_COLLAPSE_SPEEDUP_FACTOR);
+ mPendingShowBouncer = false;
+ }
+
@Override
public void onStartedGoingToSleep(int why) {
mPendingAuthenticatedUserId = -1;
@@ -338,4 +348,14 @@
}
mStatusBar.notifyFpAuthModeChanged();
}
+
+ private final WakefulnessLifecycle.Observer mWakefulnessObserver =
+ new WakefulnessLifecycle.Observer() {
+ @Override
+ public void onFinishedWakingUp() {
+ if (mPendingShowBouncer) {
+ FingerprintUnlockController.this.showBouncer();
+ }
+ }
+ };
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
index 3e183b6..cdba24c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
@@ -238,10 +238,12 @@
mEnterpriseDisclosure = findViewById(
R.id.keyguard_indication_enterprise_disclosure);
mIndicationText = findViewById(R.id.keyguard_indication_text);
- watchForCameraPolicyChanges();
updateCameraVisibility();
mUnlockMethodCache = UnlockMethodCache.getInstance(getContext());
mUnlockMethodCache.addListener(this);
+ KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
+ mLockIcon.setScreenOn(updateMonitor.isScreenOn());
+ mLockIcon.setDeviceInteractive(updateMonitor.isDeviceInteractive());
mLockIcon.update();
setClipChildren(false);
setClipToPadding(false);
@@ -278,6 +280,11 @@
.withDefault(() -> new DefaultLeftButton())
.withCallback(button -> setLeftButton(button))
.build();
+ final IntentFilter filter = new IntentFilter();
+ filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
+ getContext().registerReceiverAsUser(mDevicePolicyReceiver,
+ UserHandle.ALL, filter, null, null);
+ KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitorCallback);
}
@Override
@@ -286,6 +293,8 @@
mAccessibilityController.removeStateChangedCallback(this);
mRightExtension.destroy();
mLeftExtension.destroy();
+ getContext().unregisterReceiver(mDevicePolicyReceiver);
+ KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mUpdateMonitorCallback);
}
private void initAccessibility() {
@@ -401,14 +410,6 @@
&& pm.resolveActivity(PHONE_INTENT, 0) != null;
}
- private void watchForCameraPolicyChanges() {
- final IntentFilter filter = new IntentFilter();
- filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
- getContext().registerReceiverAsUser(mDevicePolicyReceiver,
- UserHandle.ALL, filter, null, null);
- KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitorCallback);
- }
-
@Override
public void onStateChanged(boolean accessibilityEnabled, boolean touchExplorationEnabled) {
mRightAffordanceView.setClickable(touchExplorationEnabled);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index bc37d83..13675bb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -5140,6 +5140,7 @@
mStackScroller.setAnimationsEnabled(true);
mVisualStabilityManager.setScreenOn(true);
mNotificationPanel.setTouchDisabled(false);
+ mDozeServiceHost.stopDozing();
updateVisibleToUser();
updateIsKeyguard();
}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/ZenFooter.java b/packages/SystemUI/src/com/android/systemui/volume/ZenFooter.java
index 17d98b1..7464212 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/ZenFooter.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/ZenFooter.java
@@ -111,7 +111,9 @@
if (mZen == zen) return;
mZen = zen;
update();
- updateIntroduction();
+ post(() -> {
+ updateIntroduction();
+ });
}
private void setConfig(ZenModeConfig config) {
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockAccessibilityDelegateTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockAccessibilityDelegateTest.java
index 855adb4..e37ea95 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockAccessibilityDelegateTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockAccessibilityDelegateTest.java
@@ -16,6 +16,7 @@
package com.android.keyguard;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -36,12 +37,17 @@
public class KeyguardClockAccessibilityDelegateTest extends SysuiTestCase {
private TextView mView;
+ private String m12HoursFormat;
+ private String m24HoursFormat;
@Before
public void setUp() throws Exception {
+ m12HoursFormat = mContext.getString(R.string.keyguard_widget_12_hours_format);
+ m24HoursFormat = mContext.getString(R.string.keyguard_widget_24_hours_format);
+
mView = new TextView(mContext);
- mView.setText(R.string.keyguard_widget_12_hours_format);
- mView.setContentDescription(mContext.getString(R.string.keyguard_widget_12_hours_format));
+ mView.setText(m12HoursFormat);
+ mView.setContentDescription(m12HoursFormat);
mView.setAccessibilityDelegate(new KeyguardClockAccessibilityDelegate(mContext));
}
@@ -77,6 +83,21 @@
assertTrue(isAscii(info.getContentDescription()));
}
+ @Test
+ public void isNeeded_returnsTrueIfDateFormatsContainNonAscii() {
+ if (!isAscii(m12HoursFormat) || !isAscii(m24HoursFormat)) {
+ assertTrue(KeyguardClockAccessibilityDelegate.isNeeded(mContext));
+ }
+ }
+
+ @Test
+ public void isNeeded_returnsWhetherFancyColonExists() {
+ boolean hasFancyColon = !TextUtils.isEmpty(mContext.getString(
+ R.string.keyguard_fancy_colon));
+
+ assertEquals(hasFancyColon, KeyguardClockAccessibilityDelegate.isNeeded(mContext));
+ }
+
private boolean isAscii(CharSequence text) {
return text.chars().allMatch((i) -> i < 128);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java
index ebd266b..a8487b3 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java
@@ -16,12 +16,16 @@
import static junit.framework.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import android.content.Context;
+import android.content.pm.UserInfo;
import android.os.Handler;
import android.os.Looper;
+import android.os.UserManager;
+import android.provider.Settings;
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
import android.text.SpannableStringBuilder;
@@ -39,6 +43,7 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mockito;
/*
* Compile and run the whole SystemUI test suite:
@@ -63,6 +68,7 @@
private TestableImageView mFooterIcon;
private QSSecurityFooter mFooter;
private SecurityController mSecurityController = mock(SecurityController.class);
+ private UserManager mUserManager;
@Before
public void setUp() {
@@ -72,6 +78,8 @@
new LayoutInflaterBuilder(mContext)
.replace("ImageView", TestableImageView.class)
.build());
+ mUserManager = Mockito.mock(UserManager.class);
+ mContext.addMockSystemService(Context.USER_SERVICE, mUserManager);
Handler h = new Handler(Looper.getMainLooper());
h.post(() -> mFooter = new QSSecurityFooter(null, mContext));
waitForIdleSync(h);
@@ -123,6 +131,21 @@
}
@Test
+ public void testManagedDemoMode() {
+ when(mSecurityController.isDeviceManaged()).thenReturn(true);
+ when(mSecurityController.getDeviceOwnerOrganizationName()).thenReturn(null);
+ final UserInfo mockUserInfo = Mockito.mock(UserInfo.class);
+ when(mockUserInfo.isDemo()).thenReturn(true);
+ when(mUserManager.getUserInfo(anyInt())).thenReturn(mockUserInfo);
+ Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_DEMO_MODE, 1);
+
+ mFooter.refreshState();
+
+ waitForIdleSync(mFooter.mHandler);
+ assertEquals(View.GONE, mRootView.getVisibility());
+ }
+
+ @Test
public void testNetworkLoggingEnabled() {
when(mSecurityController.isDeviceManaged()).thenReturn(true);
when(mSecurityController.isNetworkLoggingEnabled()).thenReturn(true);
diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java
index c68e5d6..4733840 100644
--- a/services/core/java/com/android/server/VibratorService.java
+++ b/services/core/java/com/android/server/VibratorService.java
@@ -48,6 +48,7 @@
import android.os.WorkSource;
import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;
+import android.util.DebugUtils;
import android.util.Slog;
import android.view.InputDevice;
import android.media.AudioAttributes;
@@ -60,10 +61,7 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
import java.util.LinkedList;
-import java.util.ListIterator;
public class VibratorService extends IVibratorService.Stub
implements InputManager.InputDeviceListener {
@@ -948,6 +946,21 @@
}
private int runVibrate() {
+ try {
+ final int zenMode = Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.ZEN_MODE);
+ if (zenMode != Settings.Global.ZEN_MODE_OFF) {
+ try (PrintWriter pw = getOutPrintWriter();) {
+ pw.print("Ignoring because device is on DND mode ");
+ pw.println(DebugUtils.flagsToString(Settings.Global.class, "ZEN_MODE_",
+ zenMode));
+ return 0;
+ }
+ }
+ } catch (SettingNotFoundException e) {
+ // ignore
+ }
+
final long duration = Long.parseLong(getNextArgRequired());
if (duration > MAX_VIBRATION_MS) {
throw new IllegalArgumentException("maximum duration is " + MAX_VIBRATION_MS);
@@ -972,7 +985,8 @@
pw.println(" Prints this help text.");
pw.println("");
pw.println(" vibrate duration [description]");
- pw.println(" Vibrates for duration milliseconds.");
+ pw.println(" Vibrates for duration milliseconds; ignored when device is on DND ");
+ pw.println(" (Do Not Disturb) mode.");
pw.println("");
}
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 75467f5..9b1ddd7 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -13365,7 +13365,6 @@
final ActivityRecord r = ActivityRecord.isInStackLocked(token);
if (r != null) {
final ActivityOptions activityOptions = r.pendingOptions;
- r.pendingOptions = null;
return activityOptions == null ? null : activityOptions.toBundle();
}
return null;
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 777a368..51e0e3b 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -1912,9 +1912,11 @@
} else if (mStackId == FULLSCREEN_WORKSPACE_STACK_ID) {
if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Skipping after task=" + task
+ " returning to non-application type=" + task.getTaskToReturnTo());
- // Once we reach a fullscreen task that should return to another task, then no
- // other activities behind that one should be visible.
- if (task.getTaskToReturnTo() != APPLICATION_ACTIVITY_TYPE) {
+ // Once we reach a fullscreen stack task that has a running activity and should
+ // return to another stack task, then no other activities behind that one should
+ // be visible.
+ if (task.topRunningActivityLocked() != null &&
+ task.getTaskToReturnTo() != APPLICATION_ACTIVITY_TYPE) {
behindFullscreenActivity = true;
}
}
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index e0f2a75..f3963ed 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -5170,11 +5170,14 @@
// Work Challenge is present) let startActivityInPackage handle the intercepting.
if (!mService.mUserController.shouldConfirmCredentials(task.userId)
&& task.getRootActivity() != null) {
- mService.mActivityStarter.sendPowerHintForLaunchStartIfNeeded(true /* forceSend */);
+ final ActivityRecord targetActivity = task.getTopActivity();
+
+ mService.mActivityStarter.sendPowerHintForLaunchStartIfNeeded(true /* forceSend */,
+ targetActivity);
mActivityMetricsLogger.notifyActivityLaunching();
mService.moveTaskToFrontLocked(task.taskId, 0, bOptions, true /* fromRecents */);
mActivityMetricsLogger.notifyActivityLaunched(ActivityManager.START_TASK_TO_FRONT,
- task.getTopActivity());
+ targetActivity);
// If we are launching the task in the docked stack, put it into resizing mode so
// the window renders full-screen with the background filling the void. Also only
diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java
index 4f04066..76f65e2 100644
--- a/services/core/java/com/android/server/am/ActivityStarter.java
+++ b/services/core/java/com/android/server/am/ActivityStarter.java
@@ -969,7 +969,7 @@
return START_SUCCESS;
}
- void sendPowerHintForLaunchStartIfNeeded(boolean forceSend) {
+ void sendPowerHintForLaunchStartIfNeeded(boolean forceSend, ActivityRecord targetActivity) {
boolean sendHint = forceSend;
if (!sendHint) {
@@ -978,7 +978,7 @@
final ActivityRecord resumedActivity = mSupervisor.getResumedActivityLocked();
sendHint = resumedActivity == null
|| resumedActivity.app == null
- || !resumedActivity.app.equals(mStartActivity.app);
+ || !resumedActivity.app.equals(targetActivity.app);
}
if (sendHint && mService.mLocalPowerManager != null) {
@@ -1098,7 +1098,7 @@
}
}
- sendPowerHintForLaunchStartIfNeeded(false /* forceSend */);
+ sendPowerHintForLaunchStartIfNeeded(false /* forceSend */, reusedActivity);
reusedActivity = setTargetStackAndMoveToFrontIfNeeded(reusedActivity);
@@ -1127,6 +1127,7 @@
if (outActivity != null && outActivity.length > 0) {
outActivity[0] = reusedActivity;
}
+
return START_TASK_TO_FRONT;
}
}
@@ -1218,7 +1219,7 @@
EventLogTags.AM_CREATE_ACTIVITY, mStartActivity, mStartActivity.getTask());
mTargetStack.mLastPausedActivity = null;
- sendPowerHintForLaunchStartIfNeeded(false /* forceSend */);
+ sendPowerHintForLaunchStartIfNeeded(false /* forceSend */, mStartActivity);
mTargetStack.startActivityLocked(mStartActivity, topFocused, newTask, mKeepCurTransition,
mOptions);
@@ -1520,7 +1521,8 @@
if (mLaunchSingleInstance) {
// There can be one and only one instance of single instance activity in the
// history, and it is always in its own unique task, so we do a special search.
- intentActivity = mSupervisor.findActivityLocked(mIntent, mStartActivity.info, false);
+ intentActivity = mSupervisor.findActivityLocked(mIntent, mStartActivity.info,
+ mStartActivity.isHomeActivity());
} else if ((mLaunchFlags & FLAG_ACTIVITY_LAUNCH_ADJACENT) != 0) {
// For the launch adjacent case we only want to put the activity in an existing
// task if the activity already exists in the history.
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index 06ab75a..65697e9 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -985,10 +985,10 @@
}
@Override
- public void noteBleScanStopped(WorkSource ws) {
+ public void noteBleScanStopped(WorkSource ws, boolean isUnoptimized) {
enforceCallingPermission();
synchronized (mStats) {
- mStats.noteBluetoothScanStoppedFromSourceLocked(ws);
+ mStats.noteBluetoothScanStoppedFromSourceLocked(ws, isUnoptimized);
}
}
diff --git a/services/core/java/com/android/server/connectivity/tethering/OffloadHardwareInterface.java b/services/core/java/com/android/server/connectivity/tethering/OffloadHardwareInterface.java
index 4df566f..25fab9e 100644
--- a/services/core/java/com/android/server/connectivity/tethering/OffloadHardwareInterface.java
+++ b/services/core/java/com/android/server/connectivity/tethering/OffloadHardwareInterface.java
@@ -40,7 +40,7 @@
// Change this value to control whether tether offload is enabled or
// disabled by default in the absence of an explicit Settings value.
// See accompanying unittest to distinguish 0 from non-0 values.
- private static final int DEFAULT_TETHER_OFFLOAD_DISABLED = 0;
+ private static final int DEFAULT_TETHER_OFFLOAD_DISABLED = 1;
private static final String NO_INTERFACE_NAME = "";
private static final String NO_IPV4_ADDRESS = "";
private static final String NO_IPV4_GATEWAY = "";
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 66f9c57..e89ab1d 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -3164,7 +3164,7 @@
@Override
public void selectRotationAnimationLw(int anim[]) {
// If the screen is off or non-interactive, force a jumpcut.
- final boolean forceJumpcut = !mScreenOnFully || !mAwake;
+ final boolean forceJumpcut = !mScreenOnFully || !okToAnimate();
if (PRINT_ANIM) Slog.i(TAG, "selectRotationAnimation mTopFullscreen="
+ mTopFullscreenOpaqueWindowState + " rotationAnimation="
+ (mTopFullscreenOpaqueWindowState == null ?
@@ -7689,7 +7689,7 @@
private boolean areSystemNavigationKeysEnabled() {
return Settings.Secure.getIntForUser(mContext.getContentResolver(),
- Settings.Secure.SYSTEM_NAVIGATION_KEYS_ENABLED, 1, UserHandle.USER_CURRENT) == 1;
+ Settings.Secure.SYSTEM_NAVIGATION_KEYS_ENABLED, 0, UserHandle.USER_CURRENT) == 1;
}
@Override
diff --git a/services/core/java/com/android/server/vr/VrManagerService.java b/services/core/java/com/android/server/vr/VrManagerService.java
index e737328..447d639 100644
--- a/services/core/java/com/android/server/vr/VrManagerService.java
+++ b/services/core/java/com/android/server/vr/VrManagerService.java
@@ -779,7 +779,8 @@
}
if ((calling != null || mPersistentVrModeEnabled)
- && !Objects.equals(calling, mCurrentVrModeComponent)) {
+ && !Objects.equals(calling, mCurrentVrModeComponent)
+ || mRunning2dInVr != running2dInVr) {
sendUpdatedCaller = true;
}
mCurrentVrModeComponent = calling;
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index 8f1065f..23b515e 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -1604,21 +1604,33 @@
recoveringMemory);
mSurfaceController.setLayer(mAnimLayer);
- if (prepared && mLastHidden && mDrawState == HAS_DRAWN) {
- if (showSurfaceRobustlyLocked()) {
- markPreservedSurfaceForDestroy();
- mAnimator.requestRemovalOfReplacedWindows(w);
- mLastHidden = false;
- if (mIsWallpaper) {
- w.dispatchWallpaperVisibility(true);
+ if (prepared && mDrawState == HAS_DRAWN) {
+ if (mLastHidden) {
+ if (showSurfaceRobustlyLocked()) {
+ markPreservedSurfaceForDestroy();
+ mAnimator.requestRemovalOfReplacedWindows(w);
+ mLastHidden = false;
+ if (mIsWallpaper) {
+ w.dispatchWallpaperVisibility(true);
+ }
+ // This draw means the difference between unique content and mirroring.
+ // Run another pass through performLayout to set mHasContent in the
+ // LogicalDisplay.
+ mAnimator.setPendingLayoutChanges(w.getDisplayId(),
+ WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM);
+ } else {
+ w.setOrientationChanging(false);
}
- // This draw means the difference between unique content and mirroring.
- // Run another pass through performLayout to set mHasContent in the
- // LogicalDisplay.
- mAnimator.setPendingLayoutChanges(w.getDisplayId(),
- WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM);
- } else {
- w.setOrientationChanging(false);
+ }
+ // We process mTurnOnScreen even for windows which have already
+ // been shown, to handle cases where windows are not necessarily
+ // hidden while the screen is turning off.
+ // TODO(b/63773439): These cases should be eliminated, though we probably still
+ // want to process mTurnOnScreen in this way for clarity.
+ if (mWin.mTurnOnScreen) {
+ if (DEBUG_VISIBILITY) Slog.v(TAG, "Show surface turning screen on: " + mWin);
+ mWin.mTurnOnScreen = false;
+ mAnimator.mBulkUpdateParams |= SET_TURN_ON_SCREEN;
}
}
if (hasSurface()) {
@@ -1730,11 +1742,6 @@
if (!shown)
return false;
- if (mWin.mTurnOnScreen) {
- if (DEBUG_VISIBILITY) Slog.v(TAG, "Show surface turning screen on: " + mWin);
- mWin.mTurnOnScreen = false;
- mAnimator.mBulkUpdateParams |= SET_TURN_ON_SCREEN;
- }
return true;
}