Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4ce0bf73 authored by Fan Zhang's avatar Fan Zhang Committed by Android (Google) Code Review
Browse files

Merge changes from topic "Hide notification channel slice" into qt-dev

* changes:
  Log interacted package from ContextualNotificationChannelSlice
  Hide notification channel slice that is interacted
parents ac4e5dfa b29e53a4
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -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);
}
+38 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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();
    }
}
+23 −0
Original line number Diff line number Diff line
@@ -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);
    }
@@ -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;
    }
}
+14 −2
Original line number Diff line number Diff line
@@ -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;
@@ -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;
            }

+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