1 /* 2 * Copyright (C) 2024 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 package com.android.systemui.car.systembar; 17 18 import static com.android.systemui.car.systembar.CarSystemBarController.TOP; 19 20 import android.annotation.LayoutRes; 21 import android.content.Context; 22 import android.view.Gravity; 23 import android.view.View; 24 import android.view.ViewGroup; 25 26 import androidx.annotation.Nullable; 27 28 import com.android.systemui.R; 29 import com.android.systemui.car.CarDeviceProvisionedController; 30 import com.android.systemui.car.statusicon.StatusIconPanelViewController; 31 import com.android.systemui.car.systembar.CarSystemBarController.SystemBarSide; 32 import com.android.systemui.car.systembar.element.CarSystemBarElementInitializer; 33 import com.android.systemui.car.window.OverlayVisibilityMediator; 34 import com.android.systemui.settings.UserTracker; 35 36 import dagger.Lazy; 37 import dagger.assisted.Assisted; 38 import dagger.assisted.AssistedFactory; 39 import dagger.assisted.AssistedInject; 40 41 import javax.inject.Provider; 42 43 /** 44 * A controller for initializing the TOP CarSystemBarView. 45 * TODO(b/373710798): remove privacy chip related code when they are migrated to flexible ui. 46 */ 47 public class CarTopSystemBarViewController extends CarSystemBarViewControllerImpl { 48 49 private final CarDeviceProvisionedController mCarDeviceProvisionedController; 50 private final Provider<StatusIconPanelViewController.Builder> mPanelControllerBuilderProvider; 51 52 private int mPrivacyChipXOffset; 53 private StatusIconPanelViewController mMicPanelController; 54 private StatusIconPanelViewController mCameraPanelController; 55 56 @AssistedInject CarTopSystemBarViewController(Context context, UserTracker userTracker, CarSystemBarElementInitializer elementInitializer, SystemBarConfigs systemBarConfigs, ButtonRoleHolderController buttonRoleHolderController, Lazy<CameraPrivacyChipViewController> cameraPrivacyChipViewControllerLazy, Lazy<MicPrivacyChipViewController> micPrivacyChipViewControllerLazy, CarDeviceProvisionedController deviceProvisionedController, Provider<StatusIconPanelViewController.Builder> panelControllerBuilderProvider, OverlayVisibilityMediator overlayVisibilityMediator, @Assisted ViewGroup systemBarView)57 public CarTopSystemBarViewController(Context context, 58 UserTracker userTracker, 59 CarSystemBarElementInitializer elementInitializer, 60 SystemBarConfigs systemBarConfigs, 61 ButtonRoleHolderController buttonRoleHolderController, 62 Lazy<CameraPrivacyChipViewController> cameraPrivacyChipViewControllerLazy, 63 Lazy<MicPrivacyChipViewController> micPrivacyChipViewControllerLazy, 64 CarDeviceProvisionedController deviceProvisionedController, 65 Provider<StatusIconPanelViewController.Builder> panelControllerBuilderProvider, 66 OverlayVisibilityMediator overlayVisibilityMediator, 67 @Assisted ViewGroup systemBarView) { 68 super(context, 69 userTracker, 70 elementInitializer, 71 systemBarConfigs, 72 buttonRoleHolderController, 73 cameraPrivacyChipViewControllerLazy, 74 micPrivacyChipViewControllerLazy, 75 overlayVisibilityMediator, 76 TOP, 77 systemBarView); 78 mCarDeviceProvisionedController = deviceProvisionedController; 79 mPanelControllerBuilderProvider = panelControllerBuilderProvider; 80 81 mPrivacyChipXOffset = -context.getResources() 82 .getDimensionPixelOffset(R.dimen.privacy_chip_horizontal_padding); 83 } 84 85 @Override onInit()86 protected void onInit() { 87 super.onInit(); 88 89 if (isDeviceSetupForUser()) { 90 // We do not want the privacy chips or the profile picker to be clickable in 91 // unprovisioned mode. 92 mMicPanelController = setupSensorQcPanel(mMicPanelController, R.id.mic_privacy_chip, 93 R.layout.qc_mic_panel); 94 mCameraPanelController = setupSensorQcPanel(mCameraPanelController, 95 R.id.camera_privacy_chip, R.layout.qc_camera_panel); 96 } 97 } 98 setupSensorQcPanel( @ullable StatusIconPanelViewController panelController, int chipId, @LayoutRes int panelLayoutRes)99 private StatusIconPanelViewController setupSensorQcPanel( 100 @Nullable StatusIconPanelViewController panelController, int chipId, 101 @LayoutRes int panelLayoutRes) { 102 if (panelController == null) { 103 View privacyChip = mView.findViewById(chipId); 104 if (privacyChip != null) { 105 panelController = mPanelControllerBuilderProvider.get() 106 .setXOffset(mPrivacyChipXOffset) 107 .setGravity(Gravity.TOP | Gravity.END) 108 .build(privacyChip, panelLayoutRes, R.dimen.car_sensor_qc_panel_width); 109 panelController.init(); 110 } 111 } 112 return panelController; 113 } 114 isDeviceSetupForUser()115 private boolean isDeviceSetupForUser() { 116 return mCarDeviceProvisionedController.isCurrentUserSetup() 117 && !mCarDeviceProvisionedController.isCurrentUserSetupInProgress(); 118 } 119 120 @AssistedFactory 121 public interface Factory extends CarSystemBarViewControllerImpl.Factory { 122 @Override create(@ystemBarSide int side, ViewGroup view)123 default CarSystemBarViewControllerImpl create(@SystemBarSide int side, ViewGroup view) { 124 if (side == TOP) { 125 return create(view); 126 } 127 throw new UnsupportedOperationException("Side not supported"); 128 } 129 130 /** Create instance of CarTopSystemBarViewController for system bar views */ create(ViewGroup view)131 CarTopSystemBarViewController create(ViewGroup view); 132 } 133 } 134