blob: 1d7e9eacbd2e3c84188ff101752cede70ce80792 [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;
Jerry Chang9fa6d732019-06-21 18:05:41 +080046 private boolean mPulsePending;
TYM Tsai2fc027d2018-12-04 19:28:19 +080047
48 public DozeDockHandler(Context context, DozeMachine machine, DozeHost dozeHost,
lpeter8a5f4702019-01-18 16:53:07 +080049 AmbientDisplayConfiguration config, Handler handler, DockManager dockManager) {
TYM Tsai2fc027d2018-12-04 19:28:19 +080050 mMachine = machine;
51 mDozeHost = dozeHost;
52 mConfig = config;
53 mHandler = handler;
lpeter8a5f4702019-01-18 16:53:07 +080054 mDockManager = dockManager;
TYM Tsai2fc027d2018-12-04 19:28:19 +080055 }
56
57 @Override
58 public void transitionTo(DozeMachine.State oldState, DozeMachine.State newState) {
59 switch (newState) {
60 case INITIALIZED:
61 mDockEventListener.register();
62 break;
TYM Tsai2fc027d2018-12-04 19:28:19 +080063 case DOZE_AOD:
Jerry Chang5d3eb4472018-12-21 11:49:06 +080064 if (mDockState == DockManager.STATE_DOCKED_HIDE) {
65 mMachine.requestState(State.DOZE);
66 break;
67 }
68 // continue below
69 case DOZE:
Jerry Chang9fa6d732019-06-21 18:05:41 +080070 if (mDockState == DockManager.STATE_DOCKED && !mPulsePending) {
71 mPulsePending = true;
Jerry Chang5d3eb4472018-12-21 11:49:06 +080072 mHandler.post(() -> requestPulse(newState));
73 }
TYM Tsai2fc027d2018-12-04 19:28:19 +080074 break;
75 case FINISH:
76 mDockEventListener.unregister();
77 break;
78 default:
Jerry Chang5d3eb4472018-12-21 11:49:06 +080079 // no-op
TYM Tsai2fc027d2018-12-04 19:28:19 +080080 }
81 }
82
Jerry Chang5d3eb4472018-12-21 11:49:06 +080083 private void requestPulse(State dozeState) {
Jerry Chang9fa6d732019-06-21 18:05:41 +080084 if (!mDozeHost.isPulsingBlocked() && dozeState.canPulse()) {
85 mMachine.requestPulse(DozeLog.PULSE_REASON_DOCKING);
TYM Tsai2fc027d2018-12-04 19:28:19 +080086 }
Jerry Chang9fa6d732019-06-21 18:05:41 +080087 mPulsePending = false;
TYM Tsai2fc027d2018-12-04 19:28:19 +080088 }
89
Jerry Chang5d3eb4472018-12-21 11:49:06 +080090 private void requestPulseOutNow(State dozeState) {
Lucas Dupin5f00fa52019-03-27 22:46:53 -070091 if (dozeState == State.DOZE_REQUEST_PULSE || dozeState == State.DOZE_PULSING
92 || dozeState == State.DOZE_PULSING_BRIGHT) {
TYM Tsai2d236902018-12-27 16:46:06 +080093 final int pulseReason = mMachine.getPulseReason();
94 if (pulseReason == DozeLog.PULSE_REASON_DOCKING) {
95 mDozeHost.stopPulsing();
96 }
TYM Tsai2fc027d2018-12-04 19:28:19 +080097 }
98 }
99
Jerry Chang5d3eb4472018-12-21 11:49:06 +0800100 private boolean isDocked() {
101 return mDockState == DockManager.STATE_DOCKED
102 || mDockState == DockManager.STATE_DOCKED_HIDE;
103 }
104
TYM Tsai2fc027d2018-12-04 19:28:19 +0800105 @Override
106 public void dump(PrintWriter pw) {
Jerry Chang5d3eb4472018-12-21 11:49:06 +0800107 pw.print(" DozeDockTriggers docking="); pw.println(isDocked());
TYM Tsai2fc027d2018-12-04 19:28:19 +0800108 }
109
110 private class DockEventListener implements DockManager.DockEventListener {
111 private boolean mRegistered;
112
113 @Override
114 public void onEvent(int event) {
115 if (DEBUG) Log.d(TAG, "dock event = " + event);
Jerry Chang5d3eb4472018-12-21 11:49:06 +0800116 final DozeMachine.State dozeState = mMachine.getState();
117 mDockState = event;
118 switch (mDockState) {
119 case DockManager.STATE_DOCKED:
120 requestPulse(dozeState);
TYM Tsai2fc027d2018-12-04 19:28:19 +0800121 break;
Jerry Chang5d3eb4472018-12-21 11:49:06 +0800122 case DockManager.STATE_NONE:
123 if (dozeState == State.DOZE
124 && mConfig.alwaysOnEnabled(UserHandle.USER_CURRENT)) {
125 mMachine.requestState(State.DOZE_AOD);
Jerry Chang5d3eb4472018-12-21 11:49:06 +0800126 }
Joanne Chung57be7e12019-03-07 20:02:57 +0800127 else {
128 requestPulseOutNow(dozeState);
129 }
130 break;
Jerry Chang5d3eb4472018-12-21 11:49:06 +0800131 case DockManager.STATE_DOCKED_HIDE:
Joanne Chung57be7e12019-03-07 20:02:57 +0800132 if (dozeState == State.DOZE_AOD) {
133 mMachine.requestState(State.DOZE);
134 } else {
135 requestPulseOutNow(dozeState);
136 }
TYM Tsai2fc027d2018-12-04 19:28:19 +0800137 break;
138 default:
139 // no-op
140 }
141 }
142
143 void register() {
144 if (mRegistered) {
145 return;
146 }
TYM Tsai2fc027d2018-12-04 19:28:19 +0800147 if (mDockManager != null) {
148 mDockManager.addListener(this);
149 }
150 mRegistered = true;
151 }
152
153 void unregister() {
154 if (!mRegistered) {
155 return;
156 }
157 if (mDockManager != null) {
158 mDockManager.removeListener(this);
159 }
160 mRegistered = false;
161 }
162 }
163}