1 /*
2  * Copyright (C) 2020 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 
17 package com.android.wm.shell.onehanded;
18 
19 import static com.android.wm.shell.onehanded.OneHandedSettingsUtil.ONE_HANDED_TIMEOUT_MEDIUM_IN_SECONDS;
20 
21 import androidx.annotation.NonNull;
22 import androidx.annotation.VisibleForTesting;
23 
24 import com.android.wm.shell.common.ShellExecutor;
25 
26 import java.io.PrintWriter;
27 import java.util.ArrayList;
28 import java.util.List;
29 import java.util.concurrent.TimeUnit;
30 
31 /**
32  * Timeout handler for stop one handed mode operations.
33  */
34 public class OneHandedTimeoutHandler {
35     private static final String TAG = "OneHandedTimeoutHandler";
36 
37     private final ShellExecutor mMainExecutor;
38 
39     // Default timeout is ONE_HANDED_TIMEOUT_MEDIUM
40     private @OneHandedSettingsUtil.OneHandedTimeout int mTimeout =
41             ONE_HANDED_TIMEOUT_MEDIUM_IN_SECONDS;
42     private long mTimeoutMs = TimeUnit.SECONDS.toMillis(mTimeout);
43     private final Runnable mTimeoutRunnable = this::onStop;
44     private List<TimeoutListener> mListeners = new ArrayList<>();
45 
46     /**
47      * Get the current config of timeout
48      *
49      * @return timeout of current config
50      */
getTimeout()51     public @OneHandedSettingsUtil.OneHandedTimeout int getTimeout() {
52         return mTimeout;
53     }
54 
55     /**
56      * Listens for notify timeout events
57      */
58     public interface TimeoutListener {
59         /**
60          * Called whenever the config time out
61          *
62          * @param timeoutTime The time in seconds to trigger timeout
63          */
onTimeout(int timeoutTime)64         void onTimeout(int timeoutTime);
65     }
66 
OneHandedTimeoutHandler(ShellExecutor mainExecutor)67     public OneHandedTimeoutHandler(ShellExecutor mainExecutor) {
68         mMainExecutor = mainExecutor;
69     }
70 
71     /**
72      * Set the specific timeout of {@link OneHandedSettingsUtil.OneHandedTimeout}
73      */
setTimeout(@neHandedSettingsUtil.OneHandedTimeout int timeout)74     public void setTimeout(@OneHandedSettingsUtil.OneHandedTimeout int timeout) {
75         mTimeout = timeout;
76         mTimeoutMs = TimeUnit.SECONDS.toMillis(mTimeout);
77         resetTimer();
78     }
79 
80     /**
81      * Reset the timer when one handed trigger or user is operating in some conditions
82      */
removeTimer()83     public void removeTimer() {
84         mMainExecutor.removeCallbacks(mTimeoutRunnable);
85     }
86 
87     /**
88      * Reset the timer when one handed trigger or user is operating in some conditions
89      */
resetTimer()90     public void resetTimer() {
91         removeTimer();
92         if (mTimeout == OneHandedSettingsUtil.ONE_HANDED_TIMEOUT_NEVER) {
93             return;
94         }
95         if (mTimeout != OneHandedSettingsUtil.ONE_HANDED_TIMEOUT_NEVER) {
96             mMainExecutor.executeDelayed(mTimeoutRunnable, mTimeoutMs);
97         }
98     }
99 
100     /**
101      * Register timeout listener to receive time out events
102      *
103      * @param listener the listener be sent events when times up
104      */
registerTimeoutListener(TimeoutListener listener)105     public void registerTimeoutListener(TimeoutListener listener) {
106         mListeners.add(listener);
107     }
108 
109     @VisibleForTesting
hasScheduledTimeout()110     boolean hasScheduledTimeout() {
111         return mMainExecutor.hasCallback(mTimeoutRunnable);
112     }
113 
onStop()114     private void onStop() {
115         for (int i = mListeners.size() - 1; i >= 0; i--) {
116             final TimeoutListener listener = mListeners.get(i);
117             listener.onTimeout(mTimeout);
118         }
119     }
120 
dump(@onNull PrintWriter pw)121     void dump(@NonNull PrintWriter pw) {
122         final String innerPrefix = "  ";
123         pw.println(TAG);
124         pw.print(innerPrefix + "sTimeout=");
125         pw.println(mTimeout);
126         pw.print(innerPrefix + "sListeners=");
127         pw.println(mListeners);
128     }
129 
130 }
131