1/* 2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16import Log from '../../../../../../../../common/src/main/ets/default/Log'; 17import Constants from '../common/Constants'; 18import { AudioVolumeType, VolumeInfo } from '../common/Constants'; 19import VolumePanelService from '../model/VolumePanelService'; 20import VolumeWindowController from '../common/VolumeWindowController'; 21 22export const VOLUME_PANEL_MAX_VOLUME_KEY = 'VolumePanelMaxVolume'; 23 24export const VOLUME_PANEL_MIN_VOLUME_KEY = 'VolumePanelMinVolume'; 25 26export const VOLUME_PANEL_VOLUME_VALUE_KEY = 'VolumePanelVolumeValue'; 27 28export const VOLUME_PANEL_IS_MUTE_KEY = 'VolumePanelIsMute'; 29 30const TAG = 'VolumePanelVM'; 31 32export class VolumePanelVM { 33 mIsStart = false; 34 mMaxVolume: SubscribedAbstractProperty<number>; 35 mMinVolume: SubscribedAbstractProperty<number>; 36 mVolumeValue: SubscribedAbstractProperty<number>; 37 mIsMute: SubscribedAbstractProperty<boolean>; 38 mAllVolumeTypes = [AudioVolumeType.VOICE_CALL, AudioVolumeType.RINGTONE, AudioVolumeType.MEDIA, AudioVolumeType.VOICE_ASSISTANT]; 39 mVolumeBaseMap = {}; 40 mCurrentAudioVolumeType: number = AudioVolumeType.MEDIA; 41 mCurrentAudioVolume: number; 42 mUpdatingAudioVolume: number; 43 mVolumeBeforeMute: number; 44 45 constructor() { 46 Log.showInfo(TAG, 'constructor'); 47 } 48 49 initViewModel(): void { 50 if (this.mIsStart) { 51 return; 52 } 53 Log.showInfo(TAG, 'initViewModel '); 54 this.mIsStart = true; 55 56 this.mMaxVolume = AppStorage.SetAndLink(VOLUME_PANEL_MAX_VOLUME_KEY, Constants.DEFAULT_MAX_VOLUME); 57 this.mMinVolume = AppStorage.SetAndLink(VOLUME_PANEL_MIN_VOLUME_KEY, Constants.DEFAULT_MIN_VOLUME); 58 this.mVolumeValue = AppStorage.SetAndLink(VOLUME_PANEL_VOLUME_VALUE_KEY, Constants.DEFAULT_MIN_VOLUME); 59 this.mIsMute = AppStorage.SetAndLink(VOLUME_PANEL_IS_MUTE_KEY, Constants.DEFAULT_MUTE_STATUS); 60 this.mAllVolumeTypes.forEach((volumeType: AudioVolumeType) => { 61 this.mVolumeBaseMap[volumeType] = { 62 maxVolume: Constants.DEFAULT_MAX_VOLUME, 63 minVolume: Constants.DEFAULT_MIN_VOLUME 64 }; 65 }); 66 VolumePanelService.startService(); 67 VolumePanelService.registerListener(this); 68 this.mAllVolumeTypes.forEach((volumeType: AudioVolumeType) => { 69 VolumePanelService.getMaxVolume(volumeType, (volumeType: AudioVolumeType, value: number) => this.updateMaxVolume(volumeType, value)); 70 VolumePanelService.getMinVolume(volumeType, (volumeType: AudioVolumeType, value: number) => this.updateMinVolume(volumeType, value)); 71 }); 72 this.getInitVolumeInfo(); 73 } 74 75 getInitVolumeInfo(): void { 76 this.getActiveVolumeType(JSON.parse(JSON.stringify(this.mAllVolumeTypes)), (activeVolumeType: AudioVolumeType) => { 77 Log.showInfo(TAG, `getInitVolumeInfo, activeVolumeType: ${activeVolumeType}`); 78 if (activeVolumeType == undefined) { 79 activeVolumeType = AudioVolumeType.MEDIA; 80 } 81 this.mCurrentAudioVolumeType = activeVolumeType; 82 VolumePanelService.getVolumeInfo(activeVolumeType); 83 }); 84 } 85 86 getActiveVolumeType(volumeTypes: number[], callback: (volumeType: AudioVolumeType) => void): void { 87 Log.showInfo(TAG, `getActiveVolumeType, volumeTypes: ${JSON.stringify(volumeTypes)}`); 88 if (volumeTypes.length == 0) { 89 callback(undefined); 90 return; 91 } 92 VolumePanelService.isActive(volumeTypes[0], (volumeType: AudioVolumeType, data: boolean) => { 93 Log.showInfo(TAG, `getActiveVolumeType, volumeType: ${volumeType} data: ${data}`); 94 if (data) { 95 callback(volumeType); 96 } else { 97 volumeTypes.splice(0, 1); 98 this.getActiveVolumeType(volumeTypes, callback); 99 } 100 }); 101 } 102 103 updateMaxVolume(volumeType: AudioVolumeType, value: number): void { 104 Log.showInfo(TAG, `updateMaxVolume, volumeType: ${volumeType} value: ${value}`); 105 this.mVolumeBaseMap[volumeType].maxVolume = value; 106 Log.showInfo(TAG, `updateMaxVolume, mVolumeBaseMap: ${JSON.stringify(this.mVolumeBaseMap)}`); 107 } 108 109 updateMinVolume(volumeType: AudioVolumeType, value: number): void { 110 Log.showInfo(TAG, `updateMinVolume, volumeType: ${volumeType} value: ${value}`); 111 this.mVolumeBaseMap[volumeType].minVolume = value; 112 Log.showInfo(TAG, `updateMinVolume, mVolumeBaseMap: ${JSON.stringify(this.mVolumeBaseMap)}`); 113 } 114 115 updateVolumeInfo(volumeInfo: VolumeInfo): void { 116 Log.showInfo(TAG, `updateVolumeInfo, volumeInfo: ${JSON.stringify(volumeInfo)} , mCurrentAudioVolumeType: ${this.mCurrentAudioVolumeType}`); 117 if (!(volumeInfo.updateUi || this.mIsMute.get() != volumeInfo.isMute || VolumeWindowController.getInstance().mIsWindowShown)) { 118 return; 119 } 120 let volumeType = volumeInfo.volumeType; 121 let maxVolume: number = this.mVolumeBaseMap[volumeType].maxVolume; 122 let minVolume: number = this.mVolumeBaseMap[volumeType].minVolume; 123 this.mMaxVolume.set(maxVolume); 124 this.mMinVolume.set(minVolume); 125 Log.showInfo(TAG, `updateVolumeInfo, mMaxVolume: ${this.mMaxVolume.get()} , mMinVolume: ${this.mMinVolume.get()}`); 126 127 this.mCurrentAudioVolume = volumeInfo.volume; 128 this.mCurrentAudioVolumeType = volumeType; 129 Log.showInfo(TAG, `updateVolumeInfo, mCurrentAudioVolume: ${this.mCurrentAudioVolume} , mCurrentAudioVolumeType: ${this.mCurrentAudioVolumeType}`); 130 131 this.mVolumeBeforeMute = minVolume; 132 if (volumeInfo.isMute != this.mIsMute.get()) { 133 this.mIsMute.set(volumeInfo.isMute); 134 } 135 Log.showInfo(TAG, `updateVolumeInfo, mIsMute: ${this.mIsMute.get()} `); 136 137 this.updateDisplayVolume(volumeInfo.isMute ? minVolume : volumeInfo.volume, maxVolume, minVolume); 138 } 139 140 updateDisplayVolume(volume: number, maxVolume: number, minVolume: number): void{ 141 Log.showInfo(TAG, `updateDisplayVolume, volume: ${volume} maxVolume: ${maxVolume} minVolume: ${minVolume}`); 142 let displayVolume: number = volume + minVolume; 143 this.mVolumeValue.set(displayVolume); 144 Log.showInfo(TAG, `updateDisplayVolume, mVolumeValue: ${this.mVolumeValue.get()}`); 145 } 146 147 calcVolumeByDisplayVolume(displayVolume: number): number{ 148 let volume: number = displayVolume + this.mMinVolume.get(); 149 Log.showInfo(TAG, `calcVolumeByDisplayVolume, volume: ${volume}`); 150 return volume; 151 } 152 153 setVolume(displayVolume: number): void { 154 Log.showInfo(TAG, `setVolume, displayVolume: ${displayVolume} `); 155 let volume: number = this.calcVolumeByDisplayVolume(displayVolume); 156 if (this.mUpdatingAudioVolume != undefined && volume == this.mUpdatingAudioVolume) { 157 return; 158 } 159 this.mUpdatingAudioVolume = volume; 160 let isMute = volume == this.mMinVolume.get(); 161 if (isMute == this.mIsMute.get()) { 162 isMute = undefined; 163 } 164 VolumePanelService.setVolumeAndMute(this.mCurrentAudioVolumeType, volume, isMute); 165 VolumeWindowController.getInstance().updateVolumeInfo(null); 166 } 167 168 mute(): void { 169 Log.showInfo(TAG, `mute, isMute: ${this.mIsMute.get()} mCurrentAudioVolume: ${this.mCurrentAudioVolume}`); 170 this.mUpdatingAudioVolume = undefined; 171 let isMute: boolean = this.mIsMute.get(); 172 isMute = !isMute; 173 let maxVolume: number = this.mMaxVolume.get(); 174 let minVolume: number = this.mMinVolume.get(); 175 let volume = isMute ? minVolume : (minVolume == this.mVolumeBeforeMute ? (minVolume + 1) : this.mVolumeBeforeMute); 176 let currentAudioVolume = this.mCurrentAudioVolume; 177 let volumeType = this.mCurrentAudioVolumeType; 178 VolumePanelService.setVolumeAndMute(volumeType, volume, isMute, () => { 179 Log.showInfo(TAG, 'mute, setVolumeAndMute callback'); 180 if (volumeType == this.mCurrentAudioVolumeType && this.mIsMute.get()) { 181 this.mVolumeBeforeMute = currentAudioVolume; 182 } 183 }); 184 VolumeWindowController.getInstance().updateVolumeInfo(null); 185 } 186} 187 188let volumePanelVM = new VolumePanelVM(); 189 190export default volumePanelVM;