Skip to content

Commit 9f906e0

Browse files
committed
Multi-user support with 3 modes
1 parent 3aef6ef commit 9f906e0

File tree

9 files changed

+82
-10
lines changed

9 files changed

+82
-10
lines changed

res/values/arrays.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,16 @@
7373
<item>17</item>
7474
<item>80</item>
7575
</string-array>
76+
77+
<string-array name="pref_user_mode_entries">
78+
<item>Owner only</item>
79+
<item>Owner controlled</item>
80+
<item>User controlled</item>
81+
</string-array>
82+
<!-- Do not translate -->
83+
<string-array name="pref_user_mode_values">
84+
<item>owner_only</item>
85+
<item>owner</item>
86+
<item>user</item>
87+
</string-array>
7688
</resources>

res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@
124124

125125
<string name="pref_title">Preferences</string>
126126
<string name="pref_category_security">Security</string>
127+
<string name="pref_user_mode_title">Multi-user mode</string>
127128
<string name="pref_pin_title">Use PIN</string>
128129
<string name="pref_change_pin_title">Change PIN</string>
129130
<string name="pref_timeout_title">Access timeout</string>

res/xml/preferences.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@
1818
<PreferenceCategory
1919
android:key="pref_category_security"
2020
android:title="@string/pref_category_security">
21+
<ListPreference
22+
android:defaultValue="owner_only"
23+
android:key="pref_user_mode"
24+
android:title="@string/pref_user_mode_title"
25+
android:entries="@array/pref_user_mode_entries"
26+
android:entryValues="@array/pref_user_mode_values" />
2127
<CheckBoxPreference
2228
android:key="pref_pin"
2329
android:title="@string/pref_pin_title"

res/xml/prefs_security.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,13 @@
1616
-->
1717
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
1818

19+
<ListPreference
20+
android:defaultValue="owner_only"
21+
android:key="pref_user_mode"
22+
android:title="@string/pref_user_mode_title"
23+
android:entries="@array/pref_user_mode_entries"
24+
android:entryValues="@array/pref_user_mode_values" />
25+
1926
<CheckBoxPreference
2027
android:defaultValue="false"
2128
android:key="pref_pin"

src/com/noshufou/android/su/preferences/Preferences.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33

44
public class Preferences {
55

6-
public static final String PIN = "pref_pin";
6+
public static final String USER_MODE = "pref_user_mode";
7+
public static final String PIN = "pref_pin";
78
public static final String CHANGE_PIN = "pref_change_pin";
89
public static final String TIMEOUT = "pref_timeout";
910
public static final String AUTOMATIC_ACTION = "pref_automatic_action";

src/com/noshufou/android/su/preferences/PreferencesActivity.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,13 @@
2323
import android.content.Intent;
2424
import android.content.SharedPreferences;
2525
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
26-
import android.net.Uri;
2726
import android.nfc.NfcAdapter;
2827
import android.os.AsyncTask;
2928
import android.os.Build;
3029
import android.os.Bundle;
3130
import android.preference.CheckBoxPreference;
3231
import android.preference.Preference;
3332
import android.preference.Preference.OnPreferenceChangeListener;
34-
import android.preference.PreferenceCategory;
3533
import android.preference.PreferenceScreen;
3634
import android.util.Log;
3735
import android.widget.Toast;
@@ -42,15 +40,12 @@
4240
import com.noshufou.android.su.PinActivity;
4341
import com.noshufou.android.su.R;
4442
import com.noshufou.android.su.TagWriterActivity;
45-
import com.noshufou.android.su.UpdaterActivity;
4643
import com.noshufou.android.su.provider.PermissionsProvider.Logs;
4744
import com.noshufou.android.su.service.ResultService;
4845
import com.noshufou.android.su.service.UpdaterService;
4946
import com.noshufou.android.su.util.BackupUtil;
5047
import com.noshufou.android.su.util.Util;
51-
import com.noshufou.android.su.util.Util.VersionInfo;
5248
import com.noshufou.android.su.widget.AncientNumberPickerDialog;
53-
import com.noshufou.android.su.widget.ChangeLog;
5449

5550
public class PreferencesActivity extends SherlockPreferenceActivity
5651
implements OnSharedPreferenceChangeListener, OnPreferenceChangeListener {
@@ -71,6 +66,7 @@ public class PreferencesActivity extends SherlockPreferenceActivity
7166
private CheckBoxPreference mPin = null;
7267
private CheckBoxPreference mGhostMode = null;
7368
private Preference mSecretCode = null;
69+
private Preference mUserMode = null;
7470

7571
private Context mContext;
7672
private boolean mElite = false;
@@ -130,6 +126,11 @@ protected void onCreate(Bundle savedInstanceState) {
130126
}
131127

132128
mClearLog = prefScreen.findPreference(Preferences.CLEAR_LOG);
129+
mUserMode = findPreference(Preferences.USER_MODE);
130+
if (!Util.isUserOwner(this) && mUserMode != null) {
131+
mUserMode.setEnabled(false);
132+
}
133+
133134
}
134135

135136
@Override
@@ -285,6 +286,8 @@ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
285286
.getString(Preferences.NOTIFICATION_TYPE, "toast").equals("toast"));
286287
} else if (key.equals(Preferences.AUTOMATIC_ACTION)) {
287288
Util.writeDefaultStoreFile(this);
289+
} else if (key.equals(Preferences.USER_MODE)) {
290+
Util.writeOptionsFile(this);
288291
}
289292
}
290293

