1/* 2 * Copyright (c) 2022-2023 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 */ 15import type { MediaObserverCallback } from './MediaObserverCallback'; 16import { Log } from '../../../utils/Log'; 17import { Constants } from '../../common/Constants'; 18import type { ChangeData, UserFileManager } from '../../../access/UserFileManagerAccess'; 19import { UserFileManagerAccess } from '../../../access/UserFileManagerAccess'; 20 21const TAG: string = 'common_MediaObserver'; 22 23export class MediaObserver { 24 callbacks: Set<MediaObserverCallback> = new Set<MediaObserverCallback>(); 25 26 static getInstance(): MediaObserver { 27 if (AppStorage.Get(Constants.APP_KEY_MENU_USER_FILE_MANAGER_OBSERVER) == null) { 28 AppStorage.SetOrCreate(Constants.APP_KEY_MENU_USER_FILE_MANAGER_OBSERVER, new MediaObserver()); 29 } 30 return AppStorage.Get(Constants.APP_KEY_MENU_USER_FILE_MANAGER_OBSERVER); 31 } 32 33 registerObserver(callback: MediaObserverCallback) { 34 Log.info(TAG, 'registerObserver'); 35 if (!callback) { 36 Log.warn(TAG, 'registerObserver with empty callback'); 37 return; 38 } 39 40 if (this.callbacks.has(callback)) { 41 Log.warn(TAG, 'registerObserver already exist'); 42 return; 43 } 44 this.callbacks.add(callback); 45 } 46 47 unregisterObserver(callback: MediaObserverCallback) { 48 Log.info(TAG, 'unregisterObserver'); 49 if (!callback) { 50 Log.warn(TAG, 'unregisterObserver with empty callback'); 51 return; 52 } 53 54 if (this.callbacks.has(callback)) { 55 this.callbacks.delete(callback); 56 } else { 57 Log.warn(TAG, 'unregisterObserver not exist'); 58 } 59 } 60 61 sendNotify(mediaType: string) { 62 Log.info(TAG, `sendNotify size: ${this.callbacks.size}`); 63 for (let callback of this.callbacks) { 64 callback.onChange(mediaType); 65 } 66 } 67 68 registerForAllPhotos() { 69 Log.info(TAG, 'registerForAllPhotos'); 70 let userFileManager: UserFileManager = UserFileManagerAccess.getInstance().getMediaLibrary(); 71 if (userFileManager) { 72 userFileManager.on(UserFileManagerAccess.REGISTER_TYPE_ALL_PHOTOS, true, (changeData: ChangeData) => { 73 Log.info(TAG, `userFileManager.on for REGISTER_TYPE_ALL_PHOTOS, ${JSON.stringify(changeData)}`); 74 this.sendNotify('image'); 75 }); 76 } else { 77 Log.error(TAG, 'register is null!'); 78 } 79 } 80 81 unregisterForAllPhotos() { 82 Log.info(TAG, 'unregisterForAllPhotos'); 83 let userFileManager: UserFileManager = UserFileManagerAccess.getInstance().getMediaLibrary(); 84 if (userFileManager) { 85 userFileManager.off(UserFileManagerAccess.REGISTER_TYPE_ALL_PHOTOS); 86 } else { 87 Log.error(TAG, 'unregister is null!'); 88 } 89 } 90 91 registerForAllAlbums() { 92 Log.info(TAG, 'registerForAllAlbums'); 93 let userFileManager: UserFileManager = UserFileManagerAccess.getInstance().getMediaLibrary(); 94 if (userFileManager) { 95 userFileManager.on(UserFileManagerAccess.REGISTER_TYPE_ALL_ALBUMS, true, (changeData: ChangeData) => { 96 Log.info(TAG, `userFileManager.on for REGISTER_TYPE_ALL_ALBUMS, ${JSON.stringify(changeData)}`); 97 this.sendNotify('image'); 98 }); 99 } else { 100 Log.error(TAG, 'register is null!'); 101 } 102 } 103 104 unregisterForAllAlbums() { 105 Log.info(TAG, 'unregisterForAllAlbums'); 106 let userFileManager: UserFileManager = UserFileManagerAccess.getInstance().getMediaLibrary(); 107 if (userFileManager) { 108 userFileManager.off(UserFileManagerAccess.REGISTER_TYPE_ALL_ALBUMS); 109 } else { 110 Log.error(TAG, 'unregister is null!'); 111 } 112 } 113 114 registerForAlbum(albumUri: string) { 115 Log.info(TAG, 'registerForAllAlbums'); 116 let userFileManager: UserFileManager = UserFileManagerAccess.getInstance().getMediaLibrary(); 117 if (userFileManager) { 118 userFileManager.on(albumUri, false, (changeData: ChangeData) => { 119 Log.info(TAG, 'userFileManager.on for REGISTER_TYPE_ALL_ALBUMS'); 120 this.sendNotify('album'); 121 }); 122 } else { 123 Log.error(TAG, 'register is null!'); 124 } 125 } 126 127 unregisterForAlbum(albumUri: string) { 128 Log.info(TAG, 'unregisterForAllAlbums'); 129 let userFileManager: UserFileManager = UserFileManagerAccess.getInstance().getMediaLibrary(); 130 if (userFileManager) { 131 userFileManager.off(albumUri); 132 } else { 133 Log.error(TAG, 'unregister is null!'); 134 } 135 } 136}