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

Commit 69027e0b authored by Jing Ji's avatar Jing Ji Committed by Android (Google) Code Review
Browse files

Merge changes If2245681,I943a6df6

* changes:
  Introduce the ForegroundServiceTypeNotAllowedException
  Add internal APIs to check if a given app has USB permission or not
parents 90dee420 91662e3f
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -5278,6 +5278,13 @@ package android.app {
    field @NonNull public static final android.os.Parcelable.Creator<android.app.ForegroundServiceStartNotAllowedException> CREATOR;
  }
  public final class ForegroundServiceTypeNotAllowedException extends android.app.ServiceStartNotAllowedException implements android.os.Parcelable {
    ctor public ForegroundServiceTypeNotAllowedException(@NonNull String);
    method public int describeContents();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.app.ForegroundServiceTypeNotAllowedException> CREATOR;
  }
  @Deprecated public class Fragment implements android.content.ComponentCallbacks2 android.view.View.OnCreateContextMenuListener {
    ctor @Deprecated public Fragment();
    method @Deprecated public void dump(String, java.io.FileDescriptor, java.io.PrintWriter, String[]);
+61 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 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 android.app;

import android.annotation.NonNull;
import android.os.Parcel;
import android.os.Parcelable;

/**
 * Exception thrown when an app tries to start a foreground {@link Service} without a valid type.
 */
public final class ForegroundServiceTypeNotAllowedException
        extends ServiceStartNotAllowedException implements Parcelable {
    /**
     * Constructor.
     */
    public ForegroundServiceTypeNotAllowedException(@NonNull String message) {
        super(message);
    }

    ForegroundServiceTypeNotAllowedException(@NonNull Parcel source) {
        super(source.readString());
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        dest.writeString(getMessage());
    }

    public static final @NonNull Creator<android.app.ForegroundServiceTypeNotAllowedException>
            CREATOR = new Creator<android.app.ForegroundServiceTypeNotAllowedException>() {
                @NonNull
                public android.app.ForegroundServiceTypeNotAllowedException createFromParcel(
                        Parcel source) {
                    return new android.app.ForegroundServiceTypeNotAllowedException(source);
                }

                @NonNull
                public android.app.ForegroundServiceTypeNotAllowedException[] newArray(int size) {
                    return new android.app.ForegroundServiceTypeNotAllowedException[size];
                }
            };
}
+11 −0
Original line number Diff line number Diff line
@@ -79,9 +79,20 @@ interface IUsbManager
    /* Returns true if the caller has permission to access the device. */
    boolean hasDevicePermission(in UsbDevice device, String packageName);

    /* Returns true if the given package/pid/uid has permission to access the device. */
    @JavaPassthrough(annotation=
            "@android.annotation.RequiresPermission(android.Manifest.permission.MANAGE_USB)")
    boolean hasDevicePermissionWithIdentity(in UsbDevice device, String packageName,
            int pid, int uid);

    /* Returns true if the caller has permission to access the accessory. */
    boolean hasAccessoryPermission(in UsbAccessory accessory);

    /* Returns true if the given pid/uid has permission to access the accessory. */
    @JavaPassthrough(annotation=
            "@android.annotation.RequiresPermission(android.Manifest.permission.MANAGE_USB)")
    boolean hasAccessoryPermissionWithIdentity(in UsbAccessory accessory, int pid, int uid);

    /* Requests permission for the given package to access the device.
     * Will display a system dialog to query the user if permission
     * had not already been given.
+43 −0
Original line number Diff line number Diff line
@@ -837,6 +837,28 @@ public class UsbManager {
        }
    }

    /**
     * Returns true if the caller has permission to access the device. It's similar to the
     * {@link #hasPermission(UsbDevice)} but allows to specify a different package/uid/pid.
     *
     * <p>Not for third-party apps.</p>
     *
     * @hide
     */
    @RequiresPermission(Manifest.permission.MANAGE_USB)
    @RequiresFeature(PackageManager.FEATURE_USB_HOST)
    public boolean hasPermission(@NonNull UsbDevice device, @NonNull String packageName,
            int pid, int uid) {
        if (mService == null) {
            return false;
        }
        try {
            return mService.hasDevicePermissionWithIdentity(device, packageName, pid, uid);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * Returns true if the caller has permission to access the accessory.
     * Permission might have been granted temporarily via
@@ -858,6 +880,27 @@ public class UsbManager {
        }
    }

    /**
     * Returns true if the caller has permission to access the accessory. It's similar to the
     * {@link #hasPermission(UsbAccessory)} but allows to specify a different uid/pid.
     *
     * <p>Not for third-party apps.</p>
     *
     * @hide
     */
    @RequiresPermission(Manifest.permission.MANAGE_USB)
    @RequiresFeature(PackageManager.FEATURE_USB_ACCESSORY)
    public boolean hasPermission(@NonNull UsbAccessory accessory, int pid, int uid) {
        if (mService == null) {
            return false;
        }
        try {
            return mService.hasAccessoryPermissionWithIdentity(accessory, pid, uid);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

   /**
     * Requests temporary permission for the given package to access the device.
     * This may result in a system dialog being displayed to the user
+17 −0
Original line number Diff line number Diff line
@@ -503,6 +503,15 @@ public class UsbService extends IUsbManager.Stub {
        }
    }

    @Override
    public boolean hasDevicePermissionWithIdentity(UsbDevice device, String packageName,
            int pid, int uid) {
        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null);

        final int userId = UserHandle.getUserId(uid);
        return getPermissionsForUser(userId).hasPermission(device, packageName, pid, uid);
    }

    @Override
    public boolean hasAccessoryPermission(UsbAccessory accessory) {
        final int uid = Binder.getCallingUid();
@@ -517,6 +526,14 @@ public class UsbService extends IUsbManager.Stub {
        }
    }

    @Override
    public boolean hasAccessoryPermissionWithIdentity(UsbAccessory accessory, int pid, int uid) {
        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null);

        final int userId = UserHandle.getUserId(uid);
        return getPermissionsForUser(userId).hasPermission(accessory, pid, uid);
    }

    @Override
    public void requestDevicePermission(UsbDevice device, String packageName, PendingIntent pi) {
        final int uid = Binder.getCallingUid();