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