DozeFactory.java revision 0fb55aedaebd0d060254e9f8fe042fa65ce9b448
1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.systemui.doze;
18
19import android.app.AlarmManager;
20import android.app.Application;
21import android.app.PendingIntent;
22import android.content.Context;
23import android.hardware.SensorManager;
24import android.os.Handler;
25
26import com.android.internal.hardware.AmbientDisplayConfiguration;
27import com.android.systemui.SystemUIApplication;
28import com.android.systemui.plugins.doze.DozeProvider;
29import com.android.systemui.statusbar.phone.DozeParameters;
30import com.android.systemui.util.wakelock.DelayedWakeLock;
31import com.android.systemui.util.wakelock.WakeLock;
32
33public class DozeFactory {
34
35    private final DozeProvider mDozePlugin;
36
37    public DozeFactory(DozeProvider plugin) {
38        mDozePlugin = plugin;
39    }
40
41    /** Creates a DozeMachine with its parts for {@code dozeService}. */
42    public DozeMachine assembleMachine(DozeService dozeService) {
43        Context context = dozeService;
44        SensorManager sensorManager = context.getSystemService(SensorManager.class);
45        AlarmManager alarmManager = context.getSystemService(AlarmManager.class);
46
47        DozeHost host = getHost(dozeService);
48        AmbientDisplayConfiguration config = new AmbientDisplayConfiguration(context);
49        DozeParameters params = new DozeParameters(context);
50        Handler handler = new Handler();
51        WakeLock wakeLock = new DelayedWakeLock(handler,
52                WakeLock.createPartial(context, "Doze"));
53
54        DozeMachine machine = new DozeMachine(
55                DozeSuspendScreenStatePreventingAdapter.wrapIfNeeded(
56                        DozeScreenStatePreventingAdapter.wrapIfNeeded(dozeService, params), params),
57                config,
58                wakeLock);
59        machine.setParts(new DozeMachine.Part[]{
60                createDozeTriggers(context, sensorManager, host, config, params, handler, wakeLock,
61                        machine),
62                createDozeUi(context, host, wakeLock, machine, handler, alarmManager),
63        });
64
65        return machine;
66    }
67
68    private DozeTriggers createDozeTriggers(Context context, SensorManager sensorManager,
69            DozeHost host, AmbientDisplayConfiguration config, DozeParameters params,
70            Handler handler, WakeLock wakeLock, DozeMachine machine) {
71        boolean allowPulseTriggers = mDozePlugin == null || mDozePlugin.allowDefaultPulseTriggers();
72        return new DozeTriggers(context, machine, host, config, params,
73                sensorManager, handler, wakeLock, allowPulseTriggers);
74    }
75
76    private DozeMachine.Part createDozeUi(Context context, DozeHost host, WakeLock wakeLock,
77            DozeMachine machine, Handler handler, AlarmManager alarmManager) {
78        if (mDozePlugin != null) {
79            DozeProvider.DozeUi dozeUi = mDozePlugin.provideDozeUi(context,
80                    pluginMachine(context, machine, host),
81                    wakeLock);
82            return (oldState, newState) -> {
83                dozeUi.transitionTo(pluginState(oldState),
84                        pluginState(newState));
85            };
86        } else {
87            return new DozeUi(context, alarmManager, machine, wakeLock, host, handler);
88        }
89    }
90
91    private DozeProvider.DozeMachine pluginMachine(Context context, DozeMachine machine,
92            DozeHost host) {
93        return new DozeProvider.DozeMachine() {
94            @Override
95            public void requestState(DozeProvider.DozeState state) {
96                if (state == DozeProvider.DozeState.WAKE_UP) {
97                    machine.wakeUp();
98                    return;
99                }
100                machine.requestState(implState(state));
101            }
102
103            @Override
104            public void requestSendIntent(PendingIntent intent) {
105                host.startPendingIntentDismissingKeyguard(intent);
106            }
107        };
108    }
109
110    private DozeMachine.State implState(DozeProvider.DozeState s) {
111        switch (s) {
112            case UNINITIALIZED:
113                return DozeMachine.State.UNINITIALIZED;
114            case INITIALIZED:
115                return DozeMachine.State.INITIALIZED;
116            case DOZE:
117                return DozeMachine.State.DOZE;
118            case DOZE_AOD:
119                return DozeMachine.State.DOZE_AOD;
120            case DOZE_REQUEST_PULSE:
121                return DozeMachine.State.DOZE_REQUEST_PULSE;
122            case DOZE_PULSING:
123                return DozeMachine.State.DOZE_PULSING;
124            case DOZE_PULSE_DONE:
125                return DozeMachine.State.DOZE_PULSE_DONE;
126            case FINISH:
127                return DozeMachine.State.FINISH;
128            default:
129                throw new IllegalArgumentException("Unknown state: " + s);
130        }
131    }
132
133    private DozeProvider.DozeState pluginState(DozeMachine.State s) {
134        switch (s) {
135            case UNINITIALIZED:
136                return DozeProvider.DozeState.UNINITIALIZED;
137            case INITIALIZED:
138                return DozeProvider.DozeState.INITIALIZED;
139            case DOZE:
140                return DozeProvider.DozeState.DOZE;
141            case DOZE_AOD:
142                return DozeProvider.DozeState.DOZE_AOD;
143            case DOZE_REQUEST_PULSE:
144                return DozeProvider.DozeState.DOZE_REQUEST_PULSE;
145            case DOZE_PULSING:
146                return DozeProvider.DozeState.DOZE_PULSING;
147            case DOZE_PULSE_DONE:
148                return DozeProvider.DozeState.DOZE_PULSE_DONE;
149            case FINISH:
150                return DozeProvider.DozeState.FINISH;
151            default:
152                throw new IllegalArgumentException("Unknown state: " + s);
153        }
154    }
155
156    public static DozeHost getHost(DozeService service) {
157        Application appCandidate = service.getApplication();
158        final SystemUIApplication app = (SystemUIApplication) appCandidate;
159        return app.getComponent(DozeHost.class);
160    }
161}
162