SettingsGoogle: Fix Quick Tap open apps apps list crashing

test: set quick app to open apps, open app list setting -> launch quick tap action
Signed-off-by: minaripenguin <minaripenguin@users.noreply.github.com>
Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>
diff --git a/SettingsGoogle/src/com/google/android/settings/gestures/columbus/ColumbusAppListPreferenceController.java b/SettingsGoogle/src/com/google/android/settings/gestures/columbus/ColumbusAppListPreferenceController.java
new file mode 100644
index 0000000..4d5f4de
--- /dev/null
+++ b/SettingsGoogle/src/com/google/android/settings/gestures/columbus/ColumbusAppListPreferenceController.java
@@ -0,0 +1,212 @@
+package com.google.android.settings.gestures.columbus;
+
+import android.app.ActivityManager;
+import android.content.Context;
+import android.content.IntentFilter;
+import android.content.pm.LauncherActivityInfo;
+import android.content.pm.LauncherApps;
+import android.content.pm.ShortcutInfo;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.os.Parcelable;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.View;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceScreen;
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.core.SubSettingLauncher;
+import com.android.settings.homepage.contextualcards.ContextualCardManager$$ExternalSyntheticLambda3;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnStart;
+import com.android.settingslib.widget.SelectorWithWidgetPreference;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.function.Function;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+import java.util.function.Supplier;
+
+public class ColumbusAppListPreferenceController extends BasePreferenceController implements SelectorWithWidgetPreference.OnClickListener, LifecycleObserver, OnStart {
+    static final String COLUMBUS_LAUNCH_APP_SECURE_KEY = "columbus_launch_app";
+    private static final String TAG = "ColumbusAppListPrefCtrl";
+    private int mCurrentUser;
+    private final LauncherApps mLauncherApps;
+    private final MetricsFeatureProvider mMetricsFeatureProvider;
+    private final String mOpenAppValue;
+    private PreferenceCategory mPreferenceCategory;
+
+    @Override
+    public Class getBackgroundWorkerClass() {
+        return super.getBackgroundWorkerClass();
+    }
+
+    @Override
+    public IntentFilter getIntentFilter() {
+        return super.getIntentFilter();
+    }
+
+    @Override
+    public int getSliceHighlightMenuRes() {
+        return super.getSliceHighlightMenuRes();
+    }
+
+    @Override
+    public boolean hasAsyncUpdate() {
+        return super.hasAsyncUpdate();
+    }
+
+    @Override
+    public boolean isPublicSlice() {
+        return super.isPublicSlice();
+    }
+
+    @Override
+    public boolean isSliceable() {
+        return super.isSliceable();
+    }
+
+    @Override
+    public boolean useDynamicSliceSummary() {
+        return super.useDynamicSliceSummary();
+    }
+
+    public ColumbusAppListPreferenceController(Context context, String str) {
+        super(context, str);
+        mLauncherApps = (LauncherApps) mContext.getSystemService(LauncherApps.class);
+        mOpenAppValue = mContext.getString(R.string.columbus_setting_action_launch_value);
+        mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return ColumbusPreferenceController.isColumbusSupported(mContext) ? 0 : 3;
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen preferenceScreen) {
+        super.displayPreference(preferenceScreen);
+        if (isAvailable()) {
+            mCurrentUser = ActivityManager.getCurrentUser();
+            mPreferenceCategory = (PreferenceCategory) preferenceScreen.findPreference(getPreferenceKey());
+            updateAppList();
+        }
+    }
+
+    @Override
+    public void updateState(Preference preference) {
+        super.updateState(preference);
+        int preferenceCount = mPreferenceCategory.getPreferenceCount();
+        if (preferenceCount == 0) {
+            return;
+        }
+        String stringForUser = Settings.Secure.getStringForUser(mContext.getContentResolver(), COLUMBUS_LAUNCH_APP_SECURE_KEY, mCurrentUser);
+        for (int i = 0; i < preferenceCount; i++) {
+            Preference preference2 = mPreferenceCategory.getPreference(i);
+            if (preference2 instanceof ColumbusRadioButtonPreference) {
+                ColumbusRadioButtonPreference columbusRadioButtonPreference = (ColumbusRadioButtonPreference) preference2;
+                columbusRadioButtonPreference.setChecked(TextUtils.equals(stringForUser, columbusRadioButtonPreference.getKey()));
+            }
+        }
+    }
+
+    @Override
+    public void onStart() {
+        updateAppList();
+    }
+
+    @Override
+    public void onRadioButtonClicked(SelectorWithWidgetPreference selectorWithWidgetPreference) {
+        if (selectorWithWidgetPreference instanceof ColumbusRadioButtonPreference) {
+            ColumbusRadioButtonPreference columbusRadioButtonPreference = (ColumbusRadioButtonPreference) selectorWithWidgetPreference;
+            Settings.Secure.putStringForUser(mContext.getContentResolver(), "columbus_action", mOpenAppValue, mCurrentUser);
+            Settings.Secure.putStringForUser(mContext.getContentResolver(), COLUMBUS_LAUNCH_APP_SECURE_KEY, columbusRadioButtonPreference.getKey(), mCurrentUser);
+            Settings.Secure.putStringForUser(mContext.getContentResolver(), "columbus_launch_app_shortcut", columbusRadioButtonPreference.getKey(), mCurrentUser);
+            mMetricsFeatureProvider.action(mContext, 1757, columbusRadioButtonPreference.getKey());
+            updateState(mPreferenceCategory);
+        }
+    }
+
+    private void updateAppList() {
+        PreferenceCategory preferenceCategory = mPreferenceCategory;
+        if (preferenceCategory == null) {
+            return;
+        }
+        preferenceCategory.removeAll();
+
+        List<LauncherActivityInfo> activityList = mLauncherApps.getActivityList(null, UserHandle.of(mCurrentUser));
+        activityList.sort(Comparator.comparing(new Function<LauncherActivityInfo, String>() {
+            @Override
+            public String apply(LauncherActivityInfo launcherActivityInfo) {
+                return lambda$updateAppList$0(launcherActivityInfo);
+            }
+        }));
+
+        List<ShortcutInfo> queryForShortcuts = queryForShortcuts();
+        for (final LauncherActivityInfo launcherActivityInfo : activityList) {
+            ArrayList<ShortcutInfo> arrayList = (ArrayList<ShortcutInfo>) queryForShortcuts.stream().filter(new Predicate<ShortcutInfo>() {
+                @Override
+                public boolean test(ShortcutInfo shortcutInfo) {
+                    return lambda$updateAppList$1(launcherActivityInfo, shortcutInfo);
+                }
+            }).collect(Collectors.toCollection(ArrayList::new));
+
+            final Bundle bundle = new Bundle();
+            bundle.putParcelable(COLUMBUS_LAUNCH_APP_SECURE_KEY, launcherActivityInfo.getComponentName());
+            bundle.putParcelableArrayList("columbus_app_shortcuts", arrayList);
+
+            makeRadioPreference(launcherActivityInfo.getComponentName().flattenToString(),
+                    launcherActivityInfo.getLabel(),
+                    launcherActivityInfo.getIcon(DisplayMetrics.DENSITY_DEVICE_STABLE),
+                    arrayList.isEmpty() ? null : new View.OnClickListener() {
+                        @Override
+                        public void onClick(View view) {
+                            lambda$updateAppList$2(bundle, view);
+                        }
+                    });
+        }
+    }
+
+    public static String lambda$updateAppList$0(LauncherActivityInfo launcherActivityInfo) {
+        return launcherActivityInfo.getLabel().toString();
+    }
+
+    public static boolean lambda$updateAppList$1(LauncherActivityInfo launcherActivityInfo, ShortcutInfo shortcutInfo) {
+        return shortcutInfo.getPackage().equals(launcherActivityInfo.getComponentName().getPackageName());
+    }
+
+    public void lambda$updateAppList$2(Bundle bundle, View view) {
+        new SubSettingLauncher(mContext).setDestination(ColumbusGestureLaunchAppShortcutSettingsFragment.class.getName()).setSourceMetricsCategory(1871).setExtras(bundle).launch();
+    }
+
+    private List queryForShortcuts() {
+        List<ShortcutInfo> list;
+        LauncherApps.ShortcutQuery shortcutQuery = new LauncherApps.ShortcutQuery();
+        shortcutQuery.setQueryFlags(9);
+        try {
+            list = mLauncherApps.getShortcuts(shortcutQuery, UserHandle.of(mCurrentUser));
+        } catch (IllegalStateException | SecurityException e) {
+            Log.e(TAG, "Failed to query for shortcuts", e);
+            list = null;
+        }
+        return list == null ? new ArrayList() : list;
+    }
+
+    private void makeRadioPreference(String str, CharSequence charSequence, Drawable drawable, View.OnClickListener onClickListener) {
+        ColumbusRadioButtonPreference columbusRadioButtonPreference = new ColumbusRadioButtonPreference(mPreferenceCategory.getContext());
+        columbusRadioButtonPreference.setKey(str);
+        columbusRadioButtonPreference.setTitle(charSequence);
+        columbusRadioButtonPreference.setIcon(drawable);
+        columbusRadioButtonPreference.setOnClickListener(this);
+        columbusRadioButtonPreference.setExtraWidgetOnClickListener(onClickListener);
+        mPreferenceCategory.addPreference(columbusRadioButtonPreference);
+    }
+}