• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 common from '@ohos.app.ability.common';
17import dataStorage from '@ohos.data.preferences';
18import deviceInfo from '@ohos.deviceInfo';
19import relationalStore from '@ohos.data.relationalStore';
20import i18n from '@ohos.i18n';
21import settings from '@ohos.settings';
22import systemParameter from '@ohos.systemparameter';
23import SettingsDataConfig from './SettingsDataConfig';
24import { Log } from '../Utils/Log';
25import { GlobalContext }  from './GlobalContext';
26const DEFAULT_JSON_FILE_NAME : string = "default_settings.json";
27const SETTINGSDATA_PREFERENCE : string = "SettingsDataPreference";
28interface  TIME_FORMAT_DATA {
29  TIME_FORMAT_24: string ;
30  TIME_FORMAT_12: string ;
31}
32const TIME_FORMAT: TIME_FORMAT_DATA = {
33  TIME_FORMAT_24: "24",
34  TIME_FORMAT_12: "12",
35}
36interface IContent {
37  settings: Array<Map<string,string>> ;
38}
39class SettingsDBHelper {
40  static readonly SHARED_TABLE_CREATE_PREFIX = `CREATE TABLE IF NOT EXISTS ${SettingsDataConfig.TABLE_NAME}`;
41  // 需要在在表名后拼接当前的userid
42  static readonly CURRENT_USER_TABLE_CREATE_PREFIX = `CREATE TABLE IF NOT EXISTS ${SettingsDataConfig.USER_TABLE_NAME}_`
43  static readonly TABLE_CREATE_SUFFIX = ` (${SettingsDataConfig.FIELD_ID} INTEGER PRIMARY KEY AUTOINCREMENT, `
44  + `${SettingsDataConfig.FIELD_KEYWORD} TEXT, `
45  + `${SettingsDataConfig.FIELD_VALUE} TEXT CHECK (LENGTH(VALUE)<=1000))`;
46
47  private rdbStore_?: relationalStore.RdbStore;
48  private context_: Context;
49  private readonly DEFAULT_USER_ID: number = 100;
50
51  private constructor() {
52    this.rdbStore_ = undefined;
53    this.context_ = GlobalContext.thisContext as Context;
54    Log.info("context_ start"+ JSON.stringify(this.context_));
55  }
56
57  private async firstStartupConfig() : Promise<void> {
58    Log.info("firstStartupConfig start");
59    let storage = await dataStorage.getPreferences(this.context_ as Context, SETTINGSDATA_PREFERENCE);
60    Log.info("context_ storage = " + this.context_);
61    let isFirst: dataStorage.ValueType = await storage.get('isFirstStartUp', true);
62    Log.info("firstStartupConfig isFirstStartUp = " + isFirst);
63    if (isFirst) {
64      // 创建公共数据表
65      await this.rdbStore_?.executeSql(SettingsDBHelper.SHARED_TABLE_CREATE_PREFIX + SettingsDBHelper.TABLE_CREATE_SUFFIX, []);
66      // 创建默认用户数据表
67      await this.rdbStore_?.executeSql(SettingsDBHelper.CURRENT_USER_TABLE_CREATE_PREFIX + this.DEFAULT_USER_ID + SettingsDBHelper.TABLE_CREATE_SUFFIX, []);
68      await storage.put('isFirstStartUp', false);
69      await storage.flush();
70      await this.loadDefaultSettingsData();
71    }
72    Log.info("firstStartupConfig end");
73    return;
74  }
75
76  public async initRdbStore() {
77    Log.info('call initRdbStore start');
78    let  rdbStore = await relationalStore.getRdbStore(this.context_ as Context, { name: SettingsDataConfig.DB_NAME,securityLevel:1 });
79    if(rdbStore){
80      this.rdbStore_ = rdbStore;
81    }
82
83
84    await this.firstStartupConfig();
85
86    Log.info('call initRdbStore end');
87    return this.rdbStore_;
88  }
89
90  public static getInstance(): SettingsDBHelper {
91    if(GlobalContext.dbHelper === undefined){
92      GlobalContext.dbHelper = new SettingsDBHelper();
93    }
94    return GlobalContext.dbHelper as SettingsDBHelper;
95  }
96
97  public async getRdbStore() {
98    if (!this.rdbStore_) {
99      return  await (GlobalContext.dbHelper as SettingsDBHelper).initRdbStore();
100      // return await globalThis.settingsDBHelper.initRdbStore();
101    }
102    return this.rdbStore_
103  }
104
105  private async loadGlobalSettings(key: string, value: string): Promise<void> {
106    if (!this.rdbStore_) {
107      Log.error('rdbStore is null!');
108      return
109    }
110    Log.info("key=" + key + " value " + value);
111    await this.rdbStore_.insert(SettingsDataConfig.TABLE_NAME, { "KEYWORD": key, "VALUE": value }, (err, ret) => {
112        if (err) {
113          Log.error("loadGlobalSettings insert error:" + JSON.stringify(err));
114        }
115        Log.info("loadGlobalSettings insert ret = " + ret);
116      }
117    );
118  }
119
120  public async loadUserSettings(key: string, value: string, userId: number|undefined): Promise<void> {
121    if (!this.rdbStore_) {
122      Log.error('rdbStore is null!');
123      return
124    }
125    Log.info("key=" + key + " value " + value + " userid " + userId);
126    await this.rdbStore_.insert(SettingsDataConfig.USER_TABLE_NAME + '_' + userId,
127      { "KEYWORD": key, "VALUE": value }, (err, ret) => {
128      if (err) {
129        Log.error("loadGlobalSettings insert error:" + JSON.stringify(err));
130      }
131      Log.info("loadGlobalSettings insert ret = " + ret);
132    });
133  }
134
135  public async readDefaultFile(): Promise<Object> {
136    let rawStr: string = "";
137    try {
138      let content: number[] = Array.from(await this.context_?.resourceManager.getRawFile(DEFAULT_JSON_FILE_NAME));
139      rawStr = String.fromCharCode(...Array.from(content));
140    } catch (err) {
141      Log.error("readDefaultFile readRawFile err" + err);
142    }
143
144    if (rawStr) {
145      Log.info("readDefaultFile success");
146      return JSON.parse(rawStr);
147    }
148    return rawStr;
149  }
150
151  private async loadDefaultSettingsData(): Promise<void> {
152    Log.info("loadDefaultSettingsData start");
153    try {
154      let content = await this.readDefaultFile() as IContent;
155      if (!content) {
156        Log.error("readDefaultFile is failed!");
157        return;
158      }
159      for (let index = 0; index < content.settings.length; index++) {
160        if (content.settings[index]["userConfig"]) {
161          // 加载用户数据表的默认值
162          await this.loadUserSettings(content.settings[index]["name"], content.settings[index]["value"], this.DEFAULT_USER_ID)
163        } else {
164          // 加载公共数据表的默认值
165          await this.loadGlobalSettings(content.settings[index]["name"], content.settings[index]["value"]);
166        }
167      }
168    } catch (err) {
169      Log.error("loadDefaultSettingsData catch error! err = " + err);
170    }
171
172    // 初始化设备名称
173    let deviceName: string = deviceInfo.marketName;
174    if (deviceName.startsWith('"') && deviceName.endsWith('"')) {
175      deviceName = JSON.parse(deviceName);
176    }
177    await this.loadGlobalSettings(settings.general.DEVICE_NAME, deviceName);
178
179    // 初始化24小时制
180    await this.loadGlobalSettings(settings.date.TIME_FORMAT, i18n.is24HourClock() ? TIME_FORMAT.TIME_FORMAT_24 : TIME_FORMAT.TIME_FORMAT_12);
181
182    // 初始化亮度值
183    let defaultBrightness = systemParameter.getSync('const.display.brightness.default');
184    if (defaultBrightness) {
185      await this.loadGlobalSettings(settings.display.SCREEN_BRIGHTNESS_STATUS, defaultBrightness);
186    }
187    Log.info("loadDefaultSettingsData end");
188  }
189}
190
191export default SettingsDBHelper;
192