Move to /system/priv-app instead of /system/app when api level >= 19
[fonbot.git] / src / ro / ieval / fonbot / FonBotPreferenceActivity.java
CommitLineData
8dfb76c9
MG
1package ro.ieval.fonbot;
2
3import java.io.IOException;
4
5import org.eclipse.jdt.annotation.Nullable;
6
7import android.app.admin.DevicePolicyManager;
8import android.content.ComponentName;
9import android.content.Intent;
10import android.content.pm.ApplicationInfo;
11import android.os.Bundle;
12import android.preference.CheckBoxPreference;
957f7118 13import android.preference.EditTextPreference;
8dfb76c9
MG
14import android.preference.Preference;
15import android.preference.Preference.OnPreferenceChangeListener;
16import android.preference.PreferenceActivity;
17import android.util.Log;
18import android.widget.Toast;
19
20/*
21 * Copyright © 2013 Marius Gavrilescu
22 *
23 * This file is part of FonBot.
24 *
25 * FonBot is free software: you can redistribute it and/or modify
26 * it under the terms of the GNU General Public License as published by
27 * the Free Software Foundation, either version 3 of the License, or
28 * (at your option) any later version.
29 *
30 * FonBot is distributed in the hope that it will be useful,
31 * but WITHOUT ANY WARRANTY; without even the implied warranty of
32 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
33 * GNU General Public License for more details.
34 *
35 * You should have received a copy of the GNU General Public License
36 * along with FonBot. If not, see <http://www.gnu.org/licenses/>.
37 */
38
39/**
40 * Preference activity. Lets the user change app preferences.
41 *
42 * @author Marius Gavrilescu <marius@ieval.ro>
43 */
44public final class FonBotPreferenceActivity extends PreferenceActivity {
45 /**
46 * Preference for toggling device admin permissions.
47 */
48 private CheckBoxPreference adminPreference;
49
50 @SuppressWarnings("deprecation")
51 @Override
52 protected void onCreate(@Nullable final Bundle icicle) {
53 super.onCreate(icicle);
54 setTitle("FonBot Preferences");
55 addPreferencesFromResource(R.xml.prefs);
56
57 adminPreference=(CheckBoxPreference) findPreference("admin");
58 final DevicePolicyManager dpm=(DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);
59 final ComponentName adminReceiver=new ComponentName(this,FonBotAdminReceiver.class);
60 adminPreference.setChecked(dpm.isAdminActive(adminReceiver));
61
62 adminPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
63
64 @Override
65 public boolean onPreferenceChange(final @Nullable Preference preference, final @Nullable Object newValue) {
66 if(newValue==null){
67 Log.wtf(FonBotPreferenceActivity.class.getName(), "newValue in OnPreferenceChange is null");
68 throw new AssertionError("Log.wtf did not terminate the process");
69 }
70
71 final boolean isChecked=((Boolean) newValue).booleanValue();
72 if(isChecked){
73 if(dpm.isAdminActive(adminReceiver))
74 return true;
75
76 final Intent intent=new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
77 intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, adminReceiver);
78 startActivityForResult(intent, 0);
79 return false;
80 }
81 dpm.removeActiveAdmin(adminReceiver);
82 return true;
83 }
84 });
85
86 final CheckBoxPreference foregroundPreference=(CheckBoxPreference) findPreference("foreground");
87 foregroundPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
88 @Override
89 public boolean onPreferenceChange(final @Nullable Preference preference, final @Nullable Object newValue) {
90 startService(new Intent(FonBotPreferenceActivity.this, FonBotMainService.class));
91 return true;
92 }
93 });
94
95 final CheckBoxPreference systemPreference=(CheckBoxPreference) findPreference("system");
96 final ApplicationInfo info=getApplicationInfo();
97 final boolean isSystem=(info.flags&ApplicationInfo.FLAG_SYSTEM)!=0;
98 systemPreference.setChecked(isSystem);
99 systemPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
100 @Override
101 public boolean onPreferenceChange(final @Nullable Preference preference, final @Nullable Object newValue) {
102 if(newValue==null)
103 return false;
104 final boolean isChecked=((Boolean)newValue).booleanValue();
105 if(isChecked==isSystem)
106 return true;
107
108 try {
6378595c 109 final String privapp = android.os.Build.VERSION.SDK_INT < 19 ? "app" : "priv-app";
8dfb76c9 110 final String remountCommand="mount -o remount,rw /system";
6378595c
MG
111 final String copyToSystemCommand="cp "+info.sourceDir+" /system/" + privapp + "/FonBot.apk";
112 final String chmodSystemCommand="chmod 644 /system/" + privapp + "/FonBot.apk";
113 final String rmSystemCommand="rm /system/" + privapp + "/FonBot.apk";
8dfb76c9
MG
114 final String copyToUserCommand="cp "+info.sourceDir+" /data/app/FonBot.apk";
115 final String chmodUserCommand="chmod 644 /data/app/FonBot.apk";
afce35a4 116 final String rmUserCommand="rm "+info.sourceDir;
8dfb76c9
MG
117
118 if(isChecked){
119 Runtime.getRuntime().exec(new String[]{
120 "su", "-c",
afce35a4 121 remountCommand+';'+copyToSystemCommand+';'+chmodSystemCommand+';'+rmUserCommand
8dfb76c9
MG
122 }).waitFor();
123
124 Toast.makeText(FonBotPreferenceActivity.this,
125 "Reboot to make FonBot a system application", Toast.LENGTH_LONG).show();
126 } else {
127 Runtime.getRuntime().exec(new String[]{
128 "su", "-c",
afce35a4 129 remountCommand+';'+copyToUserCommand+';'+chmodUserCommand+';'+rmSystemCommand
8dfb76c9 130 }).waitFor();
8dfb76c9
MG
131 Toast.makeText(FonBotPreferenceActivity.this,
132 "Reboot to make FonBot a non-system application", Toast.LENGTH_LONG).show();
133 }
134 } catch (IOException e) {
135 return false;
136 } catch (InterruptedException e) {
137 return false;
138 }
139 return true;
140 }
141 });
957f7118 142
1443a929
MG
143 final EditTextPreference protocolPreference=(EditTextPreference) findPreference("protocol");
144 protocolPreference.setSummary(protocolPreference.getText());
145 protocolPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
146 @Override
147 public boolean onPreferenceChange(final @Nullable Preference preference, final @Nullable Object newValue) {
148 if(newValue==null)
149 return false;
150
151 protocolPreference.setSummary(newValue.toString());
152 return true;
153 }
154 });
155
957f7118
MG
156 final EditTextPreference hostnamePreference=(EditTextPreference) findPreference("hostname");
157 hostnamePreference.setSummary(hostnamePreference.getText());
158 hostnamePreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
159 @Override
160 public boolean onPreferenceChange(final @Nullable Preference preference, final @Nullable Object newValue) {
161 if(newValue==null)
162 return false;
163
164 hostnamePreference.setSummary(newValue.toString());
165 return true;
166 }
167 });
168
169 final EditTextPreference portPreference=(EditTextPreference) findPreference("port");
170 portPreference.setSummary(portPreference.getText());
171 portPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
172 @Override
173 public boolean onPreferenceChange(final @Nullable Preference preference, final @Nullable Object newValue) {
174 if(newValue==null)
175 return false;
176
177 try{
178 Integer.parseInt(newValue.toString());
179 } catch (NumberFormatException e){
180 return false;
181 }
182 portPreference.setSummary(newValue.toString());
183 return true;
184 }
185 });
8dfb76c9
MG
186 }
187
188 @Override
189 protected void onActivityResult(final int requestCode, final int resultCode, @Nullable final Intent data) {
190 final DevicePolicyManager dpm=(DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);
191 final ComponentName adminReceiver=new ComponentName(this,FonBotAdminReceiver.class);
192 adminPreference.setChecked(dpm.isAdminActive(adminReceiver));
193 }
194
195}
This page took 0.025682 seconds and 4 git commands to generate.