blob: 31115bb940ad9f287088d58f68121a368fe8ad14 [file] [log] [blame]
Govinda Wassermanc7495cd2019-05-20 14:43:28 -04001/*
2 * Copyright (C) 2019 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.assist;
18
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040019import android.content.Context;
20
21import androidx.annotation.Nullable;
22
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040023import com.android.systemui.assist.AssistHandleBehaviorController.BehaviorController;
Govinda Wasserman3fcd7172019-09-05 16:32:23 -040024import com.android.systemui.keyguard.WakefulnessLifecycle;
Govinda Wasserman7b546482019-09-18 14:35:35 -040025import com.android.systemui.plugins.statusbar.StatusBarStateController;
Govinda Wasserman2c113402019-05-24 14:11:24 -040026import com.android.systemui.recents.OverviewProxyService;
27import com.android.systemui.shared.system.QuickStepContract;
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040028
Govinda Wasserman48cdd682019-06-04 12:15:23 -040029import java.io.PrintWriter;
30
Govinda Wasserman3fcd7172019-09-05 16:32:23 -040031import javax.inject.Inject;
32import javax.inject.Singleton;
33
34import dagger.Lazy;
35
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040036/**
37 * Assistant Handle behavior that makes Assistant handles show/hide when the home handle is
38 * shown/hidden, respectively.
39 */
Govinda Wasserman3fcd7172019-09-05 16:32:23 -040040@Singleton
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040041final class AssistHandleLikeHomeBehavior implements BehaviorController {
42
Govinda Wasserman7b546482019-09-18 14:35:35 -040043 private final StatusBarStateController.StateListener mStatusBarStateListener =
44 new StatusBarStateController.StateListener() {
45 @Override
46 public void onDozingChanged(boolean isDozing) {
47 handleDozingChanged(isDozing);
48 }
49 };
Govinda Wasserman3fcd7172019-09-05 16:32:23 -040050 private final WakefulnessLifecycle.Observer mWakefulnessLifecycleObserver =
51 new WakefulnessLifecycle.Observer() {
Govinda Wasserman2c113402019-05-24 14:11:24 -040052 @Override
Govinda Wasserman3fcd7172019-09-05 16:32:23 -040053 public void onStartedWakingUp() {
Govinda Wasserman7b546482019-09-18 14:35:35 -040054 handleWakefullnessChanged(/* isAwake = */ false);
Govinda Wasserman3fcd7172019-09-05 16:32:23 -040055 }
56
57 @Override
58 public void onFinishedWakingUp() {
Govinda Wasserman7b546482019-09-18 14:35:35 -040059 handleWakefullnessChanged(/* isAwake = */ true);
Govinda Wasserman3fcd7172019-09-05 16:32:23 -040060 }
61
62 @Override
63 public void onStartedGoingToSleep() {
Govinda Wasserman7b546482019-09-18 14:35:35 -040064 handleWakefullnessChanged(/* isAwake = */ false);
Govinda Wasserman3fcd7172019-09-05 16:32:23 -040065 }
66
67 @Override
68 public void onFinishedGoingToSleep() {
Govinda Wasserman7b546482019-09-18 14:35:35 -040069 handleWakefullnessChanged(/* isAwake = */ false);
Govinda Wasserman2c113402019-05-24 14:11:24 -040070 }
71 };
72 private final OverviewProxyService.OverviewProxyListener mOverviewProxyListener =
73 new OverviewProxyService.OverviewProxyListener() {
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040074 @Override
Govinda Wasserman2c113402019-05-24 14:11:24 -040075 public void onSystemUiStateChanged(int sysuiStateFlags) {
76 handleSystemUiStateChange(sysuiStateFlags);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040077 }
78 };
Govinda Wasserman3fcd7172019-09-05 16:32:23 -040079
Govinda Wasserman7b546482019-09-18 14:35:35 -040080 private final Lazy<StatusBarStateController> mStatusBarStateController;
Govinda Wasserman3fcd7172019-09-05 16:32:23 -040081 private final Lazy<WakefulnessLifecycle> mWakefulnessLifecycle;
82 private final Lazy<OverviewProxyService> mOverviewProxyService;
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040083
Govinda Wasserman2c113402019-05-24 14:11:24 -040084 private boolean mIsDozing;
Govinda Wasserman7b546482019-09-18 14:35:35 -040085 private boolean mIsAwake;
Govinda Wasserman2c113402019-05-24 14:11:24 -040086 private boolean mIsHomeHandleHiding;
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040087
88 @Nullable private AssistHandleCallbacks mAssistHandleCallbacks;
89
Govinda Wasserman3fcd7172019-09-05 16:32:23 -040090 @Inject
91 AssistHandleLikeHomeBehavior(
Govinda Wasserman7b546482019-09-18 14:35:35 -040092 Lazy<StatusBarStateController> statusBarStateController,
Govinda Wasserman3fcd7172019-09-05 16:32:23 -040093 Lazy<WakefulnessLifecycle> wakefulnessLifecycle,
94 Lazy<OverviewProxyService> overviewProxyService) {
Govinda Wasserman7b546482019-09-18 14:35:35 -040095 mStatusBarStateController = statusBarStateController;
Govinda Wasserman3fcd7172019-09-05 16:32:23 -040096 mWakefulnessLifecycle = wakefulnessLifecycle;
97 mOverviewProxyService = overviewProxyService;
Govinda Wasserman2c113402019-05-24 14:11:24 -040098 }
99
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400100 @Override
101 public void onModeActivated(Context context, AssistHandleCallbacks callbacks) {
102 mAssistHandleCallbacks = callbacks;
Govinda Wasserman7b546482019-09-18 14:35:35 -0400103 mIsDozing = mStatusBarStateController.get().isDozing();
104 mStatusBarStateController.get().addCallback(mStatusBarStateListener);
105 mIsAwake = mWakefulnessLifecycle.get().getWakefulness()
106 == WakefulnessLifecycle.WAKEFULNESS_AWAKE;
Govinda Wasserman3fcd7172019-09-05 16:32:23 -0400107 mWakefulnessLifecycle.get().addObserver(mWakefulnessLifecycleObserver);
108 mOverviewProxyService.get().addCallback(mOverviewProxyListener);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400109 callbackForCurrentState();
110 }
111
112 @Override
113 public void onModeDeactivated() {
114 mAssistHandleCallbacks = null;
Govinda Wasserman7b546482019-09-18 14:35:35 -0400115 mStatusBarStateController.get().removeCallback(mStatusBarStateListener);
Govinda Wasserman3fcd7172019-09-05 16:32:23 -0400116 mWakefulnessLifecycle.get().removeObserver(mWakefulnessLifecycleObserver);
117 mOverviewProxyService.get().removeCallback(mOverviewProxyListener);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400118 }
119
Govinda Wasserman2c113402019-05-24 14:11:24 -0400120 private static boolean isHomeHandleHiding(int sysuiStateFlags) {
121 return (sysuiStateFlags & QuickStepContract.SYSUI_STATE_NAV_BAR_HIDDEN) != 0;
122 }
123
124 private void handleDozingChanged(boolean isDozing) {
125 if (mIsDozing == isDozing) {
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400126 return;
127 }
128
Govinda Wasserman2c113402019-05-24 14:11:24 -0400129 mIsDozing = isDozing;
130 callbackForCurrentState();
131 }
132
Govinda Wasserman7b546482019-09-18 14:35:35 -0400133 private void handleWakefullnessChanged(boolean isAwake) {
134 if (mIsAwake == isAwake) {
135 return;
136 }
137
138 mIsAwake = isAwake;
139 callbackForCurrentState();
140 }
141
Govinda Wasserman2c113402019-05-24 14:11:24 -0400142 private void handleSystemUiStateChange(int sysuiStateFlags) {
143 boolean isHomeHandleHiding = isHomeHandleHiding(sysuiStateFlags);
144 if (mIsHomeHandleHiding == isHomeHandleHiding) {
145 return;
146 }
147
148 mIsHomeHandleHiding = isHomeHandleHiding;
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400149 callbackForCurrentState();
150 }
151
152 private void callbackForCurrentState() {
153 if (mAssistHandleCallbacks == null) {
154 return;
155 }
156
Govinda Wasserman7b546482019-09-18 14:35:35 -0400157 if (mIsHomeHandleHiding || !isFullyAwake()) {
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400158 mAssistHandleCallbacks.hide();
Govinda Wasserman2c113402019-05-24 14:11:24 -0400159 } else {
160 mAssistHandleCallbacks.showAndStay();
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400161 }
162 }
Govinda Wasserman48cdd682019-06-04 12:15:23 -0400163
Govinda Wasserman7b546482019-09-18 14:35:35 -0400164 private boolean isFullyAwake() {
165 return mIsAwake && !mIsDozing;
166 }
167
Govinda Wasserman48cdd682019-06-04 12:15:23 -0400168 @Override
169 public void dump(PrintWriter pw, String prefix) {
Govinda Wasserman7b546482019-09-18 14:35:35 -0400170 pw.println(prefix + "Current AssistHandleLikeHomeBehavior State:");
Govinda Wasserman48cdd682019-06-04 12:15:23 -0400171
172 pw.println(prefix + " mIsDozing=" + mIsDozing);
Govinda Wasserman7b546482019-09-18 14:35:35 -0400173 pw.println(prefix + " mIsAwake=" + mIsAwake);
Govinda Wasserman48cdd682019-06-04 12:15:23 -0400174 pw.println(prefix + " mIsHomeHandleHiding=" + mIsHomeHandleHiding);
175 }
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400176}