1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 5 * except in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the 10 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 11 * KIND, either express or implied. See the License for the specific language governing 12 * permissions and limitations under the License. 13 */ 14 15 package com.android.systemui.tuner; 16 17 import android.app.ActivityManager; 18 import android.content.BroadcastReceiver; 19 import android.content.ComponentName; 20 import android.content.Context; 21 import android.content.DialogInterface; 22 import android.content.DialogInterface.OnClickListener; 23 import android.content.Intent; 24 import android.content.pm.PackageManager; 25 import android.content.pm.PackageManager.NameNotFoundException; 26 import android.os.UserHandle; 27 import android.provider.Settings; 28 29 import static android.provider.Settings.System.SHOW_BATTERY_PERCENT; 30 import com.android.systemui.DemoMode; 31 import com.android.systemui.Dependency; 32 import com.android.systemui.R; 33 import com.android.systemui.statusbar.phone.SystemUIDialog; 34 35 public abstract class TunerService { 36 37 public static final String ACTION_CLEAR = "com.android.systemui.action.CLEAR_TUNER"; 38 39 public abstract void clearAll(); 40 public abstract void destroy(); 41 42 public abstract String getValue(String setting); 43 public abstract int getValue(String setting, int def); 44 public abstract String getValue(String setting, String def); 45 46 public abstract void setValue(String setting, String value); 47 public abstract void setValue(String setting, int value); 48 49 public abstract void addTunable(Tunable tunable, String... keys); 50 public abstract void removeTunable(Tunable tunable); 51 52 public interface Tunable { 53 void onTuningChanged(String key, String newValue); 54 } 55 56 private static Context userContext(Context context) { 57 try { 58 return context.createPackageContextAsUser(context.getPackageName(), 0, 59 new UserHandle(ActivityManager.getCurrentUser())); 60 } catch (NameNotFoundException e) { 61 return context; 62 } 63 } 64 65 public static final void setTunerEnabled(Context context, boolean enabled) { 66 userContext(context).getPackageManager().setComponentEnabledSetting( 67 new ComponentName(context, TunerActivity.class), 68 enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED 69 : PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 70 PackageManager.DONT_KILL_APP); 71 } 72 73 public static final boolean isTunerEnabled(Context context) { 74 return userContext(context).getPackageManager().getComponentEnabledSetting( 75 new ComponentName(context, TunerActivity.class)) 76 == PackageManager.COMPONENT_ENABLED_STATE_ENABLED; 77 } 78 79 public static class ClearReceiver extends BroadcastReceiver { 80 @Override 81 public void onReceive(Context context, Intent intent) { 82 if (ACTION_CLEAR.equals(intent.getAction())) { 83 Dependency.get(TunerService.class).clearAll(); 84 } 85 } 86 } 87 88 public static final void showResetRequest(final Context context, final Runnable onDisabled) { 89 SystemUIDialog dialog = new SystemUIDialog(context); 90 dialog.setShowForAllUsers(true); 91 dialog.setMessage(R.string.remove_from_settings_prompt); 92 dialog.setButton(DialogInterface.BUTTON_NEGATIVE, context.getString(R.string.cancel), 93 (OnClickListener) null); 94 dialog.setButton(DialogInterface.BUTTON_POSITIVE, 95 context.getString(R.string.guest_exit_guest_dialog_remove), new OnClickListener() { 96 @Override 97 public void onClick(DialogInterface dialog, int which) { 98 // Tell the tuner (in main SysUI process) to clear all its settings. 99 context.sendBroadcast(new Intent(TunerService.ACTION_CLEAR)); 100 // Disable access to tuner. 101 TunerService.setTunerEnabled(context, false); 102 // Make them sit through the warning dialog again. 103 Settings.Secure.putInt(context.getContentResolver(), 104 TunerFragment.SETTING_SEEN_TUNER_WARNING, 0); 105 if (onDisabled != null) { 106 onDisabled.run(); 107 } 108 } 109 }); 110 dialog.show(); 111 } 112 } 113