2 * Copyright (C) 2013 Koushik Dutta (@koush)
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package com.koushikdutta.superuser;
19 import android.annotation.SuppressLint;
20 import android.app.AlertDialog;
21 import android.app.Dialog;
22 import android.content.Context;
23 import android.content.DialogInterface;
24 import android.content.DialogInterface.OnClickListener;
25 import android.content.Intent;
26 import android.os.Bundle;
27 import android.view.LayoutInflater;
28 import android.view.View;
29 import android.view.ViewGroup;
30 import android.view.ViewGroup.LayoutParams;
31 import android.widget.Toast;
33 import com.koushikdutta.superuser.util.Settings;
34 import com.koushikdutta.widgets.BetterListFragmentInternal;
35 import com.koushikdutta.widgets.FragmentInterfaceWrapper;
36 import com.koushikdutta.widgets.ListItem;
38 @SuppressLint("ValidFragment")
39 public class SettingsFragmentInternal extends BetterListFragmentInternal {
40 public SettingsFragmentInternal(FragmentInterfaceWrapper fragment) {
45 protected int getListFragmentResource() {
46 return R.layout.settings;
50 void confirmPin(final String pin) {
51 final Dialog d = new Dialog(getContext());
52 d.setTitle(R.string.confirm_pin);
53 d.setContentView(new PinViewHelper((LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE), null, null) {
54 public void onEnter(String password) {
55 super.onEnter(password);
56 if (pin.equals(password)) {
57 Settings.setPin(getActivity(), password);
58 pinItem.setSummary(Settings.isPinProtected(getActivity()) ? R.string.pin_set : R.string.pin_protection_summary);
59 if (password != null && password.length() > 0)
60 Toast.makeText(getActivity(), getString(R.string.pin_set), Toast.LENGTH_SHORT).show();
64 Toast.makeText(getActivity(), getString(R.string.pin_mismatch), Toast.LENGTH_SHORT).show();
67 public void onCancel() {
71 }.getView(), new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
76 final Dialog d = new Dialog(getContext());
77 d.setTitle(R.string.enter_new_pin);
78 d.setContentView(new PinViewHelper((LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE), null, null) {
79 public void onEnter(String password) {
80 super.onEnter(password);
85 public void onCancel() {
94 if (Settings.isPinProtected(getActivity())) {
95 final Dialog d = new Dialog(getContext());
96 d.setTitle(R.string.enter_pin);
97 d.setContentView(new PinViewHelper((LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE), null, null) {
98 public void onEnter(String password) {
99 super.onEnter(password);
100 if (Settings.checkPin(getActivity(), password)) {
101 super.onEnter(password);
102 Settings.setPin(getActivity(), null);
103 pinItem.setSummary(R.string.pin_protection_summary);
104 Toast.makeText(getActivity(), getString(R.string.pin_disabled), Toast.LENGTH_SHORT).show();
108 Toast.makeText(getActivity(), getString(R.string.incorrect_pin), Toast.LENGTH_SHORT).show();
111 public void onCancel() {
115 }.getView(), new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
124 protected void onCreate(Bundle savedInstanceState, View view) {
125 super.onCreate(savedInstanceState, view);
127 // NOTE to future koush
128 // dark icons use the color #f3f3f3
130 addItem(R.string.security, new ListItem(this, R.string.superuser_access, 0, 0) {
132 switch (Settings.getSuperuserAccess()) {
133 case Settings.SUPERUSER_ACCESS_ADB_ONLY:
134 setSummary(R.string.adb_only);
136 case Settings.SUPERUSER_ACCESS_APPS_ONLY:
137 setSummary(R.string.apps_only);
139 case Settings.SUPERUSER_ACCESS_APPS_AND_ADB:
140 setSummary(R.string.apps_and_adb);
142 case Settings.SUPERUSER_ACCESS_DISABLED:
143 setSummary(R.string.access_disabled);
146 setSummary(R.string.apps_and_adb);
155 public void onClick(View view) {
158 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
159 builder.setTitle(R.string.superuser_access);
160 String[] items = new String[] { getString(R.string.access_disabled), getString(R.string.apps_only), getString(R.string.adb_only), getString(R.string.apps_and_adb) };
161 builder.setItems(items, new OnClickListener() {
163 public void onClick(DialogInterface dialog, int which) {
166 Settings.setSuperuserAccess(Settings.SUPERUSER_ACCESS_DISABLED);
169 Settings.setSuperuserAccess(Settings.SUPERUSER_ACCESS_APPS_ONLY);
172 Settings.setSuperuserAccess(Settings.SUPERUSER_ACCESS_ADB_ONLY);
175 Settings.setSuperuserAccess(Settings.SUPERUSER_ACCESS_APPS_AND_ADB);
181 builder.create().show();
183 }).setAttrDrawable(R.attr.toggleIcon);
185 if (Settings.getMultiuserMode(getActivity()) != Settings.MULTIUSER_MODE_NONE) {
186 addItem(R.string.security, new ListItem(this, R.string.multiuser_policy, 0) {
189 switch (Settings.getMultiuserMode(getActivity())) {
190 case Settings.MULTIUSER_MODE_OWNER_MANAGED:
191 res = R.string.multiuser_owner_managed_summary;
193 case Settings.MULTIUSER_MODE_OWNER_ONLY:
194 res = R.string.multiuser_owner_only_summary;
196 case Settings.MULTIUSER_MODE_USER:
197 res = R.string.multiuser_user_summary;
201 if (!Helper.isAdminUser(getActivity())) {
205 s = getString(res) + "\n";
206 setSummary(s + getString(R.string.multiuser_require_owner));
219 public void onClick(View view) {
222 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
223 builder.setTitle(R.string.multiuser_policy);
224 String[] items = new String[] { getString(R.string.multiuser_owner_only), getString(R.string.multiuser_owner_managed), getString(R.string.multiuser_user) };
225 builder.setItems(items, new OnClickListener() {
227 public void onClick(DialogInterface dialog, int which) {
230 Settings.setMultiuserMode(getActivity(), Settings.MULTIUSER_MODE_OWNER_ONLY);
233 Settings.setMultiuserMode(getActivity(), Settings.MULTIUSER_MODE_OWNER_MANAGED);
236 Settings.setMultiuserMode(getActivity(), Settings.MULTIUSER_MODE_USER);
242 builder.create().show();
244 }).setAttrDrawable(R.attr.multiuserIcon);
247 addItem(R.string.security, new ListItem(this, R.string.declared_permission, R.string.declared_permission_summary) {
249 public void onClick(View view) {
251 Settings.setRequirePermission(getActivity(), getChecked());
254 .setAttrDrawable(R.attr.declaredPermissionsIcon)
255 .setCheckboxVisible(true)
256 .setChecked(Settings.getRequirePermission(getActivity()));
258 addItem(R.string.security, new ListItem(this, R.string.automatic_response, 0) {
260 switch (Settings.getAutomaticResponse(getActivity())) {
261 case Settings.AUTOMATIC_RESPONSE_ALLOW:
262 setSummary(R.string.automatic_response_allow_summary);
264 case Settings.AUTOMATIC_RESPONSE_DENY:
265 setSummary(R.string.automatic_response_deny_summary);
267 case Settings.AUTOMATIC_RESPONSE_PROMPT:
268 setSummary(R.string.automatic_response_prompt_summary);
277 public void onClick(View view) {
280 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
281 builder.setTitle(R.string.automatic_response);
282 String[] items = new String[] { getString(R.string.prompt), getString(R.string.su_deny), getString(R.string.su_allow) };
283 builder.setItems(items, new OnClickListener() {
285 public void onClick(DialogInterface dialog, int which) {
288 Settings.setAutomaticResponse(getActivity(), Settings.AUTOMATIC_RESPONSE_PROMPT);
291 Settings.setAutomaticResponse(getActivity(), Settings.AUTOMATIC_RESPONSE_DENY);
294 Settings.setAutomaticResponse(getActivity(), Settings.AUTOMATIC_RESPONSE_ALLOW);
300 builder.create().show();
303 .setAttrDrawable(R.attr.automaticResponseIcon);
305 pinItem = addItem(R.string.security, new ListItem(this, R.string.pin_protection, Settings.isPinProtected(getActivity()) ? R.string.pin_set : R.string.pin_protection_summary) {
307 public void onClick(View view) {
312 .setAttrDrawable(R.attr.pinProtectionIcon);
314 addItem(R.string.security, new ListItem(this, getString(R.string.request_timeout), getString(R.string.request_timeout_summary, Settings.getRequestTimeout(getActivity()))) {
316 public void onClick(View view) {
318 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
319 builder.setTitle(R.string.request_timeout);
320 String[] seconds = new String[3];
321 for (int i = 0; i < seconds.length; i++) {
322 seconds[i] = getString(R.string.number_seconds, (i + 1) * 10);
324 builder.setItems(seconds, new OnClickListener() {
326 public void onClick(DialogInterface dialog, int which) {
327 Settings.setTimeout(getActivity(), (which + 1) * 10);
328 setSummary(getString(R.string.request_timeout_summary, Settings.getRequestTimeout(getActivity())));
331 builder.create().show();
334 .setAttrDrawable(R.attr.requestTimeoutIcon);
336 addItem(R.string.settings, new ListItem(this, R.string.logging, R.string.logging_summary) {
338 public void onClick(View view) {
340 Settings.setLogging(getActivity(), getChecked());
343 .setAttrDrawable(R.attr.loggingIcon)
344 .setCheckboxVisible(true)
345 .setChecked(Settings.getLogging(getActivity()));
347 addItem(R.string.settings, new ListItem(this, R.string.notifications, 0) {
349 switch (Settings.getNotificationType(getActivity())) {
350 case Settings.NOTIFICATION_TYPE_NONE:
351 setSummary(getString(R.string.no_notification));
353 case Settings.NOTIFICATION_TYPE_NOTIFICATION:
354 setSummary(getString(R.string.notifications_summary, getString(R.string.notification)));
356 case Settings.NOTIFICATION_TYPE_TOAST:
357 setSummary(getString(R.string.notifications_summary, getString(R.string.toast)));
366 public void onClick(View view) {
369 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
370 builder.setTitle(R.string.notifications);
371 String[] items = new String[] { getString(R.string.none), getString(R.string.toast), getString(R.string.notification) };
372 builder.setItems(items, new OnClickListener() {
374 public void onClick(DialogInterface dialog, int which) {
377 Settings.setNotificationType(getActivity(), Settings.NOTIFICATION_TYPE_NONE);
380 Settings.setNotificationType(getActivity(), Settings.NOTIFICATION_TYPE_NOTIFICATION);
383 Settings.setNotificationType(getActivity(), Settings.NOTIFICATION_TYPE_TOAST);
389 builder.create().show();
392 .setAttrDrawable(R.attr.notificationsIcon);
394 if ("com.koushikdutta.superuser".equals(getActivity().getPackageName())) {
395 addItem(R.string.settings, new ListItem(this, R.string.theme, 0) {
397 switch (Settings.getTheme(getActivity())) {
398 case Settings.THEME_DARK:
399 setSummary(R.string.dark);
402 setSummary(R.string.light);
411 public void onClick(View view) {
414 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
415 builder.setTitle(R.string.theme);
416 String[] items = new String[] { getString(R.string.light), getString(R.string.dark) };
417 builder.setItems(items, new OnClickListener() {
419 public void onClick(DialogInterface dialog, int which) {
421 case Settings.THEME_DARK:
422 Settings.setTheme(getContext(), Settings.THEME_DARK);
425 Settings.setTheme(getContext(), Settings.THEME_LIGHT);
429 getActivity().startActivity(new Intent(getActivity(), MainActivity.class));
430 getActivity().finish();
433 builder.create().show();
436 .setAttrDrawable(R.attr.themeIcon);