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