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