blob: 11e1f278a2719a18dd368963311eecd43ab277c7 [file] [log] [blame]
/*
* 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<SelectablePreference> 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<LauncherActivityInfo> activities = apps.getActivityList(null,
Process.myUserHandle());
screen.addPreference(otherApps);
activities.forEach(info -> {
try {
List<Shortcut> 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();
}
}
}