DozeFactory.java revision c1b50324a2286b24b691b8a7190743cbc341727e
1999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar/* 2ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas * Copyright (C) 2016 The Android Open Source Project 3999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar * 4999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License"); 5999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar * you may not use this file except in compliance with the License. 6999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar * You may obtain a copy of the License at 7999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar * 8999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar * http://www.apache.org/licenses/LICENSE-2.0 9999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar * 10999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar * Unless required by applicable law or agreed to in writing, software 11999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS, 12999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar * See the License for the specific language governing permissions and 14999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar * limitations under the License. 15999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar */ 16ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas 17999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyarpackage com.android.systemui.doze; 18e12dfa03641ad9cf0ddf272675bbe7d1198adbfdAurimas Liutikas 19e12dfa03641ad9cf0ddf272675bbe7d1198adbfdAurimas Liutikasimport android.app.AlarmManager; 20e12dfa03641ad9cf0ddf272675bbe7d1198adbfdAurimas Liutikasimport android.app.Application; 21c95a6f1f125ad3a7e1f9f79bccf4b2603bc40ebaAurimas Liutikasimport android.app.PendingIntent; 22c95a6f1f125ad3a7e1f9f79bccf4b2603bc40ebaAurimas Liutikasimport android.content.Context; 23c95a6f1f125ad3a7e1f9f79bccf4b2603bc40ebaAurimas Liutikasimport android.hardware.SensorManager; 24e12dfa03641ad9cf0ddf272675bbe7d1198adbfdAurimas Liutikasimport android.os.Handler; 253911e1c2d38e301d5ffbdf11f808fdc593dd83e9Aga Madurska 26e12dfa03641ad9cf0ddf272675bbe7d1198adbfdAurimas Liutikasimport com.android.internal.hardware.AmbientDisplayConfiguration; 27e12dfa03641ad9cf0ddf272675bbe7d1198adbfdAurimas Liutikasimport com.android.systemui.SystemUIApplication; 28e12dfa03641ad9cf0ddf272675bbe7d1198adbfdAurimas Liutikasimport com.android.systemui.plugins.doze.DozeProvider; 29e12dfa03641ad9cf0ddf272675bbe7d1198adbfdAurimas Liutikasimport com.android.systemui.statusbar.phone.DozeParameters; 30999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyarimport com.android.systemui.util.wakelock.WakeLock; 31999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar 32999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyarpublic class DozeFactory { 33999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar 344143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar private final DozeProvider mDozePlugin; 35999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar 36c95a6f1f125ad3a7e1f9f79bccf4b2603bc40ebaAurimas Liutikas public DozeFactory(DozeProvider plugin) { 37c95a6f1f125ad3a7e1f9f79bccf4b2603bc40ebaAurimas Liutikas mDozePlugin = plugin; 38e12dfa03641ad9cf0ddf272675bbe7d1198adbfdAurimas Liutikas } 39e12dfa03641ad9cf0ddf272675bbe7d1198adbfdAurimas Liutikas 40e12dfa03641ad9cf0ddf272675bbe7d1198adbfdAurimas Liutikas /** Creates a DozeMachine with its parts for {@code dozeService}. */ 41999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar public DozeMachine assembleMachine(DozeService dozeService) { 42999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar Context context = dozeService; 43999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar SensorManager sensorManager = context.getSystemService(SensorManager.class); 44999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar AlarmManager alarmManager = context.getSystemService(AlarmManager.class); 45999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar 46999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar DozeHost host = getHost(dozeService); 47999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar AmbientDisplayConfiguration config = new AmbientDisplayConfiguration(context); 48999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar DozeParameters params = new DozeParameters(context); 49999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar Handler handler = new Handler(); 50999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar WakeLock wakeLock = WakeLock.createPartial(context, "Doze"); 51999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar 52999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar DozeMachine machine = new DozeMachine( 53999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar DozeScreenStatePreventingAdapter.wrapIfNeeded(dozeService, params), 54999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar config, 55999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar wakeLock); 56999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar machine.setParts(new DozeMachine.Part[]{ 57999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar createDozeTriggers(context, sensorManager, host, config, params, handler, wakeLock, 58999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar machine), 594143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar createDozeUi(context, host, wakeLock, machine, handler, alarmManager), 604143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar }); 614143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar 624143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar return machine; 634143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 64999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar 65999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar private DozeTriggers createDozeTriggers(Context context, SensorManager sensorManager, 66999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar DozeHost host, AmbientDisplayConfiguration config, DozeParameters params, 67999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar Handler handler, WakeLock wakeLock, DozeMachine machine) { 68999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar boolean allowPulseTriggers = mDozePlugin == null || mDozePlugin.allowDefaultPulseTriggers(); 69999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar return new DozeTriggers(context, machine, host, config, params, 70999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar sensorManager, handler, wakeLock, allowPulseTriggers); 71999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar } 72999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar 73999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar private DozeMachine.Part createDozeUi(Context context, DozeHost host, WakeLock wakeLock, 74999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar DozeMachine machine, Handler handler, AlarmManager alarmManager) { 75999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar if (mDozePlugin != null) { 76999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar DozeProvider.DozeUi dozeUi = mDozePlugin.provideDozeUi(context, 77999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar pluginMachine(context, machine, host), 78999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar wakeLock); 79999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar return (oldState, newState) -> { 80999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar dozeUi.transitionTo(pluginState(oldState), 81999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar pluginState(newState)); 82999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar }; 83999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar } else { 84999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar return new DozeUi(context, alarmManager, machine, wakeLock, host, handler); 85999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar } 86999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar } 87999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar 88999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar private DozeProvider.DozeMachine pluginMachine(Context context, DozeMachine machine, 893911e1c2d38e301d5ffbdf11f808fdc593dd83e9Aga Madurska DozeHost host) { 903911e1c2d38e301d5ffbdf11f808fdc593dd83e9Aga Madurska return new DozeProvider.DozeMachine() { 913911e1c2d38e301d5ffbdf11f808fdc593dd83e9Aga Madurska @Override 923911e1c2d38e301d5ffbdf11f808fdc593dd83e9Aga Madurska public void requestState(DozeProvider.DozeState state) { 933911e1c2d38e301d5ffbdf11f808fdc593dd83e9Aga Madurska if (state == DozeProvider.DozeState.WAKE_UP) { 943911e1c2d38e301d5ffbdf11f808fdc593dd83e9Aga Madurska machine.wakeUp(); 95999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar return; 96999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar } 97999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar machine.requestState(implState(state)); 983911e1c2d38e301d5ffbdf11f808fdc593dd83e9Aga Madurska } 993911e1c2d38e301d5ffbdf11f808fdc593dd83e9Aga Madurska 100999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar @Override 101999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar public void requestSendIntent(PendingIntent intent) { 102999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar host.startPendingIntentDismissingKeyguard(intent); 1033911e1c2d38e301d5ffbdf11f808fdc593dd83e9Aga Madurska } 104999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar }; 105999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar } 106999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar 1074143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar private DozeMachine.State implState(DozeProvider.DozeState s) { 1084143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar switch (s) { 1094143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar case UNINITIALIZED: 110e12dfa03641ad9cf0ddf272675bbe7d1198adbfdAurimas Liutikas return DozeMachine.State.UNINITIALIZED; 111e12dfa03641ad9cf0ddf272675bbe7d1198adbfdAurimas Liutikas case INITIALIZED: 1124143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar return DozeMachine.State.INITIALIZED; 1134143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar case DOZE: 1144143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar return DozeMachine.State.DOZE; 1153911e1c2d38e301d5ffbdf11f808fdc593dd83e9Aga Madurska case DOZE_AOD: 1163911e1c2d38e301d5ffbdf11f808fdc593dd83e9Aga Madurska return DozeMachine.State.DOZE_AOD; 1173911e1c2d38e301d5ffbdf11f808fdc593dd83e9Aga Madurska case DOZE_REQUEST_PULSE: 1183911e1c2d38e301d5ffbdf11f808fdc593dd83e9Aga Madurska return DozeMachine.State.DOZE_REQUEST_PULSE; 119999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar case DOZE_PULSING: 120999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar return DozeMachine.State.DOZE_PULSING; 121999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar case DOZE_PULSE_DONE: 122999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar return DozeMachine.State.DOZE_PULSE_DONE; 123999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar case FINISH: 124999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar return DozeMachine.State.FINISH; 125999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar default: 126999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar throw new IllegalArgumentException("Unknown state: " + s); 127999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar } 128999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar } 129999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar 130999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar private DozeProvider.DozeState pluginState(DozeMachine.State s) { 131999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar switch (s) { 132999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar case UNINITIALIZED: 133999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar return DozeProvider.DozeState.UNINITIALIZED; 134999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar case INITIALIZED: 135999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar return DozeProvider.DozeState.INITIALIZED; 136999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar case DOZE: 137999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar return DozeProvider.DozeState.DOZE; 138999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar case DOZE_AOD: 139999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar return DozeProvider.DozeState.DOZE_AOD; 140999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar case DOZE_REQUEST_PULSE: 141999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar return DozeProvider.DozeState.DOZE_REQUEST_PULSE; 142999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar case DOZE_PULSING: 143999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar return DozeProvider.DozeState.DOZE_PULSING; 144999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar case DOZE_PULSE_DONE: 145999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar return DozeProvider.DozeState.DOZE_PULSE_DONE; 146999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar case FINISH: 147999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar return DozeProvider.DozeState.FINISH; 148999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar default: 149999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar throw new IllegalArgumentException("Unknown state: " + s); 150999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar } 151999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar } 152999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar 15342e7d6fafcde7bfe261dd7d8d75ee53ca0cd6790Aurimas Liutikas public static DozeHost getHost(DozeService service) { 154999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar Application appCandidate = service.getApplication(); 155999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar final SystemUIApplication app = (SystemUIApplication) appCandidate; 156999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar return app.getComponent(DozeHost.class); 157999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar } 158999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar} 159999c3976674d20b0de5425490bdfe7415b9c6af2Yigit Boyar