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
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}
201