1 /* 2 * Copyright (C) 2022 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.accessibility.floatingmenu; 18 19 import static com.android.internal.accessibility.AccessibilityShortcutController.ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME; 20 21 import static java.util.Collections.emptyList; 22 23 import android.content.ComponentName; 24 import android.content.Context; 25 import android.view.accessibility.AccessibilityManager; 26 27 import androidx.lifecycle.LiveData; 28 import androidx.lifecycle.MutableLiveData; 29 import androidx.lifecycle.Transformations; 30 31 import com.android.internal.accessibility.dialog.AccessibilityTarget; 32 import com.android.settingslib.bluetooth.HearingAidDeviceManager; 33 import com.android.systemui.util.settings.SecureSettings; 34 35 import java.util.List; 36 37 /** 38 * The view model provides the menu information from the repository{@link MenuInfoRepository} for 39 * the menu view{@link MenuView}. 40 */ 41 class MenuViewModel implements MenuInfoRepository.OnContentsChanged { 42 private final MutableLiveData<List<AccessibilityTarget>> mTargetFeaturesData = 43 new MutableLiveData<>(emptyList()); 44 private final MutableLiveData<Integer> mSizeTypeData = new MutableLiveData<>(); 45 private final MutableLiveData<MenuFadeEffectInfo> mFadeEffectInfoData = 46 new MutableLiveData<>(); 47 private final MutableLiveData<Boolean> mMoveToTuckedData = new MutableLiveData<>(); 48 private final MutableLiveData<Boolean> mDockTooltipData = new MutableLiveData<>(); 49 private final MutableLiveData<Boolean> mMigrationTooltipData = new MutableLiveData<>(); 50 private final MutableLiveData<Position> mPercentagePositionData = new MutableLiveData<>(); 51 private final MutableLiveData<Integer> mHearingDeviceStatusData = new MutableLiveData<>( 52 HearingAidDeviceManager.ConnectionStatus.NO_DEVICE_BONDED); 53 private final LiveData<Integer> mHearingDeviceTargetIndex = Transformations.map( 54 mTargetFeaturesData, this::getHearingDeviceTargetIndex); 55 56 private final MenuInfoRepository mInfoRepository; 57 MenuViewModel(Context context, AccessibilityManager accessibilityManager, SecureSettings secureSettings, HearingAidDeviceManager hearingAidDeviceManager)58 MenuViewModel(Context context, AccessibilityManager accessibilityManager, 59 SecureSettings secureSettings, HearingAidDeviceManager hearingAidDeviceManager) { 60 mInfoRepository = new MenuInfoRepository(context, 61 accessibilityManager, /* settingsContentsChanged= */ this, secureSettings, 62 hearingAidDeviceManager); 63 } 64 65 @Override onTargetFeaturesChanged(List<AccessibilityTarget> newTargetFeatures)66 public void onTargetFeaturesChanged(List<AccessibilityTarget> newTargetFeatures) { 67 mTargetFeaturesData.setValue(newTargetFeatures); 68 } 69 70 @Override onSizeTypeChanged(int newSizeType)71 public void onSizeTypeChanged(int newSizeType) { 72 mSizeTypeData.setValue(newSizeType); 73 } 74 75 @Override onFadeEffectInfoChanged(MenuFadeEffectInfo fadeEffectInfo)76 public void onFadeEffectInfoChanged(MenuFadeEffectInfo fadeEffectInfo) { 77 mFadeEffectInfoData.setValue(fadeEffectInfo); 78 } 79 80 @Override onDevicesConnectionStatusChanged( @earingAidDeviceManager.ConnectionStatus int status)81 public void onDevicesConnectionStatusChanged( 82 @HearingAidDeviceManager.ConnectionStatus int status) { 83 mHearingDeviceStatusData.postValue(status); 84 } 85 updateMenuMoveToTucked(boolean isMoveToTucked)86 void updateMenuMoveToTucked(boolean isMoveToTucked) { 87 mInfoRepository.updateMoveToTucked(isMoveToTucked); 88 } 89 updateMenuSavingPosition(Position percentagePosition)90 void updateMenuSavingPosition(Position percentagePosition) { 91 mInfoRepository.updateMenuSavingPosition(percentagePosition); 92 } 93 updateDockTooltipVisibility(boolean hasSeen)94 void updateDockTooltipVisibility(boolean hasSeen) { 95 mInfoRepository.updateDockTooltipVisibility(hasSeen); 96 } 97 updateMigrationTooltipVisibility(boolean visible)98 void updateMigrationTooltipVisibility(boolean visible) { 99 mInfoRepository.updateMigrationTooltipVisibility(visible); 100 } 101 getMoveToTuckedData()102 LiveData<Boolean> getMoveToTuckedData() { 103 mInfoRepository.loadMenuMoveToTucked(mMoveToTuckedData::setValue); 104 return mMoveToTuckedData; 105 } 106 getDockTooltipVisibilityData()107 LiveData<Boolean> getDockTooltipVisibilityData() { 108 mInfoRepository.loadDockTooltipVisibility(mDockTooltipData::setValue); 109 return mDockTooltipData; 110 } 111 getMigrationTooltipVisibilityData()112 LiveData<Boolean> getMigrationTooltipVisibilityData() { 113 mInfoRepository.loadMigrationTooltipVisibility(mMigrationTooltipData::setValue); 114 return mMigrationTooltipData; 115 } 116 getPercentagePositionData()117 LiveData<Position> getPercentagePositionData() { 118 mInfoRepository.loadMenuPosition(mPercentagePositionData::setValue); 119 return mPercentagePositionData; 120 } 121 getSizeTypeData()122 LiveData<Integer> getSizeTypeData() { 123 mInfoRepository.loadMenuSizeType(mSizeTypeData::setValue); 124 return mSizeTypeData; 125 } 126 getFadeEffectInfoData()127 LiveData<MenuFadeEffectInfo> getFadeEffectInfoData() { 128 mInfoRepository.loadMenuFadeEffectInfo(mFadeEffectInfoData::setValue); 129 return mFadeEffectInfoData; 130 } 131 getTargetFeaturesData()132 LiveData<List<AccessibilityTarget>> getTargetFeaturesData() { 133 mInfoRepository.loadMenuTargetFeatures(mTargetFeaturesData::setValue); 134 return mTargetFeaturesData; 135 } 136 loadHearingDeviceStatus()137 LiveData<Integer> loadHearingDeviceStatus() { 138 mInfoRepository.loadHearingDeviceStatus(mHearingDeviceStatusData::setValue); 139 return mHearingDeviceStatusData; 140 } 141 getHearingDeviceStatusData()142 LiveData<Integer> getHearingDeviceStatusData() { 143 return mHearingDeviceStatusData; 144 } 145 getHearingDeviceTargetIndexData()146 LiveData<Integer> getHearingDeviceTargetIndexData() { 147 return mHearingDeviceTargetIndex; 148 } 149 registerObserversAndCallbacks()150 void registerObserversAndCallbacks() { 151 mInfoRepository.registerObserversAndCallbacks(); 152 } 153 unregisterObserversAndCallbacks()154 void unregisterObserversAndCallbacks() { 155 mInfoRepository.unregisterObserversAndCallbacks(); 156 } 157 getHearingDeviceTargetIndex(List<AccessibilityTarget> targetList)158 private int getHearingDeviceTargetIndex(List<AccessibilityTarget> targetList) { 159 final int listSize = targetList.size(); 160 for (int index = 0; index < listSize; index++) { 161 AccessibilityTarget target = targetList.get(index); 162 if (ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME.equals( 163 ComponentName.unflattenFromString(target.getId()))) { 164 return index; 165 } 166 } 167 return -1; 168 } 169 }