1c36cf2e9Sopenharmony_ci/*
2c36cf2e9Sopenharmony_ci * Copyright (c) 2023-2023 Huawei Device Co., Ltd.
3c36cf2e9Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4c36cf2e9Sopenharmony_ci * you may not use this file except in compliance with the License.
5c36cf2e9Sopenharmony_ci * You may obtain a copy of the License at
6c36cf2e9Sopenharmony_ci *
7c36cf2e9Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8c36cf2e9Sopenharmony_ci *
9c36cf2e9Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10c36cf2e9Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11c36cf2e9Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12c36cf2e9Sopenharmony_ci * See the License for the specific language governing permissions and
13c36cf2e9Sopenharmony_ci * limitations under the License.
14c36cf2e9Sopenharmony_ci */
15c36cf2e9Sopenharmony_ci
16c36cf2e9Sopenharmony_ciimport { Log } from '@ohos/common';
17c36cf2e9Sopenharmony_ciimport data_preferences from '@ohos.data.preferences';
18c36cf2e9Sopenharmony_ciimport type common from '@ohos.app.ability.common';
19c36cf2e9Sopenharmony_ciimport { GlobalThisHelper, GlobalThisStorageKey} from '@ohos/common';
20c36cf2e9Sopenharmony_ciimport { PreferencesKey } from '@ohos/common';
21c36cf2e9Sopenharmony_ci
22c36cf2e9Sopenharmony_ciconst TAG = '[PreferencesAdapter]:';
23c36cf2e9Sopenharmony_citype ValueType = number | string | boolean | Array<number> | Array<string> | Array<boolean>;
24c36cf2e9Sopenharmony_ci
25c36cf2e9Sopenharmony_ci/**
26c36cf2e9Sopenharmony_ci * StorageHelper
27c36cf2e9Sopenharmony_ci */
28c36cf2e9Sopenharmony_ciexport default class PreferencesAdapter {
29c36cf2e9Sopenharmony_ci  private static preferencesAdapterKey = [
30c36cf2e9Sopenharmony_ci    PreferencesKey.KEY_PRIVACY_STATEMENT_PREFERENCES
31c36cf2e9Sopenharmony_ci  ];
32c36cf2e9Sopenharmony_ci  private preferences: data_preferences.Preferences = undefined;
33c36cf2e9Sopenharmony_ci
34c36cf2e9Sopenharmony_ci  private validKey(key: string) : boolean {
35c36cf2e9Sopenharmony_ci    const element = PreferencesAdapter.preferencesAdapterKey.find((ele) => ele === key);
36c36cf2e9Sopenharmony_ci    if (element === undefined) {
37c36cf2e9Sopenharmony_ci      Log.error(TAG, 'Can not find PREFERENCES_KEY key: ' + JSON.stringify(key));
38c36cf2e9Sopenharmony_ci      return false;
39c36cf2e9Sopenharmony_ci    }
40c36cf2e9Sopenharmony_ci    return true;
41c36cf2e9Sopenharmony_ci  }
42c36cf2e9Sopenharmony_ci
43c36cf2e9Sopenharmony_ci  public static getInstance() : PreferencesAdapter {
44c36cf2e9Sopenharmony_ci    if (GlobalThisHelper.getValue<PreferencesAdapter>(GlobalThisStorageKey.KEY_PREFERENCES_ADAPTER) !== undefined) {
45c36cf2e9Sopenharmony_ci      return GlobalThisHelper.getValue<PreferencesAdapter>(GlobalThisStorageKey.KEY_PREFERENCES_ADAPTER);
46c36cf2e9Sopenharmony_ci    }
47c36cf2e9Sopenharmony_ci    return GlobalThisHelper.createValue<PreferencesAdapter>(new PreferencesAdapter(), GlobalThisStorageKey.KEY_PREFERENCES_ADAPTER);
48c36cf2e9Sopenharmony_ci  }
49c36cf2e9Sopenharmony_ci
50c36cf2e9Sopenharmony_ci  /**
51c36cf2e9Sopenharmony_ci   * 创建preferences对象
52c36cf2e9Sopenharmony_ci   */
53c36cf2e9Sopenharmony_ci  public async getOrCreatePreferencesSync(preferencesName: string): Promise<boolean> {
54c36cf2e9Sopenharmony_ci    Log.info(TAG, 'getOrCreatePreferencesSync start');
55c36cf2e9Sopenharmony_ci    const ABILITY_CONTEXT = GlobalThisHelper.getValue<common.UIExtensionContext>(GlobalThisStorageKey.KEY_MAIN_ABILITY_CONTEXT);
56c36cf2e9Sopenharmony_ci    if (preferencesName) {
57c36cf2e9Sopenharmony_ci      try {
58c36cf2e9Sopenharmony_ci        Log.info(TAG, 'getOrCreatePreferencesSync getValue');
59c36cf2e9Sopenharmony_ci        const preferences = await data_preferences.getPreferences(ABILITY_CONTEXT, preferencesName);
60c36cf2e9Sopenharmony_ci        Log.info(TAG, 'getOrCreatePreferencesSync getPreferences: ' + JSON.stringify(preferences));
61c36cf2e9Sopenharmony_ci        if (this.setPreferences(preferences)) {
62c36cf2e9Sopenharmony_ci          return true;
63c36cf2e9Sopenharmony_ci        } else {
64c36cf2e9Sopenharmony_ci          return false;
65c36cf2e9Sopenharmony_ci        }
66c36cf2e9Sopenharmony_ci      } catch (err) {
67c36cf2e9Sopenharmony_ci        Log.error('Failed to get preferences. code =' + err.code + ', message =' + err.message);
68c36cf2e9Sopenharmony_ci        return false;
69c36cf2e9Sopenharmony_ci      }
70c36cf2e9Sopenharmony_ci    } else {
71c36cf2e9Sopenharmony_ci      Log.error('getOrCreatePreferencesSync preferencesName is undefined');
72c36cf2e9Sopenharmony_ci      return false;
73c36cf2e9Sopenharmony_ci    }
74c36cf2e9Sopenharmony_ci  }
75c36cf2e9Sopenharmony_ci
76c36cf2e9Sopenharmony_ci  /**
77c36cf2e9Sopenharmony_ci   * 设置preferences对象
78c36cf2e9Sopenharmony_ci   */
79c36cf2e9Sopenharmony_ci  public setPreferences(preferences: data_preferences.Preferences): boolean {
80c36cf2e9Sopenharmony_ci    this.preferences = preferences;
81c36cf2e9Sopenharmony_ci    return true;
82c36cf2e9Sopenharmony_ci  }
83c36cf2e9Sopenharmony_ci
84c36cf2e9Sopenharmony_ci  /**
85c36cf2e9Sopenharmony_ci   * 通过key获取对应value
86c36cf2e9Sopenharmony_ci   */
87c36cf2e9Sopenharmony_ci  public async getValue(key: string): Promise<ValueType> {
88c36cf2e9Sopenharmony_ci    Log.info(TAG, 'getValue key: ' + JSON.stringify(key));
89c36cf2e9Sopenharmony_ci    if (this.preferences) {
90c36cf2e9Sopenharmony_ci      try {
91c36cf2e9Sopenharmony_ci        return <ValueType>(await this.preferences.get(key, false));
92c36cf2e9Sopenharmony_ci      } catch (err) {
93c36cf2e9Sopenharmony_ci        Log.error(TAG, 'Failed to get value of getValue. code =' + err.code + ', message =' + err.message);
94c36cf2e9Sopenharmony_ci        return undefined;
95c36cf2e9Sopenharmony_ci      }
96c36cf2e9Sopenharmony_ci    } else {
97c36cf2e9Sopenharmony_ci      Log.error(TAG, 'getValue preferences is undefined, please set preferences');
98c36cf2e9Sopenharmony_ci      return undefined;
99c36cf2e9Sopenharmony_ci    }
100c36cf2e9Sopenharmony_ci  }
101c36cf2e9Sopenharmony_ci
102c36cf2e9Sopenharmony_ci  /**
103c36cf2e9Sopenharmony_ci   * 设置value
104c36cf2e9Sopenharmony_ci   */
105c36cf2e9Sopenharmony_ci  public async putValue(key: string, value: ValueType): Promise<boolean> {
106c36cf2e9Sopenharmony_ci    Log.info(TAG, 'putValue start');
107c36cf2e9Sopenharmony_ci    if (!this.validKey(key)) {
108c36cf2e9Sopenharmony_ci      return false;
109c36cf2e9Sopenharmony_ci    }
110c36cf2e9Sopenharmony_ci    if (this.preferences) {
111c36cf2e9Sopenharmony_ci      try {
112c36cf2e9Sopenharmony_ci        await this.preferences.put(key, value);
113c36cf2e9Sopenharmony_ci        Log.info(TAG, 'putValue success');
114c36cf2e9Sopenharmony_ci        return true;
115c36cf2e9Sopenharmony_ci      } catch (err) {
116c36cf2e9Sopenharmony_ci        Log.error(TAG, 'Failed to put value of putValue. code =' + err.code + ', message =' + err.message);
117c36cf2e9Sopenharmony_ci        return false;
118c36cf2e9Sopenharmony_ci      }
119c36cf2e9Sopenharmony_ci    } else {
120c36cf2e9Sopenharmony_ci      Log.error(TAG, 'putValue preferences is undefined, please set preferences');
121c36cf2e9Sopenharmony_ci      return false;
122c36cf2e9Sopenharmony_ci    }
123c36cf2e9Sopenharmony_ci  }
124c36cf2e9Sopenharmony_ci
125c36cf2e9Sopenharmony_ci  /**
126c36cf2e9Sopenharmony_ci   * 删除preferences中的值
127c36cf2e9Sopenharmony_ci   */
128c36cf2e9Sopenharmony_ci  public async deleteValue(key: string): Promise<boolean> {
129c36cf2e9Sopenharmony_ci    if (!this.validKey(key)) {
130c36cf2e9Sopenharmony_ci      return false;
131c36cf2e9Sopenharmony_ci    }
132c36cf2e9Sopenharmony_ci    if (this.preferences) {
133c36cf2e9Sopenharmony_ci      try {
134c36cf2e9Sopenharmony_ci        await this.preferences.delete(key);
135c36cf2e9Sopenharmony_ci        Log.info(TAG, 'deleteValue success');
136c36cf2e9Sopenharmony_ci        return true;
137c36cf2e9Sopenharmony_ci      } catch (err) {
138c36cf2e9Sopenharmony_ci        Log.error(TAG, 'Failed to delete value of deleteValue. code =' + err.code + ', message =' + err.message);
139c36cf2e9Sopenharmony_ci        return false;
140c36cf2e9Sopenharmony_ci      }
141c36cf2e9Sopenharmony_ci    } else {
142c36cf2e9Sopenharmony_ci      Log.error(TAG, 'deleteValue preferences is undefined, please set preferences');
143c36cf2e9Sopenharmony_ci      return false;
144c36cf2e9Sopenharmony_ci    }
145c36cf2e9Sopenharmony_ci  }
146c36cf2e9Sopenharmony_ci
147c36cf2e9Sopenharmony_ci  /**
148c36cf2e9Sopenharmony_ci   * 持久化存储
149c36cf2e9Sopenharmony_ci   */
150c36cf2e9Sopenharmony_ci  public async flush(): Promise<boolean> {
151c36cf2e9Sopenharmony_ci    Log.info(TAG, 'flush start');
152c36cf2e9Sopenharmony_ci    if (this.preferences) {
153c36cf2e9Sopenharmony_ci      try {
154c36cf2e9Sopenharmony_ci        await this.preferences.flush();
155c36cf2e9Sopenharmony_ci        Log.info(TAG, 'flush success');
156c36cf2e9Sopenharmony_ci        return true;
157c36cf2e9Sopenharmony_ci      } catch (err) {
158c36cf2e9Sopenharmony_ci        Log.error(TAG, 'Failed to flush value of flush. code =' + err.code + ', message =' + err.message);
159c36cf2e9Sopenharmony_ci        return false;
160c36cf2e9Sopenharmony_ci      }
161c36cf2e9Sopenharmony_ci    } else {
162c36cf2e9Sopenharmony_ci      Log.error(TAG, 'flush preferences is undefined, please set preferences');
163c36cf2e9Sopenharmony_ci      return false;
164c36cf2e9Sopenharmony_ci    }
165c36cf2e9Sopenharmony_ci  }
166c36cf2e9Sopenharmony_ci}