diff options
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 Binary files differdeleted file mode 100644 index 82c01ef5cda7..000000000000 --- a/packages/SystemUI/res-keyguard/drawable-hdpi/ic_done_wht.png +++ /dev/null diff --git a/packages/SystemUI/res-keyguard/drawable-mdpi/ic_done_wht.png b/packages/SystemUI/res-keyguard/drawable-mdpi/ic_done_wht.png Binary files differdeleted file mode 100644 index 8c169301911a..000000000000 --- a/packages/SystemUI/res-keyguard/drawable-mdpi/ic_done_wht.png +++ /dev/null diff --git a/packages/SystemUI/res-keyguard/drawable-xhdpi/ic_done_wht.png b/packages/SystemUI/res-keyguard/drawable-xhdpi/ic_done_wht.png Binary files differdeleted file mode 100644 index 6a4d8a7b01ea..000000000000 --- a/packages/SystemUI/res-keyguard/drawable-xhdpi/ic_done_wht.png +++ /dev/null diff --git a/packages/SystemUI/res-keyguard/drawable-xxhdpi/ic_done_wht.png b/packages/SystemUI/res-keyguard/drawable-xxhdpi/ic_done_wht.png Binary files differdeleted file mode 100644 index 4c04ba28b58a..000000000000 --- a/packages/SystemUI/res-keyguard/drawable-xxhdpi/ic_done_wht.png +++ /dev/null diff --git a/packages/SystemUI/res-keyguard/drawable-xxxhdpi/ic_done_wht.png b/packages/SystemUI/res-keyguard/drawable-xxxhdpi/ic_done_wht.png Binary files differdeleted file mode 100644 index bd6c4df14a88..000000000000 --- a/packages/SystemUI/res-keyguard/drawable-xxxhdpi/ic_done_wht.png +++ /dev/null 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(); } |