Skip to content

Commit

Permalink
Port AOKP: [2/3] Install persistence support
Browse files Browse the repository at this point in the history
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
  • Loading branch information
cphelps76 authored and davros- committed May 1, 2013
1 parent f18c384 commit c5a7887
Show file tree
Hide file tree
Showing 8 changed files with 280 additions and 2 deletions.
12 changes: 10 additions & 2 deletions AndroidManifest.xml
Expand Up @@ -1579,8 +1579,6 @@

<activity android:name=".notificationlight.BatteryLightSettings" />

<!-- CyanogenMod activities End -->

<activity
android:label="@string/qs_title"
android:name=".TwinBlade.quicksettingscontrolpanel">
Expand Down Expand Up @@ -1741,5 +1739,15 @@
</intent-filter>
</activity>

<activity
android:name=".demented.Installer"
android:label="@string/persistance">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>

<category android:name="com.android.settings.SHORTCUT" />
</intent-filter>
</activity>

</application>
</manifest>
Binary file added res/drawable-hdpi/ic_settings_installer.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added res/drawable-mdpi/ic_settings_installer.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added res/drawable-xhdpi/ic_settings_installer.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
11 changes: 11 additions & 0 deletions res/values/strings.xml
Expand Up @@ -5448,4 +5448,15 @@
<!-- Permissions Management -->
<string name="permissions_settings_title">Permissions</string>

<!-- Installer -->
<string name="persistance">Installer</string>
<string name="title_persistance">Persistance Settings</string>
<string name="persist_options">Persistence</string>
<string name="persist_enable">Enable Persistence</string>
<string name="persist_enable_summary">Enable data to persist across installs</string>
<string name="persist_prop_density">Persist Density</string>
<string name="persist_prop_density_summary">Persist LCD density</string>
<string name="persist_file_hosts">Persist Hosts</string>
<string name="persist_file_hosts_summary">Persist hosts file</string>

</resources>
28 changes: 28 additions & 0 deletions res/xml/prefs_installer.xml
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:title="@string/persistance">

<PreferenceCategory
android:title="@string/title_persistance">

<CheckBoxPreference
android:key="enable_persist"
android:title="@string/persist_enable"
android:summary="@string/persist_enable_summary" />

<CheckBoxPreference
android:key="persist_prop_density"
android:dependency="enable_persist"
android:title="@string/persist_prop_density"
android:summary="@string/persist_prop_density_summary" />

<CheckBoxPreference
android:key="persist_file_hosts"
android:dependency="enable_persist"
android:title="@string/persist_file_hosts"
android:summary="@string/persist_file_hosts_summary" />

</PreferenceCategory>

</PreferenceScreen>
7 changes: 7 additions & 0 deletions res/xml/settings_headers.xml
Expand Up @@ -107,6 +107,13 @@
android:targetClass="org.chameleonos.permissionsmanager.activity.PermissionManagerActivity" />
</header>

<!-- Installer -->
<header
android:id="@+id/installer"
android:fragment="com.android.settings.demented.Installer"
android:icon="@drawable/ic_settings_installer"
android:title="@string/persistance" />

<!-- Themes -->
<header
android:id="@+id/themes_settings"
Expand Down
224 changes: 224 additions & 0 deletions src/com/android/settings/demented/Installer.java
@@ -0,0 +1,224 @@
package com.android.settings.demented;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.PreferenceScreen;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
import android.util.TypedValue;

import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.util.Helpers;
import com.android.settings.util.CMDProcessor;
import com.android.settings.util.CommandResult;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.net.URISyntaxException;
import java.util.ArrayList;

public class Installer extends SettingsPreferenceFragment {

private static final String TAG = "Installer";

private static final String CONF_FILE = "/system/etc/persist.conf";

private static final String PREF_PERSIST_ENABLE = "enable_persist";
private static final String PREF_PERSIST_PROP_DENSITY = "persist_prop_density";
private static final String PREF_PERSIST_FILE_HOSTS = "persist_file_hosts";

private Preference mPreference;

CheckBoxPreference mPrefPersistEnable;
CheckBoxPreference mPrefPersistDensity;
CheckBoxPreference mPrefPersistHosts;

boolean mPersistEnable;
ArrayList<String> mPersistProps;
ArrayList<String> mPersistFiles;
ArrayList<String> 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<String> stringToStringArray(String val) {
ArrayList<String> ret = new ArrayList<String>();
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<String> 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<String>();
mPersistFiles = new ArrayList<String>();
mPersistTrailer = new ArrayList<String>();
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);
}
}

0 comments on commit c5a7887

Please sign in to comment.