src/com/noshufou/android/su/preferences/PreferencesFragment.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public class PreferencesFragment extends PreferenceFragment
3737

3838
private CheckBoxPreference mPin = null;
3939
private CheckBoxPreference mGhostMode = null;
40+
private Preference mUserMode = null;
4041
private Preference mSecretCode = null;
4142
private PreferenceEnabler mEnabler = null;
4243

@@ -110,6 +111,11 @@ public void onCreate(Bundle savedInstanceState) {
110111
mSecretCode.setSummary(getString(R.string.pref_secret_code_summary,
111112
mPrefs.getString(Preferences.SECRET_CODE, "787378737")));
112113
// mToastLocation = findPreference(Preferences.TOAST_LOCATION);
114+
115+
mUserMode = findPreference(Preferences.USER_MODE);
116+
if (!Util.isUserOwner(getActivity()) && mUserMode != null) {
117+
mUserMode.setEnabled(false);
118+
}
113119

114120
updateTimeout(mPrefs.getInt(Preferences.TIMEOUT, 0));
115121
updateLogLimit(mPrefs.getInt(Preferences.LOG_ENTRY_LIMIT, 200));
@@ -247,6 +253,8 @@ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, Strin
247253
setDepsNfc(sharedPreferences.getBoolean(Preferences.PIN, false));
248254
} else if (key.equals(Preferences.AUTOMATIC_ACTION)) {
249255
Util.writeDefaultStoreFile(getActivity());
256+
} else if (key.equals(Preferences.USER_MODE)) {
257+
Util.writeOptionsFile(getActivity());
250258
}
251259
}
252260

src/com/noshufou/android/su/service/ResultService.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,6 @@ protected void onHandleIntent(Intent intent) {
9292
appId = c.getLong(COLUMN_ID);
9393
appNotify = c.getString(COLUMN_NOTIFICATIONS);
9494
appLog = c.getString(COLUMN_LOGGING);
95-
int dbAllow = c.getInt(COLUMN_ALLOW);
96-
if (dbAllow != -1) {
97-
allow = dbAllow;
98-
}
9995
}
10096
c.close();
10197

src/com/noshufou/android/su/util/Util.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -901,4 +901,42 @@ public static boolean writeDefaultStoreFile(Context context) {
901901
}
902902
return true;
903903
}
904+
905+
public static boolean writeOptionsFile(Context context) {
906+
File storedDir = new File(context.getFilesDir().getAbsolutePath() + File.separator + "stored");
907+
storedDir.mkdirs();
908+
File optFile = new File(storedDir.getAbsolutePath() + File.separator + "options");
909+
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
910+
String ownerMode = prefs.getString(Preferences.USER_MODE, "owner_only");
911+
try {
912+
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(optFile.getAbsolutePath()));
913+
out.write(ownerMode);
914+
out.write("\n");
915+
out.flush();
916+
out.close();
917+
} catch (FileNotFoundException e) {
918+
Log.w(TAG, "Options file not written", e);
919+
return false;
920+
} catch (IOException e) {
921+
Log.w(TAG, "Options file not written", e);
922+
return false;
923+
}
924+
return true;
925+
}
926+
927+
public static boolean isUserOwner(Context context) {
928+
PackageManager pm = context.getPackageManager();
929+
try {
930+
ApplicationInfo ai = pm.getApplicationInfo(context.getPackageName(), 0);
931+
if (ai.uid < 99999) {
932+
return true;
933+
} else {
934+
return false;
935+
}
936+
} catch (NameNotFoundException e) {
937+
Log.e(TAG, "Divided by zero...");
938+
return false;
939+
}
940+
}
941+
904942
}

0 commit comments

Comments
 (0)