1 /* 2 * Copyright (C) 2021 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.statusbar.phone; 18 19 import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE; 20 import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT; 21 import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSLUCENT; 22 import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT; 23 import static com.android.systemui.statusbar.phone.BarTransitions.MODE_WARNING; 24 import static com.android.systemui.statusbar.phone.fragment.dagger.StatusBarFragmentModule.OPERATOR_NAME_VIEW; 25 26 import android.annotation.NonNull; 27 import android.os.Bundle; 28 import android.view.View; 29 30 import com.android.systemui.dagger.qualifiers.DisplayId; 31 import com.android.systemui.demomode.DemoMode; 32 import com.android.systemui.demomode.DemoModeCommandReceiver; 33 import com.android.systemui.demomode.DemoModeController; 34 import com.android.systemui.navigationbar.NavigationBarController; 35 import com.android.systemui.statusbar.phone.fragment.dagger.StatusBarFragmentScope; 36 import com.android.systemui.statusbar.policy.Clock; 37 import com.android.systemui.util.ViewController; 38 39 import java.util.ArrayList; 40 import java.util.List; 41 42 import javax.inject.Inject; 43 import javax.inject.Named; 44 45 /** 46 * A controller that updates status-bar-related views during demo mode. 47 * 48 * This class extends ViewController not because it controls a specific view, but because we want it 49 * to get torn down and re-created in line with the view's lifecycle. 50 */ 51 @StatusBarFragmentScope 52 public class StatusBarDemoMode extends ViewController<View> implements DemoMode { 53 private final Clock mClockView; 54 private final View mOperatorNameView; 55 private final DemoModeController mDemoModeController; 56 private final PhoneStatusBarTransitions mPhoneStatusBarTransitions; 57 private final NavigationBarController mNavigationBarController; 58 private final int mDisplayId; 59 60 @Inject StatusBarDemoMode( Clock clockView, @Named(OPERATOR_NAME_VIEW) View operatorNameView, DemoModeController demoModeController, PhoneStatusBarTransitions phoneStatusBarTransitions, NavigationBarController navigationBarController, @DisplayId int displayId)61 StatusBarDemoMode( 62 Clock clockView, 63 @Named(OPERATOR_NAME_VIEW) View operatorNameView, 64 DemoModeController demoModeController, 65 PhoneStatusBarTransitions phoneStatusBarTransitions, 66 NavigationBarController navigationBarController, 67 @DisplayId int displayId) { 68 super(clockView); 69 mClockView = clockView; 70 mOperatorNameView = operatorNameView; 71 mDemoModeController = demoModeController; 72 mPhoneStatusBarTransitions = phoneStatusBarTransitions; 73 mNavigationBarController = navigationBarController; 74 mDisplayId = displayId; 75 } 76 77 @Override onViewAttached()78 protected void onViewAttached() { 79 mDemoModeController.addCallback(this); 80 } 81 82 @Override onViewDetached()83 protected void onViewDetached() { 84 mDemoModeController.removeCallback(this); 85 } 86 87 @Override demoCommands()88 public List<String> demoCommands() { 89 List<String> s = new ArrayList<>(); 90 s.add(DemoMode.COMMAND_BARS); 91 s.add(DemoMode.COMMAND_CLOCK); 92 s.add(DemoMode.COMMAND_OPERATOR); 93 return s; 94 } 95 96 @Override onDemoModeStarted()97 public void onDemoModeStarted() { 98 // Must send this message to any view that we delegate to via dispatchDemoCommandToView 99 dispatchDemoModeStartedToView(mClockView); 100 dispatchDemoModeStartedToView(mOperatorNameView); 101 } 102 103 @Override onDemoModeFinished()104 public void onDemoModeFinished() { 105 dispatchDemoModeFinishedToView(mClockView); 106 dispatchDemoModeFinishedToView(mOperatorNameView); 107 } 108 109 @Override dispatchDemoCommand(String command, @NonNull Bundle args)110 public void dispatchDemoCommand(String command, @NonNull Bundle args) { 111 if (command.equals(COMMAND_CLOCK)) { 112 dispatchDemoCommandToView(command, args, mClockView); 113 } 114 if (command.equals(COMMAND_OPERATOR)) { 115 dispatchDemoCommandToView(command, args, mOperatorNameView); 116 } 117 if (command.equals(COMMAND_BARS)) { 118 String mode = args.getString("mode"); 119 int barMode = "opaque".equals(mode) ? MODE_OPAQUE : 120 "translucent".equals(mode) ? MODE_TRANSLUCENT : 121 "semi-transparent".equals(mode) ? MODE_SEMI_TRANSPARENT : 122 "transparent".equals(mode) ? MODE_TRANSPARENT : 123 "warning".equals(mode) ? MODE_WARNING : 124 -1; 125 if (barMode != -1) { 126 boolean animate = true; 127 mPhoneStatusBarTransitions.transitionTo(barMode, animate); 128 mNavigationBarController.transitionTo(mDisplayId, barMode, animate); 129 } 130 } 131 } 132 dispatchDemoModeStartedToView(View v)133 private void dispatchDemoModeStartedToView(View v) { 134 if (v instanceof DemoModeCommandReceiver) { 135 ((DemoModeCommandReceiver) v).onDemoModeStarted(); 136 } 137 } 138 dispatchDemoCommandToView(String command, Bundle args, View v)139 private void dispatchDemoCommandToView(String command, Bundle args, View v) { 140 if (v instanceof DemoModeCommandReceiver) { 141 ((DemoModeCommandReceiver) v).dispatchDemoCommand(command, args); 142 } 143 } 144 dispatchDemoModeFinishedToView(View v)145 private void dispatchDemoModeFinishedToView(View v) { 146 if (v instanceof DemoModeCommandReceiver) { 147 ((DemoModeCommandReceiver) v).onDemoModeFinished(); 148 } 149 } 150 } 151