/* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the specific language governing * permissions and limitations under the License. */ package com.android.systemui.tuner; import android.app.ActivityManager; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.os.UserHandle; import android.provider.Settings; import static android.provider.Settings.System.SHOW_BATTERY_PERCENT; import com.android.systemui.DemoMode; import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.statusbar.phone.SystemUIDialog; public abstract class TunerService { public static final String ACTION_CLEAR = "com.android.systemui.action.CLEAR_TUNER"; public abstract void clearAll(); public abstract void destroy(); public abstract String getValue(String setting); public abstract int getValue(String setting, int def); public abstract String getValue(String setting, String def); public abstract void setValue(String setting, String value); public abstract void setValue(String setting, int value); public abstract void addTunable(Tunable tunable, String... keys); public abstract void removeTunable(Tunable tunable); public interface Tunable { void onTuningChanged(String key, String newValue); } private static Context userContext(Context context) { try { return context.createPackageContextAsUser(context.getPackageName(), 0, new UserHandle(ActivityManager.getCurrentUser())); } catch (NameNotFoundException e) { return context; } } public static final void setTunerEnabled(Context context, boolean enabled) { userContext(context).getPackageManager().setComponentEnabledSetting( new ComponentName(context, TunerActivity.class), enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); userContext(context).getPackageManager().setComponentEnabledSetting( new ComponentName(context, TunerActivity.ACTIVITY_ALIAS_NAME), enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); } public static final boolean isTunerEnabled(Context context) { return userContext(context).getPackageManager().getComponentEnabledSetting( new ComponentName(context, TunerActivity.class)) == PackageManager.COMPONENT_ENABLED_STATE_ENABLED; } public static class ClearReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (ACTION_CLEAR.equals(intent.getAction())) { Dependency.get(TunerService.class).clearAll(); } } } public static final void showResetRequest(final Context context, final Runnable onDisabled) { SystemUIDialog dialog = new SystemUIDialog(context); dialog.setShowForAllUsers(true); dialog.setMessage(R.string.remove_from_settings_prompt); dialog.setButton(DialogInterface.BUTTON_NEGATIVE, context.getString(R.string.cancel), (OnClickListener) null); dialog.setButton(DialogInterface.BUTTON_POSITIVE, context.getString(R.string.guest_exit_guest_dialog_remove), new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // Tell the tuner (in main SysUI process) to clear all its settings. context.sendBroadcast(new Intent(TunerService.ACTION_CLEAR)); // Disable access to tuner. TunerService.setTunerEnabled(context, false); // Make them sit through the warning dialog again. Settings.Secure.putInt(context.getContentResolver(), TunerFragment.SETTING_SEEN_TUNER_WARNING, 0); if (onDisabled != null) { onDisabled.run(); } } }); dialog.show(); } }