• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }