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

Commit 2bf9417a authored by Pinyao Ting's avatar Pinyao Ting Committed by Automerger Merge Worker
Browse files

Merge "Allow settings app to request pin appwidgets from other apps." into...

Merge "Allow settings app to request pin appwidgets from other apps." into udc-qpr-dev am: 732bb20f

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/24933432



Change-Id: I0515f129d3f16167e6f83b0746bb30f494401faf
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents ddb0d9cc 732bb20f
Loading
Loading
Loading
Loading
+27 −5
Original line number Original line Diff line number Diff line
@@ -24,6 +24,7 @@ import static android.provider.DeviceConfig.NAMESPACE_SYSTEMUI;


import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;


import android.Manifest;
import android.annotation.NonNull;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.RequiresPermission;
@@ -1668,8 +1669,21 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
        synchronized (mLock) {
        synchronized (mLock) {
            ensureGroupStateLoadedLocked(userId);
            ensureGroupStateLoadedLocked(userId);


            final String pkg = componentName.getPackageName();
            final ProviderId id;
            if (!mPackageManagerInternal.isSameApp(pkg, callingUid, userId)) {
                // If the calling process is requesting to pin appwidgets from another process,
                // check if the calling process has the necessary permission.
                if (!injectHasAccessWidgetsPermission(Binder.getCallingPid(), callingUid)) {
                    return false;
                }
                id = new ProviderId(mPackageManagerInternal.getPackageUid(
                        pkg, 0 /* flags */, userId), componentName);
            } else {
                id = new ProviderId(callingUid, componentName);
            }
            // Look for the widget associated with the caller.
            // Look for the widget associated with the caller.
            Provider provider = lookupProviderLocked(new ProviderId(callingUid, componentName));
            Provider provider = lookupProviderLocked(id);
            if (provider == null || provider.zombie) {
            if (provider == null || provider.zombie) {
                return false;
                return false;
            }
            }
@@ -1683,6 +1697,14 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
                .requestPinAppWidget(callingPackage, info, extras, resultSender, userId);
                .requestPinAppWidget(callingPackage, info, extras, resultSender, userId);
    }
    }


    /**
     * Returns true if the caller has the proper permission to access app widgets.
     */
    private boolean injectHasAccessWidgetsPermission(int callingPid, int callingUid) {
        return mContext.checkPermission(Manifest.permission.CLEAR_APP_USER_DATA,
                callingPid, callingUid) == PackageManager.PERMISSION_GRANTED;
    }

    @Override
    @Override
    public ParceledListSlice<AppWidgetProviderInfo> getInstalledProvidersForProfile(int categoryFilter,
    public ParceledListSlice<AppWidgetProviderInfo> getInstalledProvidersForProfile(int categoryFilter,
            int profileId, String packageName) {
            int profileId, String packageName) {
@@ -4160,7 +4182,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
            return false;
            return false;
        }
        }


        @GuardedBy("mLock")
        @GuardedBy("AppWidgetServiceImpl.mLock")
        public AppWidgetProviderInfo getInfoLocked(Context context) {
        public AppWidgetProviderInfo getInfoLocked(Context context) {
            if (!mInfoParsed) {
            if (!mInfoParsed) {
                // parse
                // parse
@@ -4188,18 +4210,18 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
         * be completely parsed and only contain placeHolder information like
         * be completely parsed and only contain placeHolder information like
         * {@link AppWidgetProviderInfo#providerInfo}
         * {@link AppWidgetProviderInfo#providerInfo}
         */
         */
        @GuardedBy("mLock")
        @GuardedBy("AppWidgetServiceImpl.mLock")
        public AppWidgetProviderInfo getPartialInfoLocked() {
        public AppWidgetProviderInfo getPartialInfoLocked() {
            return info;
            return info;
        }
        }


        @GuardedBy("mLock")
        @GuardedBy("AppWidgetServiceImpl.mLock")
        public void setPartialInfoLocked(AppWidgetProviderInfo info) {
        public void setPartialInfoLocked(AppWidgetProviderInfo info) {
            this.info = info;
            this.info = info;
            mInfoParsed = false;
            mInfoParsed = false;
        }
        }


        @GuardedBy("mLock")
        @GuardedBy("AppWidgetServiceImpl.mLock")
        public void setInfoLocked(AppWidgetProviderInfo info) {
        public void setInfoLocked(AppWidgetProviderInfo info) {
            this.info = info;
            this.info = info;
            mInfoParsed = true;
            mInfoParsed = true;