1/** 2 * @file Describe the file 3 * Copyright (c) 2021 Huawei Device Co., Ltd. 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17import dataStorage from '@ohos.data.preferences'; 18import deviceInfo from '@ohos.deviceInfo'; 19import ohosDataRdb from '@ohos.data.rdb'; 20import i18n from '@ohos.i18n'; 21import settings from '@ohos.settings'; 22import systemParameter from '@ohos.systemparameter'; 23import SettingsDataConfig from '../Utils/SettingsDataConfig'; 24import { Log } from '../Utils/Log'; 25 26let DDL_TABLE_CREATE = `CREATE TABLE IF NOT EXISTS ${SettingsDataConfig.TABLE_NAME} (` 27+ `${SettingsDataConfig.FIELD_ID} INTEGER PRIMARY KEY AUTOINCREMENT, ` 28+ `KEYWORD TEXT, ` 29+ `VALUE TEXT CHECK (LENGTH(VALUE)<=1000))`; 30 31const DEFAULT_JSON_FILE_NAME : string = "default_settings.json"; 32const SETTINGSDATA_PREFERENCE : string = "SettingsDataPreference"; 33 34let DefaultKey = SettingsDataConfig.DefaultKey; 35let SettingsKey = SettingsDataConfig.SettingsKey; 36 37const DefalutKVGlobal = { 38 "settings.screen.brightness.default": "50", 39 "settings.time.format.default": "24", 40 "settings.audio.ringtone.default": "5", 41 "settings.audio.media.default": "5", 42 "settings.audio.voicecall.default": "5", 43 "settings.display.navigationbar_status.default": "1", 44 "cellular_data_enable.default": "1", 45}; 46 47const TIME_FORMAT = { 48 TIME_FORMAT_24: "24", 49 TIME_FORMAT_12: "12", 50} 51 52class SettingsDBHelper { 53 private firstStartupFlag: boolean; 54 private rdbStore_; 55 private context_; 56 private static instance_: SettingsDBHelper; 57 58 private constructor() { 59 this.firstStartupFlag = false; 60 this.rdbStore_ = undefined; 61 this.context_ = globalThis.abilityContext; 62 Log.I('call construstor'); 63 } 64 65 private async firstStartupConfig() : Promise<void> { 66 Log.I("firstStartupConfig start"); 67 let storage = await dataStorage.getPreferences(this.context_, SETTINGSDATA_PREFERENCE) 68 Log.I("firstStartupConfig getStorage = " + storage); 69 let isExist = await storage.has('isFirstStartUp') 70 Log.I("firstStartupConfig has isFirstStartUp = " + isExist); 71 if (!isExist) { 72 Log.I("The key of isFirstStartUp is not contained.") 73 Log.I("firstStartupConfig put start"); 74 await storage.put('isFirstStartUp', 'true'); 75 Log.I("firstStartupConfig flush start"); 76 await storage.flush(); 77 Log.I("firstStartupConfig flush end"); 78 this.firstStartupFlag = true; 79 } else { 80 let startup = await storage.get('isFirstStartUp', 'null'); 81 if (startup != 'true') { 82 Log.I("firstStartupConfig get startup = " + startup); 83 this.firstStartupFlag = true; 84 } 85 } 86 Log.I("firstStartupConfig end"); 87 return; 88 } 89 90 public async initRdbStore() { 91 Log.I('call initRdbStore start'); 92 this.rdbStore_ = await ohosDataRdb.getRdbStore(this.context_, { name: SettingsDataConfig.DB_NAME }, 1); 93 Log.I('call initRdbStore, rdbStore_ = ' + this.rdbStore_); 94 95 Log.I("initRdbStore executeSql"); 96 await this.rdbStore_.executeSql(DDL_TABLE_CREATE, []); 97 98 Log.I('getRdbStore firstStartupConfig'); 99 await this.firstStartupConfig(); 100 101 if (this.firstStartupFlag) { 102 Log.I('initRdbStore getDefaultSettingsKV'); 103 let defaultKV = await this.getDefaultSettingsKV(); 104 Log.I('initRdbStore loadDefaultSettings'); 105 await this.loadDefaultSettings(defaultKV); 106 } else { 107 Log.I('initRdbStore not need loadDefaultSettings'); 108 } 109 Log.I('call initRdbStore end'); 110 return this.rdbStore_; 111 } 112 113 public static getInstance() { 114 if (!SettingsDBHelper.instance_) { 115 Log.I('call getInstance start'); 116 SettingsDBHelper.instance_ = new SettingsDBHelper(); 117 Log.I('call getInstance end'); 118 } 119 return SettingsDBHelper.instance_; 120 } 121 122 public async getRdbStore() { 123 Log.I('call getRdbStore start'); 124 return await SettingsDBHelper.instance_.initRdbStore(); 125 } 126 127 private async loadSettings(rdbStore_, key, value): Promise<void> { 128 Log.I("key=" + key + " value " + value); 129 await this.rdbStore_.insert( 130 SettingsDataConfig.TABLE_NAME, 131 { "KEYWORD": key, "VALUE": value }, 132 (err, ret) => { 133 if (err) { 134 Log.E("loadSettings insert error:" + JSON.stringify(err)); 135 } 136 Log.I("loadSettings insert ret = " + ret); 137 }); 138 } 139 140 private async loadDefaultSettings(defaultKV) { 141 Log.I("loadDefaultSettings start"); 142 143 await this.loadSettings(this.rdbStore_, 144 settings.display.SCREEN_BRIGHTNESS_STATUS, defaultKV[DefaultKey.SETTINGS_SCREEN_BRIGHTNESS_DEFAULT]); 145 146 await this.loadSettings(this.rdbStore_, 147 settings.date.TIME_FORMAT, defaultKV[DefaultKey.SETTINGS_TIME_FORMAT_DEFAULT]); 148 149 await this.loadSettings(this.rdbStore_, 150 SettingsKey.SETTINGS_AUDIO_RINGTONE, defaultKV[DefaultKey.SETTINGS_AUDIO_RINGTONE_DEFAULT]); 151 152 await this.loadSettings(this.rdbStore_, 153 SettingsKey.SETTINGS_AUDIO_MEDIA, defaultKV[DefaultKey.SETTINGS_AUDIO_MEDIA_DEFAULT]); 154 155 await this.loadSettings(this.rdbStore_, 156 SettingsKey.SETTINGS_AUDIO_VOICE_CALL, defaultKV[DefaultKey.SETTINGS_AUDIO_VOICE_CALL_DEFAULT]); 157 158 await this.loadSettings(this.rdbStore_, 159 settings.general.DEVICE_NAME, defaultKV[DefaultKey.SETTINGS_GENERAL_DEVICE_NAME_DEFAULT]); 160 161 await this.loadSettings(this.rdbStore_, 162 SettingsKey.SETTINGS_DISPALY_NAVBAR_STATUS, defaultKV[DefaultKey.SETTINGS_DISPALY_NAVBAR_STATUS_DEFAULT]); 163 164 await this.loadSettings(this.rdbStore_, 165 SettingsKey.CELLULAR_DATA_ENABLE, defaultKV[DefaultKey.CELLULAR_DATA_ENABLE_DEFAULT]); 166 167 Log.I("loadDefaultSettings end"); 168 return; 169 } 170 171 private async readDefaultFile(): Promise<string> { 172 Log.I("readDefaultFile start"); 173 let rawStr: string = ""; 174 try { 175 let resManager = this.context_.resourceManager; 176 Log.I("readDefaultFile resManager=" + resManager); 177 let content = await resManager.getRawFile(DEFAULT_JSON_FILE_NAME); 178 rawStr = String.fromCharCode.apply(null, content); 179 } catch (err) { 180 Log.E("readDefaultFile readRawFile err" + err); 181 } 182 Log.I("readDefaultFile end"); 183 return rawStr; 184 } 185 186 private async getDefaultSettingsKV() { 187 Log.I("getDefaultSettingsKV start"); 188 let defaultKV = {}; 189 try { 190 let content: string = await this.readDefaultFile(); 191 if (!content) { 192 Log.I("getDefaultSettingsKV readDefaultFile err! content = " + content); 193 throw new Error("readfile error!") 194 } 195 let defaultJson = JSON.parse(content); 196 Log.I("getDefaultSettingsKV parse = " + JSON.stringify(defaultJson)); 197 for (var index = 0; index < defaultJson.settings.length; index++) { 198 defaultKV[defaultJson.settings[index].name] = defaultJson.settings[index].value; 199 } 200 } catch (err) { 201 Log.E("getDefaultSettingsKV catch err! err = " + err); 202 defaultKV = DefalutKVGlobal; 203 } 204 let deviceName: string = deviceInfo.marketName; 205 if (deviceName.startsWith('"') && deviceName.endsWith('"')) { 206 deviceName = JSON.parse(deviceName); 207 } 208 defaultKV[DefaultKey.SETTINGS_GENERAL_DEVICE_NAME_DEFAULT] = deviceName; 209 210 if (i18n.is24HourClock()) { 211 defaultKV[DefaultKey.SETTINGS_TIME_FORMAT_DEFAULT] = TIME_FORMAT.TIME_FORMAT_24; 212 } else { 213 defaultKV[DefaultKey.SETTINGS_TIME_FORMAT_DEFAULT] = TIME_FORMAT.TIME_FORMAT_12; 214 } 215 216 let defaultBrightness = systemParameter.getSync('const.display.brightness.default'); 217 if (defaultBrightness.length > 0) { 218 defaultKV[DefaultKey.SETTINGS_SCREEN_BRIGHTNESS_DEFAULT] = defaultBrightness; 219 } 220 return defaultKV; 221 } 222} 223 224export default SettingsDBHelper; 225