diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index f15475cff7a44..6a7547050ba57 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -209,9 +209,12 @@ false - + false + + false + false diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java index ba8e54aac7591..4d8323bf3fbf9 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java @@ -50,7 +50,8 @@ public class DozeFactory { WakeLock wakeLock = WakeLock.createPartial(context, "Doze"); DozeMachine machine = new DozeMachine( - DozeScreenStatePreventingAdapter.wrapIfNeeded(dozeService, params), + DozeSuspendScreenStatePreventingAdapter.wrapIfNeeded( + DozeScreenStatePreventingAdapter.wrapIfNeeded(dozeService, params), params), config, wakeLock); machine.setParts(new DozeMachine.Part[]{ diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java b/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java index f27521e20bbca..f4984109ed106 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java @@ -87,8 +87,9 @@ public class DozeMachine { case DOZE: return Display.STATE_OFF; case DOZE_PULSING: + return Display.STATE_DOZE; case DOZE_AOD: - return Display.STATE_DOZE; // TODO: use STATE_ON if appropriate. + return Display.STATE_DOZE_SUSPEND; default: return Display.STATE_UNKNOWN; } diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSuspendScreenStatePreventingAdapter.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSuspendScreenStatePreventingAdapter.java new file mode 100644 index 0000000000000..1e067974e3cc5 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSuspendScreenStatePreventingAdapter.java @@ -0,0 +1,66 @@ +/* + * 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.doze; + +import android.support.annotation.VisibleForTesting; +import android.view.Display; + +import com.android.systemui.statusbar.phone.DozeParameters; + +/** + * Prevents usage of doze screen states on devices that don't support them. + */ +public class DozeSuspendScreenStatePreventingAdapter implements DozeMachine.Service { + + private final DozeMachine.Service mInner; + + @VisibleForTesting + DozeSuspendScreenStatePreventingAdapter(DozeMachine.Service inner) { + mInner = inner; + } + + @Override + public void finish() { + mInner.finish(); + } + + @Override + public void setDozeScreenState(int state) { + if (state == Display.STATE_DOZE_SUSPEND) { + state = Display.STATE_DOZE; + } + mInner.setDozeScreenState(state); + } + + @Override + public void requestWakeUp() { + mInner.requestWakeUp(); + } + + /** + * If the device supports the doze display state, return {@code inner}. Otherwise + * return a new instance of {@link DozeSuspendScreenStatePreventingAdapter} wrapping {@code inner}. + */ + public static DozeMachine.Service wrapIfNeeded(DozeMachine.Service inner, + DozeParameters params) { + return isNeeded(params) ? new DozeSuspendScreenStatePreventingAdapter(inner) : inner; + } + + private static boolean isNeeded(DozeParameters params) { + return !params.getDozeSuspendDisplayStateSupported(); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java index 7b2e9979fb33e..2a9de41dcecf0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java @@ -80,6 +80,10 @@ public class DozeParameters { return getBoolean("doze.display.supported", R.bool.doze_display_state_supported); } + public boolean getDozeSuspendDisplayStateSupported() { + return mContext.getResources().getBoolean(R.bool.doze_suspend_display_state_supported); + } + public int getPulseDuration(boolean pickup) { return getPulseInDuration(pickup) + getPulseVisibleDuration() + getPulseOutDuration(); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java index cdbde5e8b0e1b..5771b2819f37e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java @@ -228,7 +228,7 @@ public class DozeMachineTest { mMachine.requestState(DOZE_AOD); - assertEquals(Display.STATE_DOZE, mServiceFake.screenState); + assertEquals(Display.STATE_DOZE_SUSPEND, mServiceFake.screenState); } @Test @@ -258,7 +258,7 @@ public class DozeMachineTest { mMachine.requestState(DOZE_AOD); mMachine.requestState(DOZE_REQUEST_PULSE); - assertEquals(Display.STATE_DOZE, mServiceFake.screenState); + assertEquals(Display.STATE_DOZE_SUSPEND, mServiceFake.screenState); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSuspendScreenStatePreventingAdapterTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSuspendScreenStatePreventingAdapterTest.java new file mode 100644 index 0000000000000..2e3df2ceaefc1 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSuspendScreenStatePreventingAdapterTest.java @@ -0,0 +1,97 @@ +/* + * 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.doze; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertSame; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.support.test.filters.SmallTest; +import android.view.Display; + +import com.android.systemui.statusbar.phone.DozeParameters; + +import org.junit.Before; +import org.junit.Test; + +@SmallTest +public class DozeSuspendScreenStatePreventingAdapterTest { + + private DozeMachine.Service mInner; + private DozeSuspendScreenStatePreventingAdapter mWrapper; + + @Before + public void setup() throws Exception { + mInner = mock(DozeMachine.Service.class); + mWrapper = new DozeSuspendScreenStatePreventingAdapter(mInner); + } + + @Test + public void forwards_finish() throws Exception { + mWrapper.finish(); + verify(mInner).finish(); + } + + @Test + public void forwards_setDozeScreenState_on() throws Exception { + mWrapper.setDozeScreenState(Display.STATE_ON); + verify(mInner).setDozeScreenState(Display.STATE_ON); + } + + @Test + public void forwards_setDozeScreenState_off() throws Exception { + mWrapper.setDozeScreenState(Display.STATE_OFF); + verify(mInner).setDozeScreenState(Display.STATE_OFF); + } + + @Test + public void forwards_setDozeScreenState_doze() throws Exception { + mWrapper.setDozeScreenState(Display.STATE_DOZE); + verify(mInner).setDozeScreenState(Display.STATE_DOZE); + } + + @Test + public void forwards_setDozeScreenState_doze_suspend() throws Exception { + mWrapper.setDozeScreenState(Display.STATE_DOZE_SUSPEND); + verify(mInner).setDozeScreenState(Display.STATE_DOZE); + } + + @Test + public void forwards_requestWakeUp() throws Exception { + mWrapper.requestWakeUp(); + verify(mInner).requestWakeUp(); + } + + @Test + public void wrapIfNeeded_needed() throws Exception { + DozeParameters params = mock(DozeParameters.class); + when(params.getDozeSuspendDisplayStateSupported()).thenReturn(false); + + assertEquals(DozeSuspendScreenStatePreventingAdapter.class, + DozeSuspendScreenStatePreventingAdapter.wrapIfNeeded(mInner, params).getClass()); + } + + @Test + public void wrapIfNeeded_not_needed() throws Exception { + DozeParameters params = mock(DozeParameters.class); + when(params.getDozeSuspendDisplayStateSupported()).thenReturn(true); + + assertSame(mInner, DozeSuspendScreenStatePreventingAdapter.wrapIfNeeded(mInner, params)); + } +} \ No newline at end of file