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