1/*
2 * Copyright (c) 2021-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 */
15
16import data_preferences from '@ohos.data.preferences';
17import { Logger } from '../util/HiLogger'
18
19const logger: Logger = new Logger("PreferenceManager")
20
21// store:通用,setting:应用全局配置,music_key_sp:工作秘钥缓存,music_info_sp:用户信息缓存
22const preferKeys = ['store', 'setting', 'server_config', 'music_key_sp', 'user_info_sp']
23
24/**
25 * [系统全局SP管理类]
26 */
27export class PreferenceManager {
28  preferenceMap: Map<string, Promise<data_preferences.Preferences>> = new Map()
29  preferKeys: any = {
30    store: 'store',
31    setting: 'setting',
32    serverConfig: 'server_config',
33    encrypt: 'music_key_sp',
34    userInfo: 'user_info_sp'
35  }
36  context: any
37
38  constructor(context: any) {
39    this.context = context
40    this.init()
41  }
42
43  init(): void {
44    logger.info('init')
45    preferKeys.forEach((item: string) => {
46      let promise: Promise<data_preferences.Preferences> = data_preferences.getPreferences(this.context, item)
47      this.preferenceMap.set(item, promise)
48    })
49  }
50
51
52  /**
53   * 获取storeName中的键值对
54   *
55   * @param keyName keyName
56   * @param def def
57   * @param storeName storeName
58   * @return Promise<any>
59   */
60  get(keyName: string, def: number | string | boolean, storeName?: string): Promise<number | string | boolean> {
61    if (!storeName) {
62      storeName = preferKeys[0]
63    }
64    let promise: Promise<data_preferences.Preferences> = this.preferenceMap.get(storeName)
65    if (!promise) {
66      logger.error(`Can not get value of ${keyName} from ${storeName}`)
67      return new Promise((resolve, reject) => {
68        resolve(false)
69      })
70    }
71    return new Promise((resolve, reject) => {
72      promise.then((preferences: data_preferences.Preferences) => {
73        let keyPromise = preferences.get(keyName, def)
74        keyPromise.then((value: number | string | boolean) => {
75          logger.info(`Get value of ${keyName} from ${storeName} is ${value}`)
76          resolve(value)
77        }).catch((err) => {
78          logger.info(`Get value of ${keyName} from ${storeName} startup failed, err: ` + err)
79          resolve(false)
80        })
81      }).catch((err) => {
82        logger.info(`Get value of ${keyName} from ${storeName} startup failed, err: ` + err)
83        resolve(false)
84      })
85    })
86  }
87
88
89  /**
90   * 存储storeName中的键值对
91   *
92   * @param keyName keyName
93   * @param def def
94   * @param storeName storeName
95   * @return Promise<boolean> 成功失败
96   */
97  put(keyName: string, def: any, autoFlush: boolean = true, storeName?: string): Promise<boolean> {
98    if (!storeName) {
99      storeName = preferKeys[0]
100    }
101    let promise: Promise<data_preferences.Preferences> = this.preferenceMap.get(storeName)
102    if (!promise) {
103      logger.error(`Can not put value of ${keyName} from ${storeName}`)
104      return new Promise((resolve, reject) => {
105        resolve(false)
106      })
107    }
108    return new Promise((resolve, reject) => {
109      promise.then((preferences: data_preferences.Preferences) => {
110        let keyPromise = preferences.put(keyName, def)
111        keyPromise.then(() => {
112          if (autoFlush) {
113            let flushPromise = preferences.flush()
114            flushPromise.then(() => {
115              resolve(true)
116            }).catch((err) => {
117              logger.info("Flush to file failed, err: " + err)
118              resolve(false)
119            })
120          } else {
121            resolve(true)
122          }
123        }).catch((err) => {
124          logger.info(`Get value of ${keyName} from ${storeName} startup failed, err: ` + err)
125          resolve(false)
126        })
127      }).catch((err) => {
128        logger.info(`Get value of ${keyName} from ${storeName} startup failed, err: ` + err)
129        resolve(false)
130      })
131    })
132  }
133}