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

Commit 910790e9 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add wrapper method from settings app's wrapper."

parents a6f1cf47 2ae7b1ff
Loading
Loading
Loading
Loading
+0 −131
Original line number Diff line number Diff line
/*
 * 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.settingslib.applications;

import android.content.ComponentName;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.graphics.drawable.Drawable;
import android.os.UserHandle;

import java.util.List;

/**
 * This interface replicates a subset of the android.content.pm.PackageManager (PM). The interface
 * exists so that we can use a thin wrapper around the PM in production code and a mock in tests.
 * We cannot directly mock or shadow the PM, because some of the methods we rely on are newer than
 * the API version supported by Robolectric.
 */
public interface PackageManagerWrapper {

    /**
     * Returns the real {@code PackageManager} object.
     */
    PackageManager getPackageManager();

    /**
     * Calls {@code PackageManager.getInstalledApplicationsAsUser()}.
     *
     * @see android.content.pm.PackageManager#getInstalledApplicationsAsUser
     */
    List<ApplicationInfo> getInstalledApplicationsAsUser(int flags, int userId);

    /**
     * Calls {@code PackageManager.hasSystemFeature()}.
     *
     * @see android.content.pm.PackageManager#hasSystemFeature
     */
    boolean hasSystemFeature(String name);

    /**
     * Calls {@code PackageManager.queryIntentActivitiesAsUser()}.
     *
     * @see android.content.pm.PackageManager#queryIntentActivitiesAsUser
     */
    List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent, int flags, int userId);

    /**
     * Calls {@code PackageManager.getInstallReason()}.
     *
     * @see android.content.pm.PackageManager#getInstallReason
     */
    int getInstallReason(String packageName, UserHandle user);

    /**
     * Calls {@code PackageManager.getApplicationInfoAsUser}
     */
    ApplicationInfo getApplicationInfoAsUser(String packageName, int i, int userId)
            throws PackageManager.NameNotFoundException;

    /**
     * Calls {@code PackageManager.setDefaultBrowserPackageNameAsUser}
     */
    boolean setDefaultBrowserPackageNameAsUser(String packageName, int userId);

    /**
     * Calls {@code PackageManager.getDefaultBrowserPackageNameAsUser}
     */
    String getDefaultBrowserPackageNameAsUser(int userId);

    /**
     * Calls {@code PackageManager.getHomeActivities}
     */
    ComponentName getHomeActivities(List<ResolveInfo> homeActivities);

    /**
     * Calls {@code PackageManager.queryIntentServicesAsUser}
     */
    List<ResolveInfo> queryIntentServicesAsUser(Intent intent, int i, int user);

    /**
     * Calls {@code PackageManager.replacePreferredActivity}
     */
    void replacePreferredActivity(IntentFilter homeFilter, int matchCategoryEmpty,
            ComponentName[] componentNames, ComponentName component);

    /**
     * Gets information about a particular package from the package manager.
     * @param packageName The name of the package we would like information about.
     * @param i additional options flags. see javadoc for {@link PackageManager#getPackageInfo(String, int)}
     * @return The PackageInfo for the requested package
     * @throws NameNotFoundException
     */
    PackageInfo getPackageInfo(String packageName, int i) throws NameNotFoundException;

    /**
     * Retrieves the icon associated with this particular set of ApplicationInfo
     * @param info The ApplicationInfo to retrieve the icon for
     * @return The icon as a drawable.
     */
    Drawable getUserBadgedIcon(ApplicationInfo info);

    /**
     * Retrieves the label associated with the particular set of ApplicationInfo
     * @param app The ApplicationInfo to retrieve the label for
     * @return the label as a CharSequence
     */
    CharSequence loadLabel(ApplicationInfo app);

    /**
     * Retrieve all activities that can be performed for the given intent.
     */
    List<ResolveInfo> queryIntentActivities(Intent intent, int flags);
}
+90 −18
Original line number Diff line number Diff line
@@ -13,18 +13,20 @@
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.android.settingslib.applications;
package com.android.settingslib.wrapper;

import android.content.ComponentName;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageDeleteObserver;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.graphics.drawable.Drawable;
import android.os.UserHandle;
import android.os.storage.VolumeInfo;

import java.util.List;

@@ -33,89 +35,159 @@ import java.util.List;
 * and the PackageManager. This class only provides access to the minimum number of functions from
 * the PackageManager needed for DeletionHelper to work.
 */
public class PackageManagerWrapperImpl implements PackageManagerWrapper {
public class PackageManagerWrapper {

    private final PackageManager mPm;

    public PackageManagerWrapperImpl(PackageManager pm) {
    public PackageManagerWrapper(PackageManager pm) {
        mPm = pm;
    }

    @Override
    /**
     * Returns the real {@code PackageManager} object.
     */
    public PackageManager getPackageManager() {
        return mPm;
    }

    @Override
    /**
     * Calls {@code PackageManager.getInstalledApplicationsAsUser()}.
     *
     * @see android.content.pm.PackageManager#getInstalledApplicationsAsUser
     */
    public List<ApplicationInfo> getInstalledApplicationsAsUser(int flags, int userId) {
        return mPm.getInstalledApplicationsAsUser(flags, userId);
    }

    @Override
    /**
     * Calls {@code PackageManager.hasSystemFeature()}.
     *
     * @see android.content.pm.PackageManager#hasSystemFeature
     */
    public boolean hasSystemFeature(String name) {
        return mPm.hasSystemFeature(name);
    }

    @Override
    /**
     * Calls {@code PackageManager.queryIntentActivitiesAsUser()}.
     *
     * @see android.content.pm.PackageManager#queryIntentActivitiesAsUser
     */
    public List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent, int flags, int userId) {
        return mPm.queryIntentActivitiesAsUser(intent, flags, userId);
    }

    @Override
    /**
     * Calls {@code PackageManager.getInstallReason()}.
     *
     * @see android.content.pm.PackageManager#getInstallReason
     */
    public int getInstallReason(String packageName, UserHandle user) {
        return mPm.getInstallReason(packageName, user);
    }

    @Override
    /**
     * Calls {@code PackageManager.getApplicationInfoAsUser}
     */
    public ApplicationInfo getApplicationInfoAsUser(String packageName, int i, int userId)
            throws PackageManager.NameNotFoundException {
        return mPm.getApplicationInfoAsUser(packageName, i, userId);
    }

    @Override
    /**
     * Calls {@code PackageManager.setDefaultBrowserPackageNameAsUser}
     */
    public boolean setDefaultBrowserPackageNameAsUser(String packageName, int userId) {
        return mPm.setDefaultBrowserPackageNameAsUser(packageName, userId);
    }

    @Override
    /**
     * Calls {@code PackageManager.getDefaultBrowserPackageNameAsUser}
     */
    public String getDefaultBrowserPackageNameAsUser(int userId) {
        return mPm.getDefaultBrowserPackageNameAsUser(userId);
    }

    @Override
    /**
     * Calls {@code PackageManager.getHomeActivities}
     */
    public ComponentName getHomeActivities(List<ResolveInfo> homeActivities) {
        return mPm.getHomeActivities(homeActivities);
    }

    @Override
    /**
     * Calls {@code PackageManager.queryIntentServicesAsUser}
     */
    public List<ResolveInfo> queryIntentServicesAsUser(Intent intent, int i, int user) {
        return mPm.queryIntentServicesAsUser(intent, i, user);
    }

    @Override
    /**
     * Calls {@code PackageManager.replacePreferredActivity}
     */
    public void replacePreferredActivity(IntentFilter homeFilter, int matchCategoryEmpty,
            ComponentName[] componentNames, ComponentName component) {
        mPm.replacePreferredActivity(homeFilter, matchCategoryEmpty, componentNames, component);
    }

    @Override
    /**
     * Gets information about a particular package from the package manager.
     * @param packageName The name of the package we would like information about.
     * @param i additional options flags. see javadoc for
     * {@link PackageManager#getPackageInfo(String, int)}
     * @return The PackageInfo for the requested package
     * @throws NameNotFoundException
     */
    public PackageInfo getPackageInfo(String packageName, int i) throws NameNotFoundException {
        return mPm.getPackageInfo(packageName, i);
    }

    @Override
    /**
     * Retrieves the icon associated with this particular set of ApplicationInfo
     * @param info The ApplicationInfo to retrieve the icon for
     * @return The icon as a drawable.
     */
    public Drawable getUserBadgedIcon(ApplicationInfo info) {
        return mPm.getUserBadgedIcon(mPm.loadUnbadgedItemIcon(info, info),
                new UserHandle(UserHandle.getUserId(info.uid)));
    }

    @Override
    /**
     * Retrieves the label associated with the particular set of ApplicationInfo
     * @param app The ApplicationInfo to retrieve the label for
     * @return the label as a CharSequence
     */
    public CharSequence loadLabel(ApplicationInfo app) {
        return app.loadLabel(mPm);
    }

    @Override
    /**
     * Retrieve all activities that can be performed for the given intent.
     */
    public List<ResolveInfo> queryIntentActivities(Intent intent, int flags) {
        return mPm.queryIntentActivities(intent, flags);
    }

    /**
     * Calls {@code PackageManager.getPrimaryStorageCurrentVolume}
     */
    public VolumeInfo getPrimaryStorageCurrentVolume() {
        return mPm.getPrimaryStorageCurrentVolume();
    }

    /**
     * Calls {@code PackageManager.deletePackageAsUser}
     */
    public void deletePackageAsUser(String packageName, IPackageDeleteObserver observer, int flags,
            int userId) {
        mPm.deletePackageAsUser(packageName, observer, flags, userId);
    }

    /**
     * Calls {@code PackageManager.getPackageUidAsUser}
     */
    public int getPackageUidAsUser(String pkg, int userId)
            throws PackageManager.NameNotFoundException {
        return mPm.getPackageUidAsUser(pkg, userId);
    }
}