blob: 3c6dc73173574eb38cfd1ee88c24bf3a214a3be6 [file] [log] [blame]
TYM Tsai2fc027d2018-12-04 19:28:19 +08001/*
2 * Copyright (C) 2018 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.content.Context;
Issei Suzukica19e6e2019-02-26 12:39:11 +010020import android.hardware.display.AmbientDisplayConfiguration;
TYM Tsai2fc027d2018-12-04 19:28:19 +080021import android.os.Handler;
Jerry Chang5d3eb4472018-12-21 11:49:06 +080022import android.os.UserHandle;
TYM Tsai2fc027d2018-12-04 19:28:19 +080023import android.util.Log;
24
TYM Tsai2fc027d2018-12-04 19:28:19 +080025import com.android.systemui.dock.DockManager;
Jerry Chang5d3eb4472018-12-21 11:49:06 +080026import com.android.systemui.doze.DozeMachine.State;
TYM Tsai2fc027d2018-12-04 19:28:19 +080027
28import java.io.PrintWriter;
29
30/**
31 * Handles dock events for ambient state changes.
32 */
33public class DozeDockHandler implements DozeMachine.Part {
34
35 private static final String TAG = "DozeDockHandler";
36 private static final boolean DEBUG = DozeService.DEBUG;
37
TYM Tsai2fc027d2018-12-04 19:28:19 +080038 private final DozeMachine mMachine;
39 private final DozeHost mDozeHost;
40 private final AmbientDisplayConfiguration mConfig;
41 private final Handler mHandler;
42 private final DockEventListener mDockEventListener = new DockEventListener();
43 private final DockManager mDockManager;
44
Jerry Chang5d3eb4472018-12-21 11:49:06 +080045 private int mDockState = DockManager.STATE_NONE;
TYM Tsai2fc027d2018-12-04 19:28:19 +080046
47 public DozeDockHandler(Context context, DozeMachine machine, DozeHost dozeHost,
lpeter8a5f4702019-01-18 16:53:07 +080048 AmbientDisplayConfiguration config, Handler handler, DockManager dockManager) {
TYM Tsai2fc027d2018-12-04 19:28:19 +080049 mMachine = machine;
50 mDozeHost = dozeHost;
51 mConfig = config;
52 mHandler = handler;
lpeter8a5f4702019-01-18 16:53:07 +080053 mDockManager = dockManager;
TYM Tsai2fc027d2018-12-04 19:28:19 +080054 }
55
56 @Override
57 public void transitionTo(DozeMachine.State oldState, DozeMachine.State newState) {
58 switch (newState) {
59 case INITIALIZED:
60 mDockEventListener.register();
61 break;
TYM Tsai2fc027d2018-12-04 19:28:19 +080062 case DOZE_AOD:
Jerry Chang5d3eb4472018-12-21 11:49:06 +080063 if (mDockState == DockManager.STATE_DOCKED_HIDE) {
64 mMachine.requestState(State.DOZE);
65 break;
66 }
67 // continue below
68 case DOZE:
69 if (mDockState == DockManager.STATE_DOCKED) {
70 mHandler.post(() -> requestPulse(newState));
71 }
TYM Tsai2fc027d2018-12-04 19:28:19 +080072 break;
73 case FINISH:
74 mDockEventListener.unregister();
75 break;
76 default:
Jerry Chang5d3eb4472018-12-21 11:49:06 +080077 // no-op
TYM Tsai2fc027d2018-12-04 19:28:19 +080078 }
79 }
80
Jerry Chang5d3eb4472018-12-21 11:49:06 +080081 private void requestPulse(State dozeState) {
82 if (mDozeHost.isPulsingBlocked() || !dozeState.canPulse()) {
TYM Tsai2fc027d2018-12-04 19:28:19 +080083 return;
84 }
85
86 mMachine.requestPulse(DozeLog.PULSE_REASON_DOCKING);
87 }
88
Jerry Chang5d3eb4472018-12-21 11:49:06 +080089 private void requestPulseOutNow(State dozeState) {
Lucas Dupin5f00fa52019-03-27 22:46:53 -070090 if (dozeState == State.DOZE_REQUEST_PULSE || dozeState == State.DOZE_PULSING
91 || dozeState == State.DOZE_PULSING_BRIGHT) {
TYM Tsai2d236902018-12-27 16:46:06 +080092 final int pulseReason = mMachine.getPulseReason();
93 if (pulseReason == DozeLog.PULSE_REASON_DOCKING) {
94 mDozeHost.stopPulsing();
95 }
TYM Tsai2fc027d2018-12-04 19:28:19 +080096 }
97 }
98
Jerry Chang5d3eb4472018-12-21 11:49:06 +080099 private boolean isDocked() {
100 return mDockState == DockManager.STATE_DOCKED
101 || mDockState == DockManager.STATE_DOCKED_HIDE;
102 }
103
TYM Tsai2fc027d2018-12-04 19:28:19 +0800104 @Override
105 public void dump(PrintWriter pw) {
Jerry Chang5d3eb4472018-12-21 11:49:06 +0800106 pw.print(" DozeDockTriggers docking="); pw.println(isDocked());
TYM Tsai2fc027d2018-12-04 19:28:19 +0800107 }
108
109 private class DockEventListener implements DockManager.DockEventListener {
110 private boolean mRegistered;
111
112 @Override
113 public void onEvent(int event) {
114 if (DEBUG) Log.d(TAG, "dock event = " + event);
Jerry Chang5d3eb4472018-12-21 11:49:06 +0800115 final DozeMachine.State dozeState = mMachine.getState();
116 mDockState = event;
117 switch (mDockState) {
118 case DockManager.STATE_DOCKED:
119 requestPulse(dozeState);
TYM Tsai2fc027d2018-12-04 19:28:19 +0800120 break;
Jerry Chang5d3eb4472018-12-21 11:49:06 +0800121 case DockManager.STATE_NONE:
122 if (dozeState == State.DOZE
123 && mConfig.alwaysOnEnabled(UserHandle.USER_CURRENT)) {
124 mMachine.requestState(State.DOZE_AOD);
Jerry Chang5d3eb4472018-12-21 11:49:06 +0800125 }
Joanne Chung57be7e12019-03-07 20:02:57 +0800126 else {
127 requestPulseOutNow(dozeState);
128 }
129 break;
Jerry Chang5d3eb4472018-12-21 11:49:06 +0800130 case DockManager.STATE_DOCKED_HIDE:
Joanne Chung57be7e12019-03-07 20:02:57 +0800131 if (dozeState == State.DOZE_AOD) {
132 mMachine.requestState(State.DOZE);
133 } else {
134 requestPulseOutNow(dozeState);
135 }
TYM Tsai2fc027d2018-12-04 19:28:19 +0800136 break;
137 default:
138 // no-op
139 }
140 }
141
142 void register() {
143 if (mRegistered) {
144 return;
145 }
TYM Tsai2fc027d2018-12-04 19:28:19 +0800146 if (mDockManager != null) {
147 mDockManager.addListener(this);
148 }
149 mRegistered = true;
150 }
151
152 void unregister() {
153 if (!mRegistered) {
154 return;
155 }
156 if (mDockManager != null) {
157 mDockManager.removeListener(this);
158 }
159 mRegistered = false;
160 }
161 }
162}