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

Commit 706dc430 authored by Jean-Michel Trivi's avatar Jean-Michel Trivi Committed by Android (Google) Code Review
Browse files

Merge "Audio hardening: audio focus requires control capability" into main

parents 7b237a48 db3573a8
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -594,6 +594,7 @@ package android.app {
    field public static final int FOREGROUND_SERVICE_API_TYPE_MICROPHONE = 6; // 0x6
    field public static final int FOREGROUND_SERVICE_API_TYPE_PHONE_CALL = 7; // 0x7
    field public static final int FOREGROUND_SERVICE_API_TYPE_USB = 8; // 0x8
    field @FlaggedApi("android.media.audio.foreground_audio_control") public static final int PROCESS_CAPABILITY_FOREGROUND_AUDIO_CONTROL = 64; // 0x40
    field public static final int PROCESS_CAPABILITY_FOREGROUND_CAMERA = 2; // 0x2
    field public static final int PROCESS_CAPABILITY_FOREGROUND_LOCATION = 1; // 0x1
    field public static final int PROCESS_CAPABILITY_FOREGROUND_MICROPHONE = 4; // 0x4
+14 −1
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import static android.app.WindowConfiguration.activityTypeToString;
import static android.app.WindowConfiguration.windowingModeToString;
import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE;
import static android.media.audio.Flags.FLAG_FOREGROUND_AUDIO_CONTROL;

import android.Manifest;
import android.annotation.ColorInt;
@@ -794,6 +795,7 @@ public class ActivityManager {
            PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK,
            PROCESS_CAPABILITY_BFSL,
            PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK,
            PROCESS_CAPABILITY_FOREGROUND_AUDIO_CONTROL,
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface ProcessCapability {}
@@ -942,6 +944,14 @@ public class ActivityManager {
    @TestApi
    public static final int PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK = 1 << 5;

    /**
     * @hide
     * Process can access volume APIs and can request audio focus with GAIN.
     */
    @FlaggedApi(FLAG_FOREGROUND_AUDIO_CONTROL)
    @SystemApi
    public static final int PROCESS_CAPABILITY_FOREGROUND_AUDIO_CONTROL = 1 << 6;

    /**
     * @hide all capabilities, the ORing of all flags in {@link ProcessCapability}.
     *
@@ -953,7 +963,8 @@ public class ActivityManager {
            | PROCESS_CAPABILITY_FOREGROUND_MICROPHONE
            | PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK
            | PROCESS_CAPABILITY_BFSL
            | PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK;
            | PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK
            | PROCESS_CAPABILITY_FOREGROUND_AUDIO_CONTROL;

    /**
     * All implicit capabilities. There are capabilities that process automatically have.
@@ -975,6 +986,7 @@ public class ActivityManager {
        pw.print((caps & PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK) != 0 ? 'N' : '-');
        pw.print((caps & PROCESS_CAPABILITY_BFSL) != 0 ? 'F' : '-');
        pw.print((caps & PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK) != 0 ? 'U' : '-');
        pw.print((caps & PROCESS_CAPABILITY_FOREGROUND_AUDIO_CONTROL) != 0 ? 'A' : '-');
    }

    /** @hide */
@@ -986,6 +998,7 @@ public class ActivityManager {
        sb.append((caps & PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK) != 0 ? 'N' : '-');
        sb.append((caps & PROCESS_CAPABILITY_BFSL) != 0 ? 'F' : '-');
        sb.append((caps & PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK) != 0 ? 'U' : '-');
        sb.append((caps & PROCESS_CAPABILITY_FOREGROUND_AUDIO_CONTROL) != 0 ? 'A' : '-');
    }

    /**
+6 −0
Original line number Diff line number Diff line
@@ -16,7 +16,9 @@

package android.app;


import static android.location.flags.Flags.FLAG_LOCATION_BYPASS;
import static android.media.audio.Flags.foregroundAudioControl;
import static android.permission.flags.Flags.FLAG_OP_ENABLE_MOBILE_DATA_BY_USER;
import static android.view.contentprotection.flags.Flags.FLAG_CREATE_ACCESSIBILITY_OVERLAY_APP_OP_ENABLED;
import static android.view.contentprotection.flags.Flags.FLAG_RAPID_CLEAR_NOTIFICATIONS_BY_LISTENER_APP_OP_ENABLED;
@@ -3229,6 +3231,10 @@ public class AppOpsManager {
     * @hide
     */
    public static @Mode int opToDefaultMode(int op) {
        if (op == OP_TAKE_AUDIO_FOCUS && foregroundAudioControl()) {
            // when removing the flag, change the entry in sAppOpInfos for OP_TAKE_AUDIO_FOCUS
            return AppOpsManager.MODE_FOREGROUND;
        }
        return sAppOpInfos[op].defaultMode;
    }

+13 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.server.am;
import static android.app.ActivityManager.PROCESS_CAPABILITY_ALL;
import static android.app.ActivityManager.PROCESS_CAPABILITY_ALL_IMPLICIT;
import static android.app.ActivityManager.PROCESS_CAPABILITY_BFSL;
import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_AUDIO_CONTROL;
import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_CAMERA;
import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_LOCATION;
import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_MICROPHONE;
@@ -67,7 +68,10 @@ import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_UNBIND_SERVICE;
import static android.content.Context.BIND_TREAT_LIKE_VISIBLE_FOREGROUND_SERVICE;
import static android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_CAMERA;
import static android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION;
import static android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK;
import static android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_MICROPHONE;
import static android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_PHONE_CALL;
import static android.media.audio.Flags.foregroundAudioControl;
import static android.os.Process.SCHED_OTHER;
import static android.os.Process.THREAD_GROUP_BACKGROUND;
import static android.os.Process.THREAD_GROUP_DEFAULT;
@@ -2266,6 +2270,15 @@ public class OomAdjuster {
                            (fgsType & FOREGROUND_SERVICE_TYPE_LOCATION)
                                    != 0 ? PROCESS_CAPABILITY_FOREGROUND_LOCATION : 0;

                    if (foregroundAudioControl()) { // flag check
                        final int fgsAudioType = FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK
                                | FOREGROUND_SERVICE_TYPE_CAMERA
                                | FOREGROUND_SERVICE_TYPE_MICROPHONE
                                | FOREGROUND_SERVICE_TYPE_PHONE_CALL;
                        capabilityFromFGS |= (psr.getForegroundServiceTypes() & fgsAudioType) != 0
                                ? PROCESS_CAPABILITY_FOREGROUND_AUDIO_CONTROL : 0;
                    }

                    final boolean enabled = state.getCachedCompatChange(
                            CACHED_COMPAT_CHANGE_CAMERA_MICROPHONE_CAPABILITY);
                    if (enabled) {
+3 −3
Original line number Diff line number Diff line
@@ -205,10 +205,10 @@ final class ProcessServiceRecord {
    }

    /**
     * Returns the FGS typps, but it doesn't tell if the types include "NONE" or not, so
     * do not use it outside of this class.
     * Returns the FGS types, but it doesn't tell if the types include "NONE" or not, use
     * {@link #hasForegroundServices()}
     */
    private int getForegroundServiceTypes() {
    int getForegroundServiceTypes() {
        return mHasForegroundServices ? mFgServiceTypes : 0;
    }

Loading