Loading src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProvider.java +4 −1 Original line number Diff line number Diff line Loading @@ -16,8 +16,11 @@ package com.android.settings.homepage.contextualcards; import java.util.List; import androidx.slice.Slice; /** Feature provider for the contextual card feature. */ public interface ContextualCardFeatureProvider { /** Log package when user clicks contextual notification channel card. */ void logNotificationPackage(Slice slice); } src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImpl.java +38 −0 Original line number Diff line number Diff line Loading @@ -16,7 +16,22 @@ package com.android.settings.homepage.contextualcards; import static android.content.Context.MODE_PRIVATE; import android.content.Context; import android.content.SharedPreferences; import android.util.ArraySet; import androidx.slice.Slice; import androidx.slice.SliceMetadata; import androidx.slice.core.SliceAction; import com.android.settings.SettingsActivity; import com.android.settings.applications.AppInfoBase; import com.android.settings.homepage.contextualcards.slices.ContextualNotificationChannelSlice; import com.android.settings.slices.CustomSliceRegistry; import java.util.Set; public class ContextualCardFeatureProviderImpl implements ContextualCardFeatureProvider { private final Context mContext; Loading @@ -24,4 +39,27 @@ public class ContextualCardFeatureProviderImpl implements ContextualCardFeatureP public ContextualCardFeatureProviderImpl(Context context) { mContext = context; } @Override public void logNotificationPackage(Slice slice) { if (slice == null || !slice.getUri().equals( CustomSliceRegistry.CONTEXTUAL_NOTIFICATION_CHANNEL_SLICE_URI)) { return; } final SliceAction primaryAction = SliceMetadata.from(mContext, slice).getPrimaryAction(); final String currentPackage = primaryAction.getAction().getIntent() .getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS) .getString(AppInfoBase.ARG_PACKAGE_NAME); final SharedPreferences prefs = mContext.getSharedPreferences( ContextualNotificationChannelSlice.PREFS, MODE_PRIVATE); final Set<String> interactedPackages = prefs.getStringSet( ContextualNotificationChannelSlice.PREF_KEY_INTERACTED_PACKAGES, new ArraySet<>()); final Set<String> newInteractedPackages = new ArraySet<>(interactedPackages); newInteractedPackages.add(currentPackage); prefs.edit().putStringSet(ContextualNotificationChannelSlice.PREF_KEY_INTERACTED_PACKAGES, newInteractedPackages).apply(); } } src/com/android/settings/homepage/contextualcards/slices/ContextualNotificationChannelSlice.java +23 −0 Original line number Diff line number Diff line Loading @@ -16,14 +16,23 @@ package com.android.settings.homepage.contextualcards.slices; import static android.content.Context.MODE_PRIVATE; import android.content.Context; import android.net.Uri; import android.util.ArraySet; import com.android.settings.R; import com.android.settings.slices.CustomSliceRegistry; import com.android.settings.slices.SliceBackgroundWorker; import java.util.Set; public class ContextualNotificationChannelSlice extends NotificationChannelSlice { public static final String PREFS = "notification_channel_slice_prefs"; public static final String PREF_KEY_INTERACTED_PACKAGES = "interacted_packages"; public ContextualNotificationChannelSlice(Context context) { super(context); } Loading @@ -37,4 +46,18 @@ public class ContextualNotificationChannelSlice extends NotificationChannelSlice protected CharSequence getSubTitle(String packageName, int uid) { return mContext.getText(R.string.recently_installed_app); } @Override protected boolean isUserInteracted(String packageName) { // Check the package has been interacted on current slice or not. final Set<String> interactedPackages = mContext.getSharedPreferences(PREFS, MODE_PRIVATE) .getStringSet(PREF_KEY_INTERACTED_PACKAGES, new ArraySet<>()); return interactedPackages.contains(packageName); } @Override public Class<? extends SliceBackgroundWorker> getBackgroundWorkerClass() { return NotificationChannelWorker.class; } } src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSlice.java +14 −2 Original line number Diff line number Diff line Loading @@ -218,6 +218,17 @@ public class NotificationChannelSlice implements CustomSliceable { .toIntent(); } /** * Check the package has been interacted by user or not. * Will use to filter package in {@link #getRecentlyInstalledPackages()}. * * @param packageName The app package name. * @return true if the package was interacted, false otherwise. */ protected boolean isUserInteracted(String packageName) { return false; } @VisibleForTesting IconCompat getApplicationIcon(String packageName) { final Drawable drawable; Loading Loading @@ -328,8 +339,9 @@ public class NotificationChannelSlice implements CustomSliceable { final List<PackageInfo> installedPackages = mContext.getPackageManager().getInstalledPackages(0); for (PackageInfo packageInfo : installedPackages) { // Not include system app. if (packageInfo.applicationInfo.isSystemApp()) { // Not include system app and interacted app. if (packageInfo.applicationInfo.isSystemApp() || isUserInteracted(packageInfo.packageName)) { continue; } Loading src/com/android/settings/homepage/contextualcards/slices/NotificationChannelWorker.java 0 → 100644 +77 −0 Original line number Diff line number Diff line /* * Copyright (C) 2019 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.settings.homepage.contextualcards.slices; import static android.content.Context.MODE_PRIVATE; import static com.android.settings.homepage.contextualcards.slices.ContextualNotificationChannelSlice.PREFS; import static com.android.settings.homepage.contextualcards.slices.ContextualNotificationChannelSlice.PREF_KEY_INTERACTED_PACKAGES; import android.content.Context; import android.content.SharedPreferences; import android.content.pm.PackageInfo; import android.net.Uri; import android.util.ArraySet; import com.android.settings.slices.SliceBackgroundWorker; import java.io.IOException; import java.util.List; import java.util.Set; import java.util.stream.Collectors; public class NotificationChannelWorker extends SliceBackgroundWorker<Void> { public NotificationChannelWorker(Context context, Uri uri) { super(context, uri); } @Override protected void onSlicePinned() { } @Override protected void onSliceUnpinned() { removeUninstalledPackages(); } @Override public void close() throws IOException { } private void removeUninstalledPackages() { final SharedPreferences prefs = getContext().getSharedPreferences(PREFS, MODE_PRIVATE); final Set<String> interactedPackages = prefs.getStringSet(PREF_KEY_INTERACTED_PACKAGES, new ArraySet()); if (interactedPackages.isEmpty()) { return; } final List<PackageInfo> installedPackageInfos = getContext().getPackageManager().getInstalledPackages(0); final List<String> installedPackages = installedPackageInfos.stream() .map(packageInfo -> packageInfo.packageName) .collect(Collectors.toList()); final Set<String> newInteractedPackages = new ArraySet<>(); for (String packageName : interactedPackages) { if (installedPackages.contains(packageName)) { newInteractedPackages.add(packageName); } } prefs.edit().putStringSet(PREF_KEY_INTERACTED_PACKAGES, newInteractedPackages).apply(); } } Loading
src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProvider.java +4 −1 Original line number Diff line number Diff line Loading @@ -16,8 +16,11 @@ package com.android.settings.homepage.contextualcards; import java.util.List; import androidx.slice.Slice; /** Feature provider for the contextual card feature. */ public interface ContextualCardFeatureProvider { /** Log package when user clicks contextual notification channel card. */ void logNotificationPackage(Slice slice); }
src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImpl.java +38 −0 Original line number Diff line number Diff line Loading @@ -16,7 +16,22 @@ package com.android.settings.homepage.contextualcards; import static android.content.Context.MODE_PRIVATE; import android.content.Context; import android.content.SharedPreferences; import android.util.ArraySet; import androidx.slice.Slice; import androidx.slice.SliceMetadata; import androidx.slice.core.SliceAction; import com.android.settings.SettingsActivity; import com.android.settings.applications.AppInfoBase; import com.android.settings.homepage.contextualcards.slices.ContextualNotificationChannelSlice; import com.android.settings.slices.CustomSliceRegistry; import java.util.Set; public class ContextualCardFeatureProviderImpl implements ContextualCardFeatureProvider { private final Context mContext; Loading @@ -24,4 +39,27 @@ public class ContextualCardFeatureProviderImpl implements ContextualCardFeatureP public ContextualCardFeatureProviderImpl(Context context) { mContext = context; } @Override public void logNotificationPackage(Slice slice) { if (slice == null || !slice.getUri().equals( CustomSliceRegistry.CONTEXTUAL_NOTIFICATION_CHANNEL_SLICE_URI)) { return; } final SliceAction primaryAction = SliceMetadata.from(mContext, slice).getPrimaryAction(); final String currentPackage = primaryAction.getAction().getIntent() .getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS) .getString(AppInfoBase.ARG_PACKAGE_NAME); final SharedPreferences prefs = mContext.getSharedPreferences( ContextualNotificationChannelSlice.PREFS, MODE_PRIVATE); final Set<String> interactedPackages = prefs.getStringSet( ContextualNotificationChannelSlice.PREF_KEY_INTERACTED_PACKAGES, new ArraySet<>()); final Set<String> newInteractedPackages = new ArraySet<>(interactedPackages); newInteractedPackages.add(currentPackage); prefs.edit().putStringSet(ContextualNotificationChannelSlice.PREF_KEY_INTERACTED_PACKAGES, newInteractedPackages).apply(); } }
src/com/android/settings/homepage/contextualcards/slices/ContextualNotificationChannelSlice.java +23 −0 Original line number Diff line number Diff line Loading @@ -16,14 +16,23 @@ package com.android.settings.homepage.contextualcards.slices; import static android.content.Context.MODE_PRIVATE; import android.content.Context; import android.net.Uri; import android.util.ArraySet; import com.android.settings.R; import com.android.settings.slices.CustomSliceRegistry; import com.android.settings.slices.SliceBackgroundWorker; import java.util.Set; public class ContextualNotificationChannelSlice extends NotificationChannelSlice { public static final String PREFS = "notification_channel_slice_prefs"; public static final String PREF_KEY_INTERACTED_PACKAGES = "interacted_packages"; public ContextualNotificationChannelSlice(Context context) { super(context); } Loading @@ -37,4 +46,18 @@ public class ContextualNotificationChannelSlice extends NotificationChannelSlice protected CharSequence getSubTitle(String packageName, int uid) { return mContext.getText(R.string.recently_installed_app); } @Override protected boolean isUserInteracted(String packageName) { // Check the package has been interacted on current slice or not. final Set<String> interactedPackages = mContext.getSharedPreferences(PREFS, MODE_PRIVATE) .getStringSet(PREF_KEY_INTERACTED_PACKAGES, new ArraySet<>()); return interactedPackages.contains(packageName); } @Override public Class<? extends SliceBackgroundWorker> getBackgroundWorkerClass() { return NotificationChannelWorker.class; } }
src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSlice.java +14 −2 Original line number Diff line number Diff line Loading @@ -218,6 +218,17 @@ public class NotificationChannelSlice implements CustomSliceable { .toIntent(); } /** * Check the package has been interacted by user or not. * Will use to filter package in {@link #getRecentlyInstalledPackages()}. * * @param packageName The app package name. * @return true if the package was interacted, false otherwise. */ protected boolean isUserInteracted(String packageName) { return false; } @VisibleForTesting IconCompat getApplicationIcon(String packageName) { final Drawable drawable; Loading Loading @@ -328,8 +339,9 @@ public class NotificationChannelSlice implements CustomSliceable { final List<PackageInfo> installedPackages = mContext.getPackageManager().getInstalledPackages(0); for (PackageInfo packageInfo : installedPackages) { // Not include system app. if (packageInfo.applicationInfo.isSystemApp()) { // Not include system app and interacted app. if (packageInfo.applicationInfo.isSystemApp() || isUserInteracted(packageInfo.packageName)) { continue; } Loading
src/com/android/settings/homepage/contextualcards/slices/NotificationChannelWorker.java 0 → 100644 +77 −0 Original line number Diff line number Diff line /* * Copyright (C) 2019 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.settings.homepage.contextualcards.slices; import static android.content.Context.MODE_PRIVATE; import static com.android.settings.homepage.contextualcards.slices.ContextualNotificationChannelSlice.PREFS; import static com.android.settings.homepage.contextualcards.slices.ContextualNotificationChannelSlice.PREF_KEY_INTERACTED_PACKAGES; import android.content.Context; import android.content.SharedPreferences; import android.content.pm.PackageInfo; import android.net.Uri; import android.util.ArraySet; import com.android.settings.slices.SliceBackgroundWorker; import java.io.IOException; import java.util.List; import java.util.Set; import java.util.stream.Collectors; public class NotificationChannelWorker extends SliceBackgroundWorker<Void> { public NotificationChannelWorker(Context context, Uri uri) { super(context, uri); } @Override protected void onSlicePinned() { } @Override protected void onSliceUnpinned() { removeUninstalledPackages(); } @Override public void close() throws IOException { } private void removeUninstalledPackages() { final SharedPreferences prefs = getContext().getSharedPreferences(PREFS, MODE_PRIVATE); final Set<String> interactedPackages = prefs.getStringSet(PREF_KEY_INTERACTED_PACKAGES, new ArraySet()); if (interactedPackages.isEmpty()) { return; } final List<PackageInfo> installedPackageInfos = getContext().getPackageManager().getInstalledPackages(0); final List<String> installedPackages = installedPackageInfos.stream() .map(packageInfo -> packageInfo.packageName) .collect(Collectors.toList()); final Set<String> newInteractedPackages = new ArraySet<>(); for (String packageName : interactedPackages) { if (installedPackages.contains(packageName)) { newInteractedPackages.add(packageName); } } prefs.edit().putStringSet(PREF_KEY_INTERACTED_PACKAGES, newInteractedPackages).apply(); } }