blob: 533388a1a5d8f7e0c00678c109adcaa8362a574d [file] [log] [blame]
Jason Monk790442e2017-02-13 17:49:39 -05001/*
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
15package com.android.systemui.tuner;
16
17import static com.android.systemui.tuner.LockscreenFragment.LOCKSCREEN_LEFT_BUTTON;
18
19import android.content.Context;
20import android.content.pm.LauncherActivityInfo;
21import android.content.pm.LauncherApps;
22import android.content.pm.PackageManager.NameNotFoundException;
23import android.graphics.drawable.ColorDrawable;
24import android.os.Bundle;
25import android.os.Process;
26import android.support.v14.preference.PreferenceFragment;
27import android.support.v7.preference.Preference;
28import android.support.v7.preference.PreferenceCategory;
29import android.support.v7.preference.PreferenceScreen;
30import android.support.v7.preference.PreferenceViewHolder;
31
32import com.android.systemui.Dependency;
33import com.android.systemui.R;
34import com.android.systemui.tuner.ShortcutParser.Shortcut;
35import com.android.systemui.tuner.TunerService.Tunable;
36
37import java.util.ArrayList;
38import java.util.List;
39
40public class ShortcutPicker extends PreferenceFragment implements Tunable {
41
42 private final ArrayList<SelectablePreference> mSelectablePreferences = new ArrayList<>();
43 private String mKey;
44 private SelectablePreference mNonePreference;
45 private TunerService mTunerService;
46
47 @Override
48 public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
49 Context context = getPreferenceManager().getContext();
50 PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(context);
51 screen.setOrderingAsAdded(true);
52 PreferenceCategory otherApps = new PreferenceCategory(context);
53 otherApps.setTitle(R.string.tuner_other_apps);
54
55 mNonePreference = new SelectablePreference(context);
56 mSelectablePreferences.add(mNonePreference);
57 mNonePreference.setTitle(R.string.lockscreen_none);
58 mNonePreference.setIcon(R.drawable.ic_remove_circle);
59 screen.addPreference(mNonePreference);
60
61 LauncherApps apps = getContext().getSystemService(LauncherApps.class);
62 List<LauncherActivityInfo> activities = apps.getActivityList(null,
63 Process.myUserHandle());
64
65 screen.addPreference(otherApps);
66 activities.forEach(info -> {
67 try {
68 List<Shortcut> shortcuts = new ShortcutParser(getContext(),
69 info.getComponentName()).getShortcuts();
70 AppPreference appPreference = new AppPreference(context, info);
71 mSelectablePreferences.add(appPreference);
72 if (shortcuts.size() != 0) {
73 //PreferenceCategory category = new PreferenceCategory(context);
74 //screen.addPreference(category);
75 //category.setTitle(info.getLabel());
76 screen.addPreference(appPreference);
77 shortcuts.forEach(shortcut -> {
78 ShortcutPreference shortcutPref = new ShortcutPreference(context, shortcut,
79 info.getLabel());
80 mSelectablePreferences.add(shortcutPref);
81 screen.addPreference(shortcutPref);
82 });
83 return;
84 }
85 otherApps.addPreference(appPreference);
86 } catch (NameNotFoundException e) {
87 }
88 });
89 // Move other apps to the bottom.
90 screen.removePreference(otherApps);
91 for (int i = 0; i < otherApps.getPreferenceCount(); i++) {
92 Preference p = otherApps.getPreference(0);
93 otherApps.removePreference(p);
94 p.setOrder(Preference.DEFAULT_ORDER);
95 screen.addPreference(p);
96 }
97 //screen.addPreference(otherApps);
98
99 setPreferenceScreen(screen);
100 mKey = getArguments().getString(ARG_PREFERENCE_ROOT);
101 mTunerService = Dependency.get(TunerService.class);
102 mTunerService.addTunable(this, mKey);
103 }
104
105 @Override
106 public boolean onPreferenceTreeClick(Preference preference) {
107 mTunerService.setValue(mKey, preference.toString());
108 getActivity().onBackPressed();
109 return true;
110 }
111
112 @Override
113 public void onActivityCreated(Bundle savedInstanceState) {
114 super.onActivityCreated(savedInstanceState);
115 if (LOCKSCREEN_LEFT_BUTTON.equals(mKey)) {
116 getActivity().setTitle(R.string.lockscreen_shortcut_left);
117 } else {
118 getActivity().setTitle(R.string.lockscreen_shortcut_right);
119 }
120 }
121
122 @Override
123 public void onDestroy() {
124 super.onDestroy();
125 mTunerService.removeTunable(this);
126 }
127
128 @Override
129 public void onTuningChanged(String key, String newValue) {
130 String v = newValue != null ? newValue : "";
131 mSelectablePreferences.forEach(p -> p.setChecked(v.equals(p.toString())));
132 }
133
134 private static class AppPreference extends SelectablePreference {
135 private final LauncherActivityInfo mInfo;
136 private boolean mBinding;
137
138 public AppPreference(Context context, LauncherActivityInfo info) {
139 super(context);
140 mInfo = info;
141 setTitle(context.getString(R.string.tuner_launch_app, info.getLabel()));
142 setSummary(context.getString(R.string.tuner_app, info.getLabel()));
143 }
144
145 @Override
146 public void onBindViewHolder(PreferenceViewHolder holder) {
147 mBinding = true;
148 if (getIcon() == null) {
149 setIcon(mInfo.getBadgedIcon(
150 getContext().getResources().getConfiguration().densityDpi));
151 }
152 mBinding = false;
153 super.onBindViewHolder(holder);
154 }
155
156 @Override
157 protected void notifyChanged() {
158 if (mBinding) return;
159 super.notifyChanged();
160 }
161
162 @Override
163 public String toString() {
164 return mInfo.getComponentName().flattenToString();
165 }
166 }
167
168 private static class ShortcutPreference extends SelectablePreference {
169 private final Shortcut mShortcut;
170 private boolean mBinding;
171
172 public ShortcutPreference(Context context, Shortcut shortcut, CharSequence appLabel) {
173 super(context);
174 mShortcut = shortcut;
175 setTitle(shortcut.label);
176 setSummary(context.getString(R.string.tuner_app, appLabel));
177 }
178
179 @Override
180 public void onBindViewHolder(PreferenceViewHolder holder) {
181 mBinding = true;
182 if (getIcon() == null) {
183 setIcon(mShortcut.icon.loadDrawable(getContext()));
184 }
185 mBinding = false;
186 super.onBindViewHolder(holder);
187 }
188
189 @Override
190 protected void notifyChanged() {
191 if (mBinding) return;
192 super.notifyChanged();
193 }
194
195 @Override
196 public String toString() {
197 return mShortcut.toString();
198 }
199 }
200}