1 /*
2  * Copyright (C) 2023 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.systemui.util.condition;
18 
19 import com.android.systemui.CoreStartable;
20 import com.android.systemui.shared.condition.Condition;
21 import com.android.systemui.shared.condition.Monitor;
22 
23 import java.util.Set;
24 
25 /**
26  * {@link ConditionalCoreStartable} is a {@link com.android.systemui.CoreStartable} abstract
27  * implementation where conditions must be met before routines are executed.
28  */
29 public abstract class ConditionalCoreStartable implements CoreStartable {
30     private final Monitor mMonitor;
31     private final Set<Condition> mConditionSet;
32     private Monitor.Subscription.Token mStartToken;
33     private Monitor.Subscription.Token mBootCompletedToken;
34 
ConditionalCoreStartable(Monitor monitor)35     public ConditionalCoreStartable(Monitor monitor) {
36         this(monitor, null);
37     }
38 
ConditionalCoreStartable(Monitor monitor, Set<Condition> conditionSet)39     public ConditionalCoreStartable(Monitor monitor, Set<Condition> conditionSet) {
40         mMonitor = monitor;
41         mConditionSet = conditionSet;
42     }
43 
44     @Override
start()45     public final void start() {
46         mStartToken = mMonitor.addSubscription(
47                 new Monitor.Subscription.Builder(allConditionsMet -> {
48                     if (allConditionsMet) {
49                         mMonitor.removeSubscription(mStartToken);
50                         mStartToken = null;
51                         onStart();
52                     }
53                 }).addConditions(mConditionSet)
54                         .build());
55     }
56 
onStart()57     protected abstract void onStart();
58 
59     @Override
onBootCompleted()60     public final void onBootCompleted() {
61         mBootCompletedToken = mMonitor.addSubscription(
62                 new Monitor.Subscription.Builder(allConditionsMet -> {
63                     if (allConditionsMet) {
64                         mMonitor.removeSubscription(mBootCompletedToken);
65                         mBootCompletedToken = null;
66                         bootCompleted();
67                     }
68                 }).addConditions(mConditionSet)
69                         .build());
70     }
71 
bootCompleted()72     protected void bootCompleted() {
73     }
74 }
75