From c5a788718347378fa99d342a583ccc6f2decc74f Mon Sep 17 00:00:00 2001 From: cphelps76 Date: Wed, 1 May 2013 08:58:29 -0500 Subject: [PATCH] Port AOKP: [2/3] Install persistence support save and restore data across installs. Initial data includes property ro.sf.lcd_density and file etc/hosts. Behavior is controlled via configuration file etc/persist.conf. Conflicts: AndroidManifest.xml --- AndroidManifest.xml | 12 +- res/drawable-hdpi/ic_settings_installer.png | Bin 0 -> 1836 bytes res/drawable-mdpi/ic_settings_installer.png | Bin 0 -> 952 bytes res/drawable-xhdpi/ic_settings_installer.png | Bin 0 -> 2290 bytes res/values/strings.xml | 11 + res/xml/prefs_installer.xml | 28 +++ res/xml/settings_headers.xml | 7 + .../android/settings/demented/Installer.java | 224 ++++++++++++++++++ 8 files changed, 280 insertions(+), 2 deletions(-) create mode 100644 res/drawable-hdpi/ic_settings_installer.png create mode 100644 res/drawable-mdpi/ic_settings_installer.png create mode 100644 res/drawable-xhdpi/ic_settings_installer.png create mode 100644 res/xml/prefs_installer.xml create mode 100644 src/com/android/settings/demented/Installer.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index ceda0fa..a9dc87d 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1579,8 +1579,6 @@ - - @@ -1741,5 +1739,15 @@ + + + + + + + + diff --git a/res/drawable-hdpi/ic_settings_installer.png b/res/drawable-hdpi/ic_settings_installer.png new file mode 100644 index 0000000000000000000000000000000000000000..b26d2414106430051063e7000f67f0dc6194853d GIT binary patch literal 1836 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 Permissions + + Installer + Persistance Settings + Persistence + Enable Persistence + Enable data to persist across installs + Persist Density + Persist LCD density + Persist Hosts + Persist hosts file + diff --git a/res/xml/prefs_installer.xml b/res/xml/prefs_installer.xml new file mode 100644 index 0000000..a1e11be --- /dev/null +++ b/res/xml/prefs_installer.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + diff --git a/res/xml/settings_headers.xml b/res/xml/settings_headers.xml index 973b9ec..f96e286 100644 --- a/res/xml/settings_headers.xml +++ b/res/xml/settings_headers.xml @@ -107,6 +107,13 @@ android:targetClass="org.chameleonos.permissionsmanager.activity.PermissionManagerActivity" /> + +
+
mPersistProps; + ArrayList mPersistFiles; + ArrayList mPersistTrailer; + + private boolean stringToBool(String val) { + if (val.equals("0") || + val.equals("false") || + val.equals("False")) { + return false; + } + return true; + } + private String boolToString(boolean val) { + return (val ? "true" : "false"); + } + private ArrayList stringToStringArray(String val) { + ArrayList ret = new ArrayList(); + int p1 = val.indexOf("\""); + int p2 = val.lastIndexOf("\""); + if (p1 >= 0 && p2 > p1+1) { + String dqval = val.substring(p1+1, p2); + for (String s : dqval.split(" +")) { + ret.add(s); + } + } + return ret; + } + private String stringArrayToString(ArrayList val) { + String ret = ""; + boolean first = true; + ret += "\""; + for (String s : val) { + if (!first) { + ret += " "; + } + ret += s; + first = false; + } + ret += "\""; + return ret; + } + + boolean loadPrefs() { + mPersistEnable = true; + mPersistProps = new ArrayList(); + mPersistFiles = new ArrayList(); + mPersistTrailer = new ArrayList(); + BufferedReader br = null; + try { + br = new BufferedReader(new FileReader(CONF_FILE), 1024); + boolean inTrailer = false; + String line; + while ((line = br.readLine()) != null) { + if (line.startsWith("# END REPLACE")) { + inTrailer = true; + } + if (!inTrailer) { + if (line.startsWith("persist_")) { + String[] fields = line.split("=", 2); + if (fields[0].equals("persist_enable")) { + mPersistEnable = stringToBool(fields[1]); + } + if (fields[0].equals("persist_props")) { + mPersistProps = stringToStringArray(fields[1]); + } + if (fields[0].equals("persist_files")) { + mPersistFiles = stringToStringArray(fields[1]); + } + } + } + else { + mPersistTrailer.add(line); + } + } + } + catch (FileNotFoundException e) { + Log.e(TAG, "Config file not found"); + } + catch (IOException e) { + Log.e(TAG, "Exception reading config file: " + e.getMessage()); + } + finally { + if (br != null) { + try { + br.close(); + } + catch (IOException e) { + // Igonre + } + } + } + return true; + } + + boolean savePrefs() { + BufferedWriter bw = null; + Helpers.getMount("rw"); + String[] cmdarray = new String[3]; + cmdarray[0] = "su"; + cmdarray[1] = "-c"; + cmdarray[2] = "cat > " + CONF_FILE; + StringBuffer childStdin = new StringBuffer(); + childStdin.append("# /system/etc/persist.conf\n"); + childStdin.append("persist_enable=" + boolToString(mPersistEnable) + "\n"); + childStdin.append("persist_props=" + stringArrayToString(mPersistProps) + "\n"); + childStdin.append("persist_files=" + stringArrayToString(mPersistFiles) + "\n"); + for (String line : mPersistTrailer) { + childStdin.append(line + "\n"); + } + CommandResult cr = CMDProcessor.runSysCmd(cmdarray, childStdin.toString()); + Log.i(TAG, "savePrefs: result=" + cr.getExitValue()); + Log.i(TAG, "savePrefs: stdout=" + cr.getStdout()); + Log.i(TAG, "savePrefs: stderr=" + cr.getStderr()); + Helpers.getMount("ro"); + return true; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // Load the preferences from an XML resource + addPreferencesFromResource(R.xml.prefs_installer); + + PreferenceScreen prefs = getPreferenceScreen(); + + loadPrefs(); + + mPrefPersistEnable = (CheckBoxPreference)findPreference(PREF_PERSIST_ENABLE); + mPrefPersistEnable.setChecked(mPersistEnable); + mPrefPersistDensity = (CheckBoxPreference)findPreference(PREF_PERSIST_PROP_DENSITY); + mPrefPersistDensity.setChecked(mPersistProps.contains("ro.sf.lcd_density")); + mPrefPersistHosts = (CheckBoxPreference)findPreference(PREF_PERSIST_FILE_HOSTS); + mPrefPersistHosts.setChecked(mPersistFiles.contains("etc/hosts")); + } + + @Override + public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, + Preference preference) { + boolean isChecked = ((CheckBoxPreference)preference).isChecked(); + if (preference == mPrefPersistEnable) { + mPersistEnable = isChecked; + savePrefs(); + return true; + } + if (preference == mPrefPersistDensity) { + if (isChecked) { + if (!mPersistProps.contains("ro.sf.lcd_density")) { + mPersistProps.add("ro.sf.lcd_density"); + } + } + else { + mPersistProps.remove("ro.sf.lcd_density"); + } + savePrefs(); + return true; + } + if (preference == mPrefPersistHosts) { + if (isChecked) { + if (!mPersistFiles.contains("etc/hosts")) { + mPersistFiles.add("etc/hosts"); + } + } + else { + mPersistFiles.remove("etc/hosts"); + } + savePrefs(); + return true; + } + return super.onPreferenceTreeClick(preferenceScreen, preference); + } +}