1 /* 2 * Copyright (C) 2020 The Android Open Source Project 3 * 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 17 package com.android.framebufferizer.utils; 18 19 import java.io.*; 20 import java.lang.Runtime; 21 import java.nio.file.*; 22 import java.util.Map; 23 import java.util.HashMap; 24 import org.json.JSONObject; 25 import com.google.gson.Gson; 26 import com.google.gson.JsonParseException; 27 import com.google.gson.JsonSyntaxException; 28 import org.json.JSONException; 29 30 public class Config { 31 public static final String KEY_MAGNIFIED = "magnified"; 32 public static final String KEY_INVERTED = "inverted"; 33 public static final String KEY_LAYOUT = "layout"; 34 public static final String KEY_LOCALE = "locale"; 35 public static final String KEY_DEVICE = "device"; 36 public static final String KEY_MESSAGE = "message"; 37 private static final String fileName = "config.json"; 38 private static final String fileLock = ".lock"; 39 private static Config _instance = null; 40 private static final String fileDir = System.getProperty("user.home") + File.separator + ".teeui"; 41 private static Map<String, Object> configMap = null; Config()42 private Config() { 43 configMap = new HashMap<>(); 44 } 45 getInstance()46 public static Config getInstance() { 47 if (_instance == null) 48 _instance = new Config(); 49 50 return _instance; 51 } 52 setValue(String key, Object value)53 public void setValue(String key, Object value){ 54 configMap.put(key, value); 55 } 56 getConfiguration()57 public Map<String, Object> getConfiguration() { 58 Map<String, Object> config = null; 59 try { 60 String content = new String(Files.readAllBytes(Paths.get(fileDir + File.separator + fileName))); 61 Gson gson = new Gson(); 62 config = gson.fromJson(content, Map.class); 63 } catch (NoSuchFileException e) { 64 System.err.println("" + fileDir + File.separator + fileName + " file does not exists because the tool is started for the first time."); 65 } catch (SecurityException e) { 66 e.printStackTrace(); 67 System.err.println("" + fileDir + File.separator + fileName + " file read/write permission denied."); 68 } catch (IOException e) { 69 e.printStackTrace(); 70 System.err.println("Exception while opening file " + fileDir + File.separator + fileName + "."); 71 } catch (JsonSyntaxException e) { 72 e.printStackTrace(); 73 System.err.println("Invalid json format for file " + fileDir + File.separator + fileName + "."); 74 } catch (JsonParseException e) { 75 e.printStackTrace(); 76 System.err.println("Exception while parsing file " + fileDir + File.separator + fileName + "."); 77 } catch (Exception e) { 78 e.printStackTrace(); 79 System.err.println("Exception while getting configuration."); 80 } 81 return config; 82 } 83 saveConfiguration()84 private void saveConfiguration() { 85 try { 86 File directory = new File(fileDir); 87 directory.mkdirs(); 88 File file = new File(directory, fileName); 89 JSONObject jsonObject = new JSONObject(configMap); 90 PrintWriter pw = new PrintWriter(file); 91 pw.write(jsonObject.toString()); 92 pw.flush(); 93 pw.close(); 94 } catch (FileNotFoundException e) { 95 e.printStackTrace(); 96 System.err.println("Exception while saving configuration, " + fileDir + File.separator + fileName + " file not found."); 97 } catch (Exception e) { 98 e.printStackTrace(); 99 System.err.println("Exception while saving configuration."); 100 } 101 } 102 createLockFile()103 public boolean createLockFile() { 104 boolean fileCreated = false; 105 try { 106 File directory = new File(fileDir); 107 directory.mkdirs(); 108 File file = new File(directory, fileLock); 109 fileCreated = file.createNewFile(); 110 if(fileCreated){ 111 Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { 112 public void run() { 113 try { 114 saveConfiguration(); 115 file.delete(); 116 } catch (Exception e) { 117 e.printStackTrace(); 118 System.err.println("Exception while deleting file " + fileDir + File.separator + fileName + "."); 119 } 120 } 121 })); 122 } else { 123 System.out.println("The lock file already exists. Another instance may be running. If no other instance is running, consider removing the lock file " + fileDir + File.separator + fileLock + " manually and try again."); 124 } 125 } catch (IOException e) { 126 e.printStackTrace(); 127 System.err.println("Exception while creating file " + fileDir + File.separator + fileLock + ", exiting application."); 128 } catch (Exception e) { 129 e.printStackTrace(); 130 System.err.println("Exception in createLockFile, exiting application."); 131 } 132 return fileCreated; 133 } 134 } 135