/* * 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 static com.android.systemui.tuner.LockscreenFragment.LOCKSCREEN_LEFT_BUTTON; import android.content.Context; import android.content.pm.LauncherActivityInfo; import android.content.pm.LauncherApps; import android.content.pm.PackageManager.NameNotFoundException; import android.os.Bundle; import android.os.Process; import androidx.preference.Preference; import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceFragment; import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceViewHolder; import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.tuner.ShortcutParser.Shortcut; import com.android.systemui.tuner.TunerService.Tunable; import java.util.ArrayList; import java.util.List; public class ShortcutPicker extends PreferenceFragment implements Tunable { private final ArrayList mSelectablePreferences = new ArrayList<>(); private String mKey; private SelectablePreference mNonePreference; private TunerService mTunerService; @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { Context context = getPreferenceManager().getContext(); PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(context); screen.setOrderingAsAdded(true); PreferenceCategory otherApps = new PreferenceCategory(context); otherApps.setTitle(R.string.tuner_other_apps); mNonePreference = new SelectablePreference(context); mSelectablePreferences.add(mNonePreference); mNonePreference.setTitle(R.string.lockscreen_none); mNonePreference.setIcon(R.drawable.ic_remove_circle); screen.addPreference(mNonePreference); LauncherApps apps = getContext().getSystemService(LauncherApps.class); List activities = apps.getActivityList(null, Process.myUserHandle()); screen.addPreference(otherApps); activities.forEach(info -> { try { List shortcuts = new ShortcutParser(getContext(), info.getComponentName()).getShortcuts(); AppPreference appPreference = new AppPreference(context, info); mSelectablePreferences.add(appPreference); if (shortcuts.size() != 0) { //PreferenceCategory category = new PreferenceCategory(context); //screen.addPreference(category); //category.setTitle(info.getLabel()); screen.addPreference(appPreference); shortcuts.forEach(shortcut -> { ShortcutPreference shortcutPref = new ShortcutPreference(context, shortcut, info.getLabel()); mSelectablePreferences.add(shortcutPref); screen.addPreference(shortcutPref); }); return; } otherApps.addPreference(appPreference); } catch (NameNotFoundException e) { } }); // Move other apps to the bottom. screen.removePreference(otherApps); for (int i = 0; i < otherApps.getPreferenceCount(); i++) { Preference p = otherApps.getPreference(0); otherApps.removePreference(p); p.setOrder(Preference.DEFAULT_ORDER); screen.addPreference(p); } //screen.addPreference(otherApps); setPreferenceScreen(screen); mKey = getArguments().getString(ARG_PREFERENCE_ROOT); mTunerService = Dependency.get(TunerService.class); mTunerService.addTunable(this, mKey); } @Override public boolean onPreferenceTreeClick(Preference preference) { mTunerService.setValue(mKey, preference.toString()); getActivity().onBackPressed(); return true; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (LOCKSCREEN_LEFT_BUTTON.equals(mKey)) { getActivity().setTitle(R.string.lockscreen_shortcut_left); } else { getActivity().setTitle(R.string.lockscreen_shortcut_right); } } @Override public void onDestroy() { super.onDestroy(); mTunerService.removeTunable(this); } @Override public void onTuningChanged(String key, String newValue) { String v = newValue != null ? newValue : ""; mSelectablePreferences.forEach(p -> p.setChecked(v.equals(p.toString()))); } private static class AppPreference extends SelectablePreference { private final LauncherActivityInfo mInfo; private boolean mBinding; public AppPreference(Context context, LauncherActivityInfo info) { super(context); mInfo = info; setTitle(context.getString(R.string.tuner_launch_app, info.getLabel())); setSummary(context.getString(R.string.tuner_app, info.getLabel())); } @Override public void onBindViewHolder(PreferenceViewHolder holder) { mBinding = true; if (getIcon() == null) { setIcon(mInfo.getBadgedIcon( getContext().getResources().getConfiguration().densityDpi)); } mBinding = false; super.onBindViewHolder(holder); } @Override protected void notifyChanged() { if (mBinding) return; super.notifyChanged(); } @Override public String toString() { return mInfo.getComponentName().flattenToString(); } } private static class ShortcutPreference extends SelectablePreference { private final Shortcut mShortcut; private boolean mBinding; public ShortcutPreference(Context context, Shortcut shortcut, CharSequence appLabel) { super(context); mShortcut = shortcut; setTitle(shortcut.label); setSummary(context.getString(R.string.tuner_app, appLabel)); } @Override public void onBindViewHolder(PreferenceViewHolder holder) { mBinding = true; if (getIcon() == null) { setIcon(mShortcut.icon.loadDrawable(getContext())); } mBinding = false; super.onBindViewHolder(holder); } @Override protected void notifyChanged() { if (mBinding) return; super.notifyChanged(); } @Override public String toString() { return mShortcut.toString(); } } }