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