summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/os/BatteryStats.java1
-rwxr-xr-xcore/java/android/provider/Settings.java15
-rw-r--r--core/java/android/widget/TextView.java4
-rw-r--r--media/java/android/media/ExifInterface.java4
-rw-r--r--media/java/android/media/browse/MediaBrowser.java11
-rw-r--r--media/java/android/service/media/MediaBrowserService.java7
-rw-r--r--packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java12
-rw-r--r--packages/SystemUI/res-keyguard/drawable-hdpi/ic_done_wht.pngbin1374 -> 0 bytes
-rw-r--r--packages/SystemUI/res-keyguard/drawable-mdpi/ic_done_wht.pngbin1206 -> 0 bytes
-rw-r--r--packages/SystemUI/res-keyguard/drawable-xhdpi/ic_done_wht.pngbin1600 -> 0 bytes
-rw-r--r--packages/SystemUI/res-keyguard/drawable-xxhdpi/ic_done_wht.pngbin1133 -> 0 bytes
-rw-r--r--packages/SystemUI/res-keyguard/drawable-xxxhdpi/ic_done_wht.pngbin2753 -> 0 bytes
-rw-r--r--packages/SystemUI/res-keyguard/drawable/ic_backspace_24dp.xml26
-rw-r--r--packages/SystemUI/res-keyguard/drawable/ic_backspace_black_24dp.xml25
-rw-r--r--packages/SystemUI/res-keyguard/drawable/ic_done_black_24dp.xml25
-rw-r--r--packages/SystemUI/res-keyguard/layout/keyguard_pin_view.xml5
-rw-r--r--packages/SystemUI/res-keyguard/layout/keyguard_sim_pin_view.xml5
-rw-r--r--packages/SystemUI/res-keyguard/layout/keyguard_sim_puk_view.xml5
-rw-r--r--packages/SystemUI/res/values/colors.xml4
-rw-r--r--packages/SystemUI/res/values/config.xml12
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeHost.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java23
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java23
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NearestTouchFrame.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java31
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/util/AsyncSensorManager.java11
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java6
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NearestTouchFrameTest.java26
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java9
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/util/AsyncSensorManagerTest.java98
-rw-r--r--services/core/java/com/android/server/am/ActivityRecord.java2
-rw-r--r--services/core/java/com/android/server/notification/NotificationManagerService.java6
-rw-r--r--services/core/java/com/android/server/policy/PhoneWindowManager.java33
-rw-r--r--services/core/java/com/android/server/wm/AppWindowContainerController.java18
-rw-r--r--services/core/java/com/android/server/wm/AppWindowToken.java38
-rw-r--r--services/core/java/com/android/server/wm/WindowStateAnimator.java7
-rw-r--r--wifi/java/android/net/wifi/IWifiManager.aidl2
-rw-r--r--wifi/java/android/net/wifi/WifiManager.java2
41 files changed, 399 insertions, 126 deletions
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index 54d5860048ad..cc6b5e1e3ce3 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -3544,6 +3544,7 @@ public abstract class BatteryStats implements Parcelable {
if (name.indexOf(',') >= 0) {
name = name.replace(',', '_');
}
+ name = name.replaceAll("[\\n|\\r]+", "");
dumpLine(pw, uid, category, WAKELOCK_DATA, name, sb.toString());
}
}
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 53c82e6c5237..dc9a26e431b8 100755
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -576,21 +576,6 @@ public final class Settings {
"android.settings.INPUT_METHOD_SUBTYPE_SETTINGS";
/**
- * Activity Action: Show a dialog to select input method.
- * <p>
- * In some cases, a matching Activity may not exist, so ensure you
- * safeguard against this.
- * <p>
- * Input: Nothing.
- * <p>
- * Output: Nothing.
- * @hide
- */
- @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
- public static final String ACTION_SHOW_INPUT_METHOD_PICKER =
- "android.settings.SHOW_INPUT_METHOD_PICKER";
-
- /**
* Activity Action: Show settings to manage the user input dictionary.
* <p>
* Starting with {@link android.os.Build.VERSION_CODES#KITKAT},
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 243e21500206..b2e2e889d16c 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -8341,7 +8341,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
private boolean suggestedSizeFitsInSpace(int suggestedSizeInPx, RectF availableSpace) {
- final CharSequence text = getText();
+ final CharSequence text = mTransformed != null
+ ? mTransformed
+ : getText();
final int maxLines = getMaxLines();
if (mTempTextPaint == null) {
mTempTextPaint = new TextPaint();
diff --git a/media/java/android/media/ExifInterface.java b/media/java/android/media/ExifInterface.java
index 6677178514e0..59597af55085 100644
--- a/media/java/android/media/ExifInterface.java
+++ b/media/java/android/media/ExifInterface.java
@@ -2101,9 +2101,7 @@ public class ExifInterface {
private int getMimeType(BufferedInputStream in) throws IOException {
in.mark(SIGNATURE_CHECK_SIZE);
byte[] signatureCheckBytes = new byte[SIGNATURE_CHECK_SIZE];
- if (in.read(signatureCheckBytes) != SIGNATURE_CHECK_SIZE) {
- throw new EOFException();
- }
+ in.read(signatureCheckBytes);
in.reset();
if (isJpegFormat(signatureCheckBytes)) {
return IMAGE_TYPE_JPEG;
diff --git a/media/java/android/media/browse/MediaBrowser.java b/media/java/android/media/browse/MediaBrowser.java
index ece19e46e479..c9b096fb124c 100644
--- a/media/java/android/media/browse/MediaBrowser.java
+++ b/media/java/android/media/browse/MediaBrowser.java
@@ -256,7 +256,13 @@ public final class MediaBrowser {
*/
private void forceCloseConnection() {
if (mServiceConnection != null) {
- mContext.unbindService(mServiceConnection);
+ try {
+ mContext.unbindService(mServiceConnection);
+ } catch (IllegalArgumentException e) {
+ if (DBG) {
+ Log.d(TAG, "unbindService failed", e);
+ }
+ }
}
mState = CONNECT_STATE_DISCONNECTED;
mServiceConnection = null;
@@ -445,6 +451,9 @@ public final class MediaBrowser {
ResultReceiver receiver = new ResultReceiver(mHandler) {
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
+ if (!isConnected()) {
+ return;
+ }
if (resultCode != 0 || resultData == null
|| !resultData.containsKey(MediaBrowserService.KEY_MEDIA_ITEM)) {
cb.onError(mediaId);
diff --git a/media/java/android/service/media/MediaBrowserService.java b/media/java/android/service/media/MediaBrowserService.java
index b52906ddd1ae..4df645dc7b2f 100644
--- a/media/java/android/service/media/MediaBrowserService.java
+++ b/media/java/android/service/media/MediaBrowserService.java
@@ -700,6 +700,13 @@ public abstract class MediaBrowserService extends Service {
new Result<MediaBrowser.MediaItem>(itemId) {
@Override
void onResultSent(MediaBrowser.MediaItem item, @ResultFlags int flag) {
+ if (mConnections.get(connection.callbacks.asBinder()) != connection) {
+ if (DBG) {
+ Log.d(TAG, "Not sending onLoadItem result for connection that has"
+ + " been disconnected. pkg=" + connection.pkg + " id=" + itemId);
+ }
+ return;
+ }
if ((flag & RESULT_FLAG_ON_LOAD_ITEM_NOT_IMPLEMENTED) != 0) {
receiver.send(RESULT_ERROR, null);
return;
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java
index 6ede55d2941e..76d9823c6ab6 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java
@@ -346,7 +346,10 @@ public class WifiTrackerTest {
Intent intent = new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION);
intent.putExtra(WifiManager.EXTRA_NETWORK_INFO, networkInfo);
- return createTrackerWithImmediateBroadcastsAndInjectInitialScanResults(intent);
+ WifiTracker tracker =
+ createTrackerWithImmediateBroadcastsAndInjectInitialScanResults(intent);
+ assertThat(tracker.isConnected()).isTrue();
+ return tracker;
}
private void waitForHandlersToProcessCurrentlyEnqueuedMessages(WifiTracker tracker)
@@ -860,23 +863,26 @@ public class WifiTrackerTest {
intent.putExtra(WifiManager.EXTRA_NETWORK_INFO, networkInfo);
tracker.mReceiver.onReceive(mContext, intent);
+ waitForHandlersToProcessCurrentlyEnqueuedMessages(tracker);
verify(mockWifiListener, times(1)).onConnectedChanged();
}
@Test
- public void onConnectedChangedCallback_shouldNBeInvokedWhenStateChanges() throws Exception {
+ public void onConnectedChangedCallback_shouldBeInvokedWhenStateChanges() throws Exception {
WifiTracker tracker = createTrackerWithScanResultsAndAccessPoint1Connected();
verify(mockWifiListener, times(1)).onConnectedChanged();
NetworkInfo networkInfo = new NetworkInfo(
ConnectivityManager.TYPE_WIFI, 0, "Type Wifi", "subtype");
networkInfo.setDetailedState(
- NetworkInfo.DetailedState.DISCONNECTED, "dicconnected", "test");
+ NetworkInfo.DetailedState.DISCONNECTED, "disconnected", "test");
Intent intent = new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION);
intent.putExtra(WifiManager.EXTRA_NETWORK_INFO, networkInfo);
tracker.mReceiver.onReceive(mContext, intent);
+ waitForHandlersToProcessCurrentlyEnqueuedMessages(tracker);
+ assertThat(tracker.isConnected()).isFalse();
verify(mockWifiListener, times(2)).onConnectedChanged();
}
}
diff --git a/packages/SystemUI/res-keyguard/drawable-hdpi/ic_done_wht.png b/packages/SystemUI/res-keyguard/drawable-hdpi/ic_done_wht.png
deleted file mode 100644
index 82c01ef5cda7..000000000000
--- a/packages/SystemUI/res-keyguard/drawable-hdpi/ic_done_wht.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res-keyguard/drawable-mdpi/ic_done_wht.png b/packages/SystemUI/res-keyguard/drawable-mdpi/ic_done_wht.png
deleted file mode 100644
index 8c169301911a..000000000000
--- a/packages/SystemUI/res-keyguard/drawable-mdpi/ic_done_wht.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res-keyguard/drawable-xhdpi/ic_done_wht.png b/packages/SystemUI/res-keyguard/drawable-xhdpi/ic_done_wht.png
deleted file mode 100644
index 6a4d8a7b01ea..000000000000
--- a/packages/SystemUI/res-keyguard/drawable-xhdpi/ic_done_wht.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res-keyguard/drawable-xxhdpi/ic_done_wht.png b/packages/SystemUI/res-keyguard/drawable-xxhdpi/ic_done_wht.png
deleted file mode 100644
index 4c04ba28b58a..000000000000
--- a/packages/SystemUI/res-keyguard/drawable-xxhdpi/ic_done_wht.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res-keyguard/drawable-xxxhdpi/ic_done_wht.png b/packages/SystemUI/res-keyguard/drawable-xxxhdpi/ic_done_wht.png
deleted file mode 100644
index bd6c4df14a88..000000000000
--- a/packages/SystemUI/res-keyguard/drawable-xxxhdpi/ic_done_wht.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res-keyguard/drawable/ic_backspace_24dp.xml b/packages/SystemUI/res-keyguard/drawable/ic_backspace_24dp.xml
deleted file mode 100644
index 1e4022ea402b..000000000000
--- a/packages/SystemUI/res-keyguard/drawable/ic_backspace_24dp.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<!--
-Copyright (C) 2014 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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:autoMirrored="true"
- android:height="24dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
-
- <path
- android:fillColor="#ffffffff"
- android:pathData="M44.0,6.0L14.0,6.0c-1.4,0.0 -2.5,0.7 -3.2,1.8L0.0,24.0l10.8,16.2c0.7,1.1 1.8,1.8 3.2,1.8l30.0,0.0c2.2,0.0 4.0,-1.8 4.0,-4.0L48.0,10.0C48.0,7.8 46.2,6.0 44.0,6.0zM38.0,31.2L35.2,34.0L28.0,26.8L20.8,34.0L18.0,31.2l7.2,-7.2L18.0,16.8l2.8,-2.8l7.2,7.2l7.2,-7.2l2.8,2.8L30.8,24.0L38.0,31.2z"/>
-</vector>
diff --git a/packages/SystemUI/res-keyguard/drawable/ic_backspace_black_24dp.xml b/packages/SystemUI/res-keyguard/drawable/ic_backspace_black_24dp.xml
new file mode 100644
index 000000000000..6edae4baf69a
--- /dev/null
+++ b/packages/SystemUI/res-keyguard/drawable/ic_backspace_black_24dp.xml
@@ -0,0 +1,25 @@
+<!--
+ ~ 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
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M22,3H7C6.31,3 5.77,3.35 5.41,3.88l-5.04,7.57c-0.22,0.34 -0.22,0.77 0,1.11l5.04,7.56C5.77,20.64 6.31,21 7,21h15c1.1,0 2,-0.9 2,-2V5C24,3.9 23.1,3 22,3zM18.3,16.3L18.3,16.3c-0.39,0.39 -1.02,0.39 -1.41,0L14,13.41l-2.89,2.89c-0.39,0.39 -1.02,0.39 -1.41,0h0c-0.39,-0.39 -0.39,-1.02 0,-1.41L12.59,12L9.7,9.11c-0.39,-0.39 -0.39,-1.02 0,-1.41l0,0c0.39,-0.39 1.02,-0.39 1.41,0L14,10.59l2.89,-2.89c0.39,-0.39 1.02,-0.39 1.41,0v0c0.39,0.39 0.39,1.02 0,1.41L15.41,12l2.89,2.89C18.68,15.27 18.68,15.91 18.3,16.3z"/>
+</vector>
diff --git a/packages/SystemUI/res-keyguard/drawable/ic_done_black_24dp.xml b/packages/SystemUI/res-keyguard/drawable/ic_done_black_24dp.xml
new file mode 100644
index 000000000000..5026f07de912
--- /dev/null
+++ b/packages/SystemUI/res-keyguard/drawable/ic_done_black_24dp.xml
@@ -0,0 +1,25 @@
+<!--
+ ~ 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
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M9,16.2l-3.5,-3.5a0.984,0.984 0,0 0,-1.4 0,0.984 0.984,0 0,0 0,1.4l4.19,4.19c0.39,0.39 1.02,0.39 1.41,0L20.3,7.7a0.984,0.984 0,0 0,0 -1.4,0.984 0.984,0 0,0 -1.4,0L9,16.2z"/>
+</vector>
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_pin_view.xml b/packages/SystemUI/res-keyguard/layout/keyguard_pin_view.xml
index 3283e0411ec4..631cc0d3df30 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_pin_view.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_pin_view.xml
@@ -62,7 +62,7 @@
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
- android:src="@drawable/ic_backspace_24dp"
+ android:src="@drawable/ic_backspace_black_24dp"
android:clickable="true"
android:paddingTop="8dip"
android:paddingBottom="8dip"
@@ -73,6 +73,7 @@
android:layout_alignEnd="@+id/pinEntry"
android:layout_alignParentRight="true"
android:tint="@color/pin_delete_color"
+ android:tintMode="src_in"
/>
<View
android:id="@+id/divider"
@@ -204,7 +205,7 @@
android:layout_height="match_parent"
android:layout_weight="1"
android:paddingBottom="11sp"
- android:src="@drawable/ic_done_wht"
+ android:src="@drawable/ic_done_black_24dp"
style="@style/Keyguard.ImageButton.NumPadEnter"
android:background="@drawable/ripple_drawable"
android:contentDescription="@string/keyboardview_keycode_enter"
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_sim_pin_view.xml b/packages/SystemUI/res-keyguard/layout/keyguard_sim_pin_view.xml
index cf87f9026e22..97c896591eb2 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_sim_pin_view.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_sim_pin_view.xml
@@ -75,7 +75,7 @@
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
- android:src="@drawable/ic_backspace_24dp"
+ android:src="@drawable/ic_backspace_black_24dp"
android:clickable="true"
android:paddingTop="8dip"
android:paddingBottom="8dip"
@@ -86,6 +86,7 @@
android:layout_alignEnd="@+id/pinEntry"
android:layout_alignParentRight="true"
android:tint="@color/pin_delete_color"
+ android:tintMode="src_in"
/>
<View
android:id="@+id/divider"
@@ -213,7 +214,7 @@
android:layout_height="match_parent"
android:layout_weight="1"
android:paddingBottom="11sp"
- android:src="@drawable/ic_done_wht"
+ android:src="@drawable/ic_done_black_24dp"
style="@style/Keyguard.ImageButton.NumPadEnter"
android:background="@drawable/ripple_drawable"
android:contentDescription="@string/keyboardview_keycode_enter"
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_sim_puk_view.xml b/packages/SystemUI/res-keyguard/layout/keyguard_sim_puk_view.xml
index 3cae493c5722..d4c5d7474aed 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_sim_puk_view.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_sim_puk_view.xml
@@ -76,7 +76,7 @@
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
- android:src="@drawable/ic_backspace_24dp"
+ android:src="@drawable/ic_backspace_black_24dp"
android:clickable="true"
android:paddingTop="8dip"
android:paddingBottom="8dip"
@@ -87,6 +87,7 @@
android:layout_alignEnd="@+id/pinEntry"
android:layout_alignParentRight="true"
android:tint="@color/pin_delete_color"
+ android:tintMode="src_in"
/>
<View
android:id="@+id/divider"
@@ -214,7 +215,7 @@
android:layout_height="match_parent"
android:layout_weight="1"
android:paddingBottom="11sp"
- android:src="@drawable/ic_done_wht"
+ android:src="@drawable/ic_done_black_24dp"
style="@style/Keyguard.ImageButton.NumPadEnter"
android:background="@drawable/ripple_drawable"
android:contentDescription="@string/keyboardview_keycode_enter"
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index 054d520c13e3..f72f3794e808 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -116,11 +116,11 @@
<color name="segmented_buttons_background">#14FFFFFF</color><!-- 8% white -->
<color name="dark_mode_icon_color_single_tone">#99000000</color>
- <color name="dark_mode_icon_color_dual_tone_background">#4d000000</color>
+ <color name="dark_mode_icon_color_dual_tone_background">#3d000000</color>
<color name="dark_mode_icon_color_dual_tone_fill">#7a000000</color>
<color name="light_mode_icon_color_single_tone">#ffffff</color>
- <color name="light_mode_icon_color_dual_tone_background">#5dffffff</color>
+ <color name="light_mode_icon_color_dual_tone_background">#4dffffff</color>
<color name="light_mode_icon_color_dual_tone_fill">#ffffff</color>
<color name="volume_settings_icon_color">#7fffffff</color>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 5917dc56124b..506c294d74fa 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -277,6 +277,18 @@
<item>28</item> <!-- 4: SUN -->
</integer-array>
+ <!-- Doze: Table that translates sensor values from the doze_brightness_sensor_type sensor
+ to an opacity value for a black scrim that is overlayed in AOD1.
+ Valid range is from 0 (transparent) to 255 (opaque).
+ -1 means keeping the current opacity. -->
+ <integer-array name="config_doze_brightness_sensor_to_scrim_opacity">
+ <item>-1</item> <!-- 0: OFF -->
+ <item>0</item> <!-- 1: NIGHT -->
+ <item>0</item> <!-- 2: LOW -->
+ <item>0</item> <!-- 3: HIGH -->
+ <item>0</item> <!-- 4: SUN -->
+ </integer-array>
+
<!-- Doze: whether the double tap sensor reports 2D touch coordinates -->
<bool name="doze_double_tap_reports_touch_coordinates">false</bool>
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java
index cbdabf5de876..302bc2d38f64 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java
@@ -65,7 +65,7 @@ public class DozeFactory {
handler, wakeLock, machine),
createDozeUi(context, host, wakeLock, machine, handler, alarmManager),
createDozeScreenState(wrappedService),
- createDozeScreenBrightness(context, wrappedService, sensorManager, handler),
+ createDozeScreenBrightness(context, wrappedService, sensorManager, host, handler),
});
return machine;
@@ -76,10 +76,11 @@ public class DozeFactory {
}
private DozeMachine.Part createDozeScreenBrightness(Context context,
- DozeMachine.Service service, SensorManager sensorManager, Handler handler) {
+ DozeMachine.Service service, SensorManager sensorManager, DozeHost host,
+ Handler handler) {
Sensor sensor = DozeSensors.findSensorWithType(sensorManager,
context.getString(R.string.doze_brightness_sensor_type));
- return new DozeScreenBrightness(context, service, sensorManager, sensor, handler);
+ return new DozeScreenBrightness(context, service, sensorManager, sensor, host, handler);
}
private DozeTriggers createDozeTriggers(Context context, SensorManager sensorManager,
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java b/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java
index 9b97634d7419..7db118d7fb1c 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java
@@ -42,6 +42,7 @@ public interface DozeHost {
void onDoubleTap(float x, float y);
+ default void setAodDimmingScrim(float scrimOpacity) {}
void setDozeScreenBrightness(int value);
void onIgnoreTouchWhilePulsing(boolean ignore);
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java
index 32baf9413314..30420529df56 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java
@@ -32,22 +32,28 @@ import com.android.systemui.R;
public class DozeScreenBrightness implements DozeMachine.Part, SensorEventListener {
private final Context mContext;
private final DozeMachine.Service mDozeService;
+ private final DozeHost mDozeHost;
private final Handler mHandler;
private final SensorManager mSensorManager;
private final Sensor mLightSensor;
private final int[] mSensorToBrightness;
+ private final int[] mSensorToScrimOpacity;
private boolean mRegistered;
public DozeScreenBrightness(Context context, DozeMachine.Service service,
- SensorManager sensorManager, Sensor lightSensor, Handler handler) {
+ SensorManager sensorManager, Sensor lightSensor, DozeHost host,
+ Handler handler) {
mContext = context;
mDozeService = service;
mSensorManager = sensorManager;
mLightSensor = lightSensor;
+ mDozeHost = host;
mHandler = handler;
mSensorToBrightness = context.getResources().getIntArray(
R.array.config_doze_brightness_sensor_to_brightness);
+ mSensorToScrimOpacity = context.getResources().getIntArray(
+ R.array.config_doze_brightness_sensor_to_scrim_opacity);
}
@Override
@@ -74,11 +80,24 @@ public class DozeScreenBrightness implements DozeMachine.Part, SensorEventListen
@Override
public void onSensorChanged(SensorEvent event) {
if (mRegistered) {
- int brightness = computeBrightness((int) event.values[0]);
+ int sensorValue = (int) event.values[0];
+ int brightness = computeBrightness(sensorValue);
if (brightness > 0) {
mDozeService.setDozeScreenBrightness(brightness);
}
+
+ int scrimOpacity = computeScrimOpacity(sensorValue);
+ if (scrimOpacity >= 0) {
+ mDozeHost.setAodDimmingScrim(scrimOpacity / 255f);
+ }
+ }
+ }
+
+ private int computeScrimOpacity(int sensorValue) {
+ if (sensorValue < 0 || sensorValue >= mSensorToScrimOpacity.length) {
+ return -1;
}
+ return mSensorToScrimOpacity[sensorValue];
}
private int computeBrightness(int sensorValue) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java
index 2283c130190c..3794ac68b836 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java
@@ -56,6 +56,8 @@ public class DozeScrimController {
private boolean mWakeAndUnlocking;
private boolean mFullyPulsing;
+ private float mAodFrontScrimOpacity = 0;
+
public DozeScrimController(ScrimController scrimController, Context context) {
mContext = context;
mScrimController = scrimController;
@@ -70,7 +72,8 @@ public class DozeScrimController {
mDozingAborted = false;
abortAnimations();
mScrimController.setDozeBehindAlpha(1f);
- mScrimController.setDozeInFrontAlpha(mDozeParameters.getAlwaysOn() ? 0f : 1f);
+ mScrimController.setDozeInFrontAlpha(
+ mDozeParameters.getAlwaysOn() ? mAodFrontScrimOpacity : 1f);
} else {
cancelPulsing();
if (animate) {
@@ -88,6 +91,19 @@ public class DozeScrimController {
}
}
+ /**
+ * Set the opacity of the front scrim when showing AOD1
+ *
+ * Used to emulate lower brightness values than the hardware supports natively.
+ */
+ public void setAodDimmingScrim(float scrimOpacity) {
+ mAodFrontScrimOpacity = scrimOpacity;
+ if (mDozing && !isPulsing() && !mDozingAborted && !mWakeAndUnlocking
+ && mDozeParameters.getAlwaysOn()) {
+ mScrimController.setDozeInFrontAlpha(mAodFrontScrimOpacity);
+ }
+ }
+
public void setWakeAndUnlocking() {
// Immediately abort the doze scrims in case of wake-and-unlock
// for pulsing so the Keyguard fade-out animation scrim can take over.
@@ -126,7 +142,8 @@ public class DozeScrimController {
if (mDozing && !mWakeAndUnlocking) {
mScrimController.setDozeBehindAlpha(1f);
mScrimController.setDozeInFrontAlpha(
- mDozeParameters.getAlwaysOn() && !mDozingAborted ? 0f : 1f);
+ mDozeParameters.getAlwaysOn() && !mDozingAborted ?
+ mAodFrontScrimOpacity : 1f);
}
}
@@ -337,7 +354,7 @@ public class DozeScrimController {
// Signal that the pulse is all finished so we can turn the screen off now.
pulseFinished();
if (mDozeParameters.getAlwaysOn()) {
- mScrimController.setDozeInFrontAlpha(0);
+ mScrimController.setDozeInFrontAlpha(mAodFrontScrimOpacity);
}
}
};
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 fdfd8e88b446..cb96dea08ae0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java
@@ -187,8 +187,12 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback {
Trace.endSection();
return;
}
+ startWakeAndUnlock(calculateMode());
+ }
+
+ public void startWakeAndUnlock(int mode) {
boolean wasDeviceInteractive = mUpdateMonitor.isDeviceInteractive();
- mMode = calculateMode();
+ mMode = mode;
mHasScreenTurnedOnSinceAuthenticating = false;
if (mMode == MODE_WAKE_AND_UNLOCK_PULSING && pulsingOrAod()) {
// If we are waking the device up while we are pulsing the clock and the
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NearestTouchFrame.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NearestTouchFrame.java
index 8bc656354012..004a6043ff94 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NearestTouchFrame.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NearestTouchFrame.java
@@ -15,7 +15,9 @@
package com.android.systemui.statusbar.phone;
import android.content.Context;
+import android.content.res.Configuration;
import android.graphics.Rect;
+import android.support.annotation.VisibleForTesting;
import android.util.AttributeSet;
import android.util.Log;
import android.util.Pair;
@@ -42,8 +44,13 @@ public class NearestTouchFrame extends FrameLayout {
private View mTouchingChild;
public NearestTouchFrame(Context context, AttributeSet attrs) {
+ this(context, attrs, context.getResources().getConfiguration());
+ }
+
+ @VisibleForTesting
+ NearestTouchFrame(Context context, AttributeSet attrs, Configuration c) {
super(context, attrs);
- mIsActive = context.getResources().getConfiguration().smallestScreenWidthDp < 600;
+ mIsActive = c.smallestScreenWidthDp < 600;
}
@Override
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 e95b1767ade6..5d8d01ce0822 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -142,6 +142,7 @@ import android.widget.RemoteViews;
import android.widget.TextView;
import android.widget.Toast;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.colorextraction.ColorExtractor;
import com.android.internal.graphics.ColorUtils;
import com.android.internal.logging.MetricsLogger;
@@ -749,7 +750,7 @@ public class StatusBar extends SystemUI implements DemoMode,
private SysuiColorExtractor mColorExtractor;
private ForegroundServiceController mForegroundServiceController;
private ScreenLifecycle mScreenLifecycle;
- private WakefulnessLifecycle mWakefulnessLifecycle;
+ @VisibleForTesting WakefulnessLifecycle mWakefulnessLifecycle;
private void recycleAllVisibilityObjects(ArraySet<NotificationVisibility> array) {
final int N = array.size();
@@ -3787,6 +3788,15 @@ public class StatusBar extends SystemUI implements DemoMode,
private void dismissKeyguardThenExecute(OnDismissAction action, Runnable cancelAction,
boolean afterKeyguardGone) {
+ if (mWakefulnessLifecycle.getWakefulness() == WAKEFULNESS_ASLEEP
+ && mUnlockMethodCache.canSkipBouncer()
+ && !mLeaveOpenOnKeyguardHide
+ && isPulsing()) {
+ // Reuse the fingerprint wake-and-unlock transition if we dismiss keyguard from a pulse.
+ // TODO: Factor this transition out of FingerprintUnlockController.
+ mFingerprintUnlockController.startWakeAndUnlock(
+ FingerprintUnlockController.MODE_WAKE_AND_UNLOCK_PULSING);
+ }
if (mStatusBarKeyguardViewManager.isShowing()) {
mStatusBarKeyguardViewManager.dismissWithAction(action, cancelAction,
afterKeyguardGone);
@@ -4223,6 +4233,8 @@ public class StatusBar extends SystemUI implements DemoMode,
public void showKeyguard() {
mKeyguardRequested = true;
+ mLeaveOpenOnKeyguardHide = false;
+ mPendingRemoteInputView = null;
updateIsKeyguard();
mAssistManager.onLockscreenShown();
}
@@ -4273,13 +4285,11 @@ public class StatusBar extends SystemUI implements DemoMode,
}
updateKeyguardState(false /* goingToFullShade */, false /* fromShadeLocked */);
updatePanelExpansionForKeyguard();
- mLeaveOpenOnKeyguardHide = false;
if (mDraggedDownRow != null) {
mDraggedDownRow.setUserLocked(false);
mDraggedDownRow.notifyHeightChanged(false /* needsAnimation */);
mDraggedDownRow = null;
}
- mPendingRemoteInputView = null;
}
private void updatePanelExpansionForKeyguard() {
@@ -4419,15 +4429,19 @@ public class StatusBar extends SystemUI implements DemoMode,
setBarState(StatusBarState.SHADE);
View viewToClick = null;
if (mLeaveOpenOnKeyguardHide) {
- mLeaveOpenOnKeyguardHide = false;
+ if (!mKeyguardRequested) {
+ mLeaveOpenOnKeyguardHide = false;
+ }
long delay = calculateGoingToFullShadeDelay();
mNotificationPanel.animateToFullShade(delay);
if (mDraggedDownRow != null) {
mDraggedDownRow.setUserLocked(false);
mDraggedDownRow = null;
}
- viewToClick = mPendingRemoteInputView;
- mPendingRemoteInputView = null;
+ if (!mKeyguardRequested) {
+ viewToClick = mPendingRemoteInputView;
+ mPendingRemoteInputView = null;
+ }
// Disable layout transitions in navbar for this transition because the load is just
// too heavy for the CPU and GPU on any device.
@@ -5566,6 +5580,11 @@ public class StatusBar extends SystemUI implements DemoMode,
mStatusBarWindowManager.setDozeScreenBrightness(value);
}
+ @Override
+ public void setAodDimmingScrim(float scrimOpacity) {
+ mDozeScrimController.setAodDimmingScrim(scrimOpacity);
+ }
+
public void dispatchDoubleTap(float viewX, float viewY) {
dispatchTap(mAmbientIndicationContainer, viewX, viewY);
dispatchTap(mAmbientIndicationContainer, viewX, viewY);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index acf42785f826..314700907f57 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -156,7 +156,6 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
*/
protected void showBouncerOrKeyguard(boolean hideBouncerWhenShowing) {
if (mBouncer.needsFullscreenBouncer() && !mDozing) {
-
// The keyguard might be showing (already). So we need to hide it.
mStatusBar.hideKeyguard();
mBouncer.show(true /* resetSecuritySelection */);
@@ -167,6 +166,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
mBouncer.prepare();
}
}
+ updateStates();
}
private void showBouncer() {
@@ -250,7 +250,9 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
public void setDozing(boolean dozing) {
if (mDozing != dozing) {
mDozing = dozing;
- reset(dozing /* hideBouncerWhenShowing */);
+ if (dozing || mBouncer.needsFullscreenBouncer() || mOccluded) {
+ reset(dozing /* hideBouncerWhenShowing */);
+ }
updateStates();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/util/AsyncSensorManager.java b/packages/SystemUI/src/com/android/systemui/util/AsyncSensorManager.java
index a1cabff4c7aa..5790ba36ac5c 100644
--- a/packages/SystemUI/src/com/android/systemui/util/AsyncSensorManager.java
+++ b/packages/SystemUI/src/com/android/systemui/util/AsyncSensorManager.java
@@ -28,6 +28,7 @@ import android.os.HandlerThread;
import android.os.MemoryFile;
import android.util.Log;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.Preconditions;
import java.util.List;
@@ -46,7 +47,7 @@ public class AsyncSensorManager extends SensorManager {
private final SensorManager mInner;
private final List<Sensor> mSensorCache;
private final HandlerThread mHandlerThread = new HandlerThread("async_sensor");
- private final Handler mHandler;
+ @VisibleForTesting final Handler mHandler;
public AsyncSensorManager(SensorManager inner) {
mInner = inner;
@@ -150,6 +151,12 @@ public class AsyncSensorManager extends SensorManager {
@Override
protected void unregisterListenerImpl(SensorEventListener listener, Sensor sensor) {
- mHandler.post(() -> mInner.unregisterListener(listener, sensor));
+ mHandler.post(() -> {
+ if (sensor == null) {
+ mInner.unregisterListener(listener);
+ } else {
+ mInner.unregisterListener(listener, sensor);
+ }
+ });
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java
index fe3221af418c..c2758068a4ed 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java
@@ -51,14 +51,16 @@ public class DozeScreenBrightnessTest extends SysuiTestCase {
DozeScreenBrightness mScreen;
FakeSensorManager.FakeGenericSensor mSensor;
FakeSensorManager mSensorManager;
+ DozeHostFake mHostFake;
@Before
public void setUp() throws Exception {
mServiceFake = new DozeServiceFake();
+ mHostFake = new DozeHostFake();
mSensorManager = new FakeSensorManager(mContext);
mSensor = mSensorManager.getFakeLightSensor();
mScreen = new DozeScreenBrightness(mContext, mServiceFake, mSensorManager,
- mSensor.getSensor(), null /* handler */);
+ mSensor.getSensor(), mHostFake, null /* handler */);
}
@Test
@@ -133,7 +135,7 @@ public class DozeScreenBrightnessTest extends SysuiTestCase {
@Test
public void testNullSensor() throws Exception {
mScreen = new DozeScreenBrightness(mContext, mServiceFake, mSensorManager,
- null /* sensor */, null /* handler */);
+ null /* sensor */, mHostFake, null /* handler */);
mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
mScreen.transitionTo(INITIALIZED, DOZE_AOD);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NearestTouchFrameTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NearestTouchFrameTest.java
index 577dc52e2290..ed1491d31294 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NearestTouchFrameTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NearestTouchFrameTest.java
@@ -18,10 +18,12 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.content.res.Configuration;
import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
@@ -43,7 +45,29 @@ public class NearestTouchFrameTest extends SysuiTestCase {
@Before
public void setup() {
- mNearestTouchFrame = new NearestTouchFrame(mContext, null);
+ Configuration c = new Configuration(mContext.getResources().getConfiguration());
+ c.smallestScreenWidthDp = 500;
+ mNearestTouchFrame = new NearestTouchFrame(mContext, null, c);
+ }
+
+ @Test
+ public void testNoActionOnLargeDevices() {
+ Configuration c = new Configuration(mContext.getResources().getConfiguration());
+ c.smallestScreenWidthDp = 700;
+ mNearestTouchFrame = new NearestTouchFrame(mContext, null, c);
+
+ View left = mockViewAt(0, 0, 10, 10);
+ View right = mockViewAt(20, 0, 10, 10);
+
+ mNearestTouchFrame.addView(left);
+ mNearestTouchFrame.addView(right);
+ mNearestTouchFrame.onMeasure(0, 0);
+
+ MotionEvent ev = MotionEvent.obtain(0, 0, 0,
+ 12 /* x */, 5 /* y */, 0);
+ mNearestTouchFrame.onTouchEvent(ev);
+ verify(left, never()).onTouchEvent(eq(ev));
+ ev.recycle();
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
index c33897e6b3a1..a706368a0880 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
@@ -65,6 +65,7 @@ import com.android.internal.logging.testing.FakeMetricsLogger;
import com.android.internal.statusbar.IStatusBarService;
import com.android.keyguard.KeyguardHostView.OnDismissAction;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.recents.misc.SystemServicesProxy;
import com.android.systemui.statusbar.ActivatableNotificationView;
import com.android.systemui.statusbar.CommandQueue;
@@ -500,6 +501,14 @@ public class StatusBarTest extends SysuiTestCase {
mSystemServicesProxy = ssp;
mNotificationPanel = panelView;
mBarService = barService;
+ mWakefulnessLifecycle = createAwakeWakefulnessLifecycle();
+ }
+
+ private WakefulnessLifecycle createAwakeWakefulnessLifecycle() {
+ WakefulnessLifecycle wakefulnessLifecycle = new WakefulnessLifecycle();
+ wakefulnessLifecycle.dispatchStartedWakingUp();
+ wakefulnessLifecycle.dispatchFinishedWakingUp();
+ return wakefulnessLifecycle;
}
public void setBarStateForTest(int state) {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/AsyncSensorManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/AsyncSensorManagerTest.java
new file mode 100644
index 000000000000..469bdc0918d9
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/AsyncSensorManagerTest.java
@@ -0,0 +1,98 @@
+/*
+ * 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.util;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+
+import android.hardware.SensorEventListener;
+import android.hardware.SensorManager;
+import android.support.test.filters.SmallTest;
+import android.testing.AndroidTestingRunner;
+
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.utils.hardware.FakeSensorManager;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+public class AsyncSensorManagerTest extends SysuiTestCase {
+
+ private TestableAsyncSensorManager mAsyncSensorManager;
+ private FakeSensorManager mFakeSensorManager;
+ private SensorEventListener mListener;
+ private FakeSensorManager.MockProximitySensor mSensor;
+
+ @Before
+ public void setUp() throws Exception {
+ mFakeSensorManager = new FakeSensorManager(mContext);
+ mAsyncSensorManager = new TestableAsyncSensorManager(mFakeSensorManager);
+ mSensor = mFakeSensorManager.getMockProximitySensor();
+ mListener = mock(SensorEventListener.class);
+ }
+
+ @Test
+ public void registerListenerImpl() throws Exception {
+ mAsyncSensorManager.registerListener(mListener, mSensor.getSensor(), 100);
+
+ mAsyncSensorManager.waitUntilRequestsCompleted();
+
+ // Verify listener was registered.
+ mSensor.sendProximityResult(true);
+ verify(mListener).onSensorChanged(any());
+ }
+
+ @Test
+ public void unregisterListenerImpl_withNullSensor() throws Exception {
+ mAsyncSensorManager.registerListener(mListener, mSensor.getSensor(), 100);
+ mAsyncSensorManager.unregisterListener(mListener);
+
+ mAsyncSensorManager.waitUntilRequestsCompleted();
+
+ // Verify listener was unregistered.
+ mSensor.sendProximityResult(true);
+ verifyNoMoreInteractions(mListener);
+ }
+
+ @Test
+ public void unregisterListenerImpl_withSensor() throws Exception {
+ mAsyncSensorManager.registerListener(mListener, mSensor.getSensor(), 100);
+ mAsyncSensorManager.unregisterListener(mListener, mSensor.getSensor());
+
+ mAsyncSensorManager.waitUntilRequestsCompleted();
+
+ // Verify listener was unregistered.
+ mSensor.sendProximityResult(true);
+ verifyNoMoreInteractions(mListener);
+ }
+
+ private class TestableAsyncSensorManager extends AsyncSensorManager {
+ public TestableAsyncSensorManager(SensorManager sensorManager) {
+ super(sensorManager);
+ }
+
+ public void waitUntilRequestsCompleted() {
+ assertTrue(mHandler.runWithScissors(() -> {}, 0));
+ }
+ }
+} \ No newline at end of file
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index 2aa535064e86..7a19cc3c2c20 100644
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -2161,7 +2161,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
if (mStartingWindowState == STARTING_WINDOW_SHOWN && behindFullscreenActivity) {
if (DEBUG_VISIBILITY) Slog.w(TAG_VISIBILITY, "Found orphaned starting window " + this);
mStartingWindowState = STARTING_WINDOW_REMOVED;
- mWindowContainerController.removeHiddenStartingWindow();
+ mWindowContainerController.removeStartingWindow();
}
}
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 75b24a9461bc..d9c259eabd1a 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -135,6 +135,7 @@ import android.service.notification.SnoozeCriterion;
import android.service.notification.StatusBarNotification;
import android.service.notification.ZenModeConfig;
import android.service.notification.ZenModeProto;
+import android.telecom.TelecomManager;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
@@ -3506,8 +3507,11 @@ public class NotificationManagerService extends SystemService {
private boolean checkDisqualifyingFeatures(int userId, int callingUid, int id, String tag,
NotificationRecord r) {
final String pkg = r.sbn.getPackageName();
+ final String dialerPackage =
+ getContext().getSystemService(TelecomManager.class).getSystemDialerPackage();
final boolean isSystemNotification =
- isUidSystemOrPhone(callingUid) || ("android".equals(pkg));
+ isUidSystemOrPhone(callingUid) || ("android".equals(pkg))
+ || TextUtils.equals(pkg, dialerPackage);
final boolean isNotificationFromListener = mListeners.isListenerPackage(pkg);
// Limit the number of notifications that any given package except the android
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 6afd69dcf137..ae78d7c551c1 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -496,6 +496,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
volatile boolean mEndCallKeyHandled;
volatile boolean mCameraGestureTriggeredDuringGoingToSleep;
volatile boolean mGoingToSleep;
+ volatile boolean mRequestedOrGoingToSleep;
volatile boolean mRecentsVisible;
volatile boolean mPictureInPictureVisible;
// Written by vr manager thread, only read in this class.
@@ -1274,7 +1275,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
if (gestureService != null) {
gesturedServiceIntercepted = gestureService.interceptPowerKeyDown(event, interactive,
mTmpBoolean);
- if (mTmpBoolean.value && mGoingToSleep) {
+ if (mTmpBoolean.value && mRequestedOrGoingToSleep) {
mCameraGestureTriggeredDuringGoingToSleep = true;
}
}
@@ -1402,17 +1403,14 @@ public class PhoneWindowManager implements WindowManagerPolicy {
case SHORT_PRESS_POWER_NOTHING:
break;
case SHORT_PRESS_POWER_GO_TO_SLEEP:
- mPowerManager.goToSleep(eventTime,
- PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON, 0);
+ goToSleep(eventTime, PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON, 0);
break;
case SHORT_PRESS_POWER_REALLY_GO_TO_SLEEP:
- mPowerManager.goToSleep(eventTime,
- PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON,
+ goToSleep(eventTime, PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON,
PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE);
break;
case SHORT_PRESS_POWER_REALLY_GO_TO_SLEEP_AND_GO_HOME:
- mPowerManager.goToSleep(eventTime,
- PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON,
+ goToSleep(eventTime, PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON,
PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE);
launchHomeFromHotKey();
break;
@@ -1437,6 +1435,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
}
+ private void goToSleep(long eventTime, int reason, int flags) {
+ mRequestedOrGoingToSleep = true;
+ mPowerManager.goToSleep(eventTime, reason, flags);
+ }
+
private void shortPressPowerGoHome() {
launchHomeFromHotKey(true /* awakenFromDreams */, false /*respectKeyguard*/);
if (isKeyguardShowingAndNotOccluded()) {
@@ -1469,8 +1472,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
Settings.Global.THEATER_MODE_ON, 1);
if (mGoToSleepOnButtonPressTheaterMode && interactive) {
- mPowerManager.goToSleep(eventTime,
- PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON, 0);
+ goToSleep(eventTime, PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON, 0);
}
}
break;
@@ -1553,8 +1555,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
case SHORT_PRESS_SLEEP_GO_TO_SLEEP:
case SHORT_PRESS_SLEEP_GO_TO_SLEEP_AND_GO_HOME:
Slog.i(TAG, "sleepRelease() calling goToSleep(GO_TO_SLEEP_REASON_SLEEP_BUTTON)");
- mPowerManager.goToSleep(eventTime,
- PowerManager.GO_TO_SLEEP_REASON_SLEEP_BUTTON, 0);
+ goToSleep(eventTime, PowerManager.GO_TO_SLEEP_REASON_SLEEP_BUTTON, 0);
break;
}
}
@@ -6060,7 +6061,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
if ((mEndcallBehavior
& Settings.System.END_BUTTON_BEHAVIOR_SLEEP) != 0) {
- mPowerManager.goToSleep(event.getEventTime(),
+ goToSleep(event.getEventTime(),
PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON, 0);
isWakeKey = false;
}
@@ -6569,8 +6570,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
@Override
public void startedGoingToSleep(int why) {
if (DEBUG_WAKEUP) Slog.i(TAG, "Started going to sleep... (why=" + why + ")");
- mCameraGestureTriggeredDuringGoingToSleep = false;
+
mGoingToSleep = true;
+ mRequestedOrGoingToSleep = true;
+
if (mKeyguardDelegate != null) {
mKeyguardDelegate.onStartedGoingToSleep(why);
}
@@ -6584,6 +6587,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
MetricsLogger.histogram(mContext, "screen_timeout", mLockScreenTimeout / 1000);
mGoingToSleep = false;
+ mRequestedOrGoingToSleep = false;
// We must get this work done here because the power manager will drop
// the wake lock and let the system suspend once this function returns.
@@ -7498,8 +7502,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
private void applyLidSwitchState() {
if (mLidState == LID_CLOSED && mLidControlsSleep) {
- mPowerManager.goToSleep(SystemClock.uptimeMillis(),
- PowerManager.GO_TO_SLEEP_REASON_LID_SWITCH,
+ goToSleep(SystemClock.uptimeMillis(), PowerManager.GO_TO_SLEEP_REASON_LID_SWITCH,
PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE);
} else if (mLidState == LID_CLOSED && mLidControlsScreenLock) {
mWindowManagerFuncs.lockDeviceNow();
diff --git a/services/core/java/com/android/server/wm/AppWindowContainerController.java b/services/core/java/com/android/server/wm/AppWindowContainerController.java
index 4a04af5f9188..e9696d2ab46f 100644
--- a/services/core/java/com/android/server/wm/AppWindowContainerController.java
+++ b/services/core/java/com/android/server/wm/AppWindowContainerController.java
@@ -611,23 +611,7 @@ public class AppWindowContainerController
return mContainer.getTask().getConfiguration().orientation == snapshot.getOrientation();
}
- /**
- * Remove starting window if the app is currently hidden. It is possible the starting window is
- * part of its app exit transition animation in which case we delay hiding the app token. The
- * method allows for removal when window manager has set the app token to hidden.
- */
- public void removeHiddenStartingWindow() {
- synchronized (mWindowMap) {
- if (!mContainer.hidden) {
- if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Starting window app still visible."
- + " Ignoring remove request.");
- return;
- }
- removeStartingWindow();
- }
- }
-
- void removeStartingWindow() {
+ public void removeStartingWindow() {
synchronized (mWindowMap) {
if (mContainer.startingWindow == null) {
if (mContainer.startingData != null) {
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index c4ff455fa3d3..2e4de8c58650 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -193,6 +193,11 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
Task mLastParent;
+ /**
+ * See {@link #canTurnScreenOn()}
+ */
+ private boolean mCanTurnScreenOn = true;
+
AppWindowToken(WindowManagerService service, IApplicationToken token, boolean voiceInteraction,
DisplayContent dc, long inputDispatchingTimeoutNanos, boolean fullscreen,
boolean showForAllUsers, int targetSdk, int orientation, int rotationAnimationHint,
@@ -290,7 +295,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
boolean nowGone = mReportedVisibilityResults.nowGone;
boolean nowDrawn = numInteresting > 0 && numDrawn >= numInteresting;
- boolean nowVisible = numInteresting > 0 && numVisible >= numInteresting;
+ boolean nowVisible = numInteresting > 0 && numVisible >= numInteresting && !hidden;
if (!nowGone) {
// If the app is not yet gone, then it can only become visible/drawn.
if (!nowDrawn) {
@@ -448,7 +453,6 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
mChildren.get(i).mWinAnimator.hide("immediately hidden");
}
SurfaceControl.closeTransaction();
- removeStartingWindow();
}
if (!mService.mClosingApps.contains(this) && !mService.mOpeningApps.contains(this)) {
@@ -526,12 +530,6 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
return super.checkCompleteDeferredRemoval();
}
- private void removeStartingWindow() {
- if (startingData != null && getController() != null) {
- getController().removeStartingWindow();
- }
- }
-
void onRemovedFromDisplay() {
if (mRemovingFromDisplay) {
return;
@@ -559,7 +557,9 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG_WM, "removeAppToken: "
+ this + " delayed=" + delayed + " Callers=" + Debug.getCallers(4));
- removeStartingWindow();
+ if (startingData != null && getController() != null) {
+ getController().removeStartingWindow();
+ }
// If this window was animating, then we need to ensure that the app transition notifies
// that animations have completed in WMS.handleAnimatingStoppedAndTransitionLocked(), so
@@ -649,6 +649,8 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
if (DEBUG_ADD_REMOVE) Slog.v(TAG, "notifyAppResumed: wasStopped=" + wasStopped
+ " " + this);
mAppStopped = false;
+ // Allow the window to turn the screen on once the app is resumed again.
+ setCanTurnScreenOn(true);
if (!wasStopped) {
destroySurfaces(true /*cleanupOnResume*/);
}
@@ -1646,6 +1648,24 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
}
/**
+ * Sets whether the current launch can turn the screen on. See {@link #canTurnScreenOn()}
+ */
+ void setCanTurnScreenOn(boolean canTurnScreenOn) {
+ mCanTurnScreenOn = canTurnScreenOn;
+ }
+
+ /**
+ * Indicates whether the current launch can turn the screen on. This is to prevent multiple
+ * relayouts from turning the screen back on. The screen should only turn on at most
+ * once per activity resume.
+ *
+ * @return true if the screen can be turned on.
+ */
+ boolean canTurnScreenOn() {
+ return mCanTurnScreenOn;
+ }
+
+ /**
* Retrieves whether we'd like to generate a snapshot that's based solely on the theme. This is
* the case when preview screenshots are disabled {@link #setDisablePreviewScreenshots} or when
* we can't take a snapshot for other reasons, for example, if we have a secure window.
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index c610ca381897..0cc505ea9d05 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -1632,9 +1632,14 @@ class WindowStateAnimator {
// 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 (mWin.mTurnOnScreen && mWin.mAppToken.canTurnScreenOn()) {
if (DEBUG_VISIBILITY) Slog.v(TAG, "Show surface turning screen on: " + mWin);
mWin.mTurnOnScreen = false;
+
+ // The window should only turn the screen on once per resume, but
+ // prepareSurfaceLocked can be called multiple times. Set canTurnScreenOn to
+ // false so the window doesn't turn the screen on again during this resume.
+ mWin.mAppToken.setCanTurnScreenOn(false);
mAnimator.mBulkUpdateParams |= SET_TURN_ON_SCREEN;
}
}
diff --git a/wifi/java/android/net/wifi/IWifiManager.aidl b/wifi/java/android/net/wifi/IWifiManager.aidl
index 7972d06e597a..a3a1054f869e 100644
--- a/wifi/java/android/net/wifi/IWifiManager.aidl
+++ b/wifi/java/android/net/wifi/IWifiManager.aidl
@@ -94,7 +94,7 @@ interface IWifiManager
void reassociate();
- WifiInfo getConnectionInfo();
+ WifiInfo getConnectionInfo(String callingPackage);
boolean setWifiEnabled(String packageName, boolean enable);
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index c499edcd3e44..bc37810e5603 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -1643,7 +1643,7 @@ public class WifiManager {
*/
public WifiInfo getConnectionInfo() {
try {
- return mService.getConnectionInfo();
+ return mService.getConnectionInfo(mContext.getOpPackageName());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}