PluginFragment.java revision 993b919951a70817e583aa94a242511f40a65b4d
1/* 2 * Copyright (C) 2016 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 15package com.android.systemui.tuner; 16 17import android.content.BroadcastReceiver; 18import android.content.ComponentName; 19import android.content.Context; 20import android.content.Intent; 21import android.content.IntentFilter; 22import android.content.pm.PackageManager; 23import android.content.pm.ResolveInfo; 24import android.net.Uri; 25import android.os.Bundle; 26import android.provider.Settings; 27import android.support.v14.preference.PreferenceFragment; 28import android.support.v14.preference.SwitchPreference; 29import android.support.v7.preference.PreferenceCategory; 30import android.support.v7.preference.PreferenceScreen; 31import android.support.v7.preference.PreferenceViewHolder; 32import android.view.View; 33 34import com.android.systemui.R; 35import com.android.systemui.plugins.PluginManager; 36import com.android.systemui.plugins.PluginPrefs; 37 38import java.util.List; 39import java.util.Set; 40 41public class PluginFragment extends PreferenceFragment { 42 43 public static final String ACTION_PLUGIN_SETTINGS 44 = "com.android.systemui.action.PLUGIN_SETTINGS"; 45 46 private PluginPrefs mPluginPrefs; 47 48 @Override 49 public void onCreate(Bundle savedInstanceState) { 50 super.onCreate(savedInstanceState); 51 IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED); 52 filter.addAction(Intent.ACTION_PACKAGE_CHANGED); 53 filter.addAction(Intent.ACTION_PACKAGE_REMOVED); 54 filter.addAction(PluginManager.PLUGIN_CHANGED); 55 filter.addDataScheme("package"); 56 getContext().registerReceiver(mReceiver, filter); 57 filter = new IntentFilter(Intent.ACTION_USER_UNLOCKED); 58 getContext().registerReceiver(mReceiver, filter); 59 } 60 61 @Override 62 public void onDestroy() { 63 super.onDestroy(); 64 getContext().unregisterReceiver(mReceiver); 65 } 66 67 @Override 68 public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { 69 loadPrefs(); 70 } 71 72 private void loadPrefs() { 73 PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(getContext()); 74 screen.setOrderingAsAdded(false); 75 Context prefContext = getPreferenceManager().getContext(); 76 mPluginPrefs = new PluginPrefs(getContext()); 77 Set<String> pluginActions = mPluginPrefs.getPluginList(); 78 for (String action : pluginActions) { 79 String name = action.replace("com.android.systemui.action.PLUGIN_", ""); 80 PreferenceCategory category = new PreferenceCategory(prefContext); 81 category.setTitle(name); 82 83 List<ResolveInfo> result = getContext().getPackageManager().queryIntentServices( 84 new Intent(action), PackageManager.MATCH_DISABLED_COMPONENTS); 85 if (result.size() > 0) { 86 screen.addPreference(category); 87 } 88 for (ResolveInfo info : result) { 89 category.addPreference(new PluginPreference(prefContext, info)); 90 } 91 } 92 setPreferenceScreen(screen); 93 } 94 95 private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 96 @Override 97 public void onReceive(Context context, Intent intent) { 98 loadPrefs(); 99 } 100 }; 101 102 private static class PluginPreference extends SwitchPreference { 103 private final ComponentName mComponent; 104 private final boolean mHasSettings; 105 106 public PluginPreference(Context prefContext, ResolveInfo info) { 107 super(prefContext); 108 mComponent = new ComponentName(info.serviceInfo.packageName, info.serviceInfo.name); 109 PackageManager pm = prefContext.getPackageManager(); 110 mHasSettings = pm.resolveActivity(new Intent(ACTION_PLUGIN_SETTINGS) 111 .setPackage(mComponent.getPackageName()), 0) != null; 112 setTitle(info.serviceInfo.loadLabel(pm)); 113 setChecked(pm.getComponentEnabledSetting(mComponent) 114 != PackageManager.COMPONENT_ENABLED_STATE_DISABLED); 115 setWidgetLayoutResource(R.layout.tuner_widget_settings_switch); 116 } 117 118 @Override 119 protected boolean persistBoolean(boolean value) { 120 PackageManager pm = getContext().getPackageManager(); 121 final int desiredState = value ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED 122 : PackageManager.COMPONENT_ENABLED_STATE_DISABLED; 123 if (pm.getComponentEnabledSetting(mComponent) == desiredState) return true; 124 pm.setComponentEnabledSetting(mComponent, 125 desiredState, 126 PackageManager.DONT_KILL_APP); 127 final String pkg = mComponent.getPackageName(); 128 final Intent intent = new Intent(PluginManager.PLUGIN_CHANGED, 129 pkg != null ? Uri.fromParts("package", pkg, null) : null); 130 getContext().sendBroadcast(intent); 131 return true; 132 } 133 134 @Override 135 public void onBindViewHolder(PreferenceViewHolder holder) { 136 super.onBindViewHolder(holder); 137 holder.findViewById(R.id.settings).setVisibility(mHasSettings ? View.VISIBLE 138 : View.GONE); 139 holder.findViewById(R.id.divider).setVisibility(mHasSettings ? View.VISIBLE 140 : View.GONE); 141 holder.findViewById(R.id.settings).setOnClickListener(v -> { 142 ResolveInfo result = v.getContext().getPackageManager().resolveActivity( 143 new Intent(ACTION_PLUGIN_SETTINGS).setPackage( 144 mComponent.getPackageName()), 0); 145 if (result != null) { 146 v.getContext().startActivity(new Intent().setComponent( 147 new ComponentName(result.activityInfo.packageName, 148 result.activityInfo.name))); 149 } 150 }); 151 holder.itemView.setOnLongClickListener(v -> { 152 Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 153 intent.setData(Uri.fromParts("package", mComponent.getPackageName(), null)); 154 getContext().startActivity(intent); 155 return true; 156 }); 157 } 158 } 159} 160