diff options
12 files changed, 107 insertions, 2 deletions
diff --git a/core/api/current.txt b/core/api/current.txt index 828d4b9c8b01..08d0ead95d1e 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -177,6 +177,7 @@ package android { field public static final String REQUEST_COMPANION_PROFILE_AUTOMOTIVE_PROJECTION = "android.permission.REQUEST_COMPANION_PROFILE_AUTOMOTIVE_PROJECTION"; field public static final String REQUEST_COMPANION_PROFILE_COMPUTER = "android.permission.REQUEST_COMPANION_PROFILE_COMPUTER"; field public static final String REQUEST_COMPANION_PROFILE_GLASSES = "android.permission.REQUEST_COMPANION_PROFILE_GLASSES"; + field public static final String REQUEST_COMPANION_PROFILE_NEARBY_DEVICE_STREAMING = "android.permission.REQUEST_COMPANION_PROFILE_NEARBY_DEVICE_STREAMING"; field public static final String REQUEST_COMPANION_PROFILE_WATCH = "android.permission.REQUEST_COMPANION_PROFILE_WATCH"; field public static final String REQUEST_COMPANION_RUN_IN_BACKGROUND = "android.permission.REQUEST_COMPANION_RUN_IN_BACKGROUND"; field public static final String REQUEST_COMPANION_SELF_MANAGED = "android.permission.REQUEST_COMPANION_SELF_MANAGED"; @@ -9054,6 +9055,7 @@ package android.companion { field @RequiresPermission(android.Manifest.permission.REQUEST_COMPANION_PROFILE_AUTOMOTIVE_PROJECTION) public static final String DEVICE_PROFILE_AUTOMOTIVE_PROJECTION = "android.app.role.SYSTEM_AUTOMOTIVE_PROJECTION"; field @RequiresPermission(android.Manifest.permission.REQUEST_COMPANION_PROFILE_COMPUTER) public static final String DEVICE_PROFILE_COMPUTER = "android.app.role.COMPANION_DEVICE_COMPUTER"; field @RequiresPermission(android.Manifest.permission.REQUEST_COMPANION_PROFILE_GLASSES) public static final String DEVICE_PROFILE_GLASSES = "android.app.role.COMPANION_DEVICE_GLASSES"; + field @RequiresPermission(android.Manifest.permission.REQUEST_COMPANION_PROFILE_NEARBY_DEVICE_STREAMING) public static final String DEVICE_PROFILE_NEARBY_DEVICE_STREAMING = "android.app.role.COMPANION_DEVICE_NEARBY_DEVICE_STREAMING"; field public static final String DEVICE_PROFILE_WATCH = "android.app.role.COMPANION_DEVICE_WATCH"; } diff --git a/core/java/android/companion/AssociationRequest.java b/core/java/android/companion/AssociationRequest.java index 57517f1781bb..2e969f83f836 100644 --- a/core/java/android/companion/AssociationRequest.java +++ b/core/java/android/companion/AssociationRequest.java @@ -102,6 +102,20 @@ public final class AssociationRequest implements Parcelable { "android.app.role.COMPANION_DEVICE_APP_STREAMING"; /** + * Device profile: a virtual device capable of rendering content from an Android host to a + * nearby device. + * + * Only applications that have been granted + * {@link android.Manifest.permission#REQUEST_COMPANION_PROFILE_NEARBY_DEVICE_STREAMING} + * are allowed to request to be associated with such devices. + * + * @see AssociationRequest.Builder#setDeviceProfile + */ + @RequiresPermission(Manifest.permission.REQUEST_COMPANION_PROFILE_NEARBY_DEVICE_STREAMING) + public static final String DEVICE_PROFILE_NEARBY_DEVICE_STREAMING = + "android.app.role.COMPANION_DEVICE_NEARBY_DEVICE_STREAMING"; + + /** * Device profile: Android Automotive Projection * * Only applications that have been granted @@ -132,7 +146,7 @@ public final class AssociationRequest implements Parcelable { @Retention(RetentionPolicy.SOURCE) @StringDef(value = { DEVICE_PROFILE_WATCH, DEVICE_PROFILE_COMPUTER, DEVICE_PROFILE_AUTOMOTIVE_PROJECTION, DEVICE_PROFILE_APP_STREAMING, - DEVICE_PROFILE_GLASSES }) + DEVICE_PROFILE_GLASSES, DEVICE_PROFILE_NEARBY_DEVICE_STREAMING }) public @interface DeviceProfile {} /** diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 5b634d9c50e3..9c782f1d091d 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -3366,6 +3366,14 @@ <permission android:name="android.permission.REQUEST_COMPANION_PROFILE_APP_STREAMING" android:protectionLevel="signature|privileged" /> + <!-- Allows application to request to stream content from an Android host to a nearby device + ({@link android.companion.AssociationRequest#DEVICE_PROFILE_NEARBY_DEVICE_STREAMING}) + by {@link android.companion.CompanionDeviceManager}. + <p>Not for use by third-party applications. + --> + <permission android:name="android.permission.REQUEST_COMPANION_PROFILE_NEARBY_DEVICE_STREAMING" + android:protectionLevel="signature|privileged" /> + <!-- Allows application to request to be associated with a vehicle head unit capable of automotive projection ({@link android.companion.AssociationRequest#DEVICE_PROFILE_AUTOMOTIVE_PROJECTION}) diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml index 3e2b71f18b75..54b2b9a8d839 100644 --- a/data/etc/privapp-permissions-platform.xml +++ b/data/etc/privapp-permissions-platform.xml @@ -386,6 +386,7 @@ applications that come with the platform <permission name="android.permission.MANAGE_COMPANION_DEVICES" /> <permission name="android.permission.REQUEST_COMPANION_PROFILE_APP_STREAMING" /> <permission name="android.permission.REQUEST_COMPANION_PROFILE_WATCH" /> + <permission name="android.permission.REQUEST_COMPANION_PROFILE_NEARBY_DEVICE_STREAMING" /> <permission name="android.permission.REQUEST_COMPANION_PROFILE_COMPUTER" /> <permission name="android.permission.REQUEST_COMPANION_SELF_MANAGED" /> <!-- Permission required for testing registering pull atom callbacks. --> diff --git a/packages/CompanionDeviceManager/res/drawable/ic_permission_nearby_device_streaming.xml b/packages/CompanionDeviceManager/res/drawable/ic_permission_nearby_device_streaming.xml new file mode 100644 index 000000000000..7295e78b16cb --- /dev/null +++ b/packages/CompanionDeviceManager/res/drawable/ic_permission_nearby_device_streaming.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ 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. + --> + +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24" + android:tint="@android:color/system_accent1_600"> + <path + android:pathData="M6.2529,18.5H16.2529V17.5H18.2529V21.5C18.2529,22.6 17.3529,23.5 16.2529,23.5H6.2529C5.1529,23.5 4.2529,22.6 4.2529,21.5V3.5C4.2529,2.4 5.1529,1.51 6.2529,1.51L16.2529,1.5C17.3529,1.5 18.2529,2.4 18.2529,3.5V7.5H16.2529V6.5H6.2529V18.5ZM16.2529,3.5H6.2529V4.5H16.2529V3.5ZM6.2529,21.5V20.5H16.2529V21.5H6.2529ZM12.6553,9.4049C12.6553,8.8526 13.103,8.4049 13.6553,8.4049H20.5254C21.0776,8.4049 21.5254,8.8526 21.5254,9.4049V14.6055C21.5254,15.1578 21.0776,15.6055 20.5254,15.6055H14.355L12.6553,17.0871V9.4049Z" + android:fillColor="#3C4043" + android:fillType="evenOdd"/> +</vector>
\ No newline at end of file diff --git a/packages/CompanionDeviceManager/res/values/strings.xml b/packages/CompanionDeviceManager/res/values/strings.xml index a5daeb2175b4..ecc5f81e57f7 100644 --- a/packages/CompanionDeviceManager/res/values/strings.xml +++ b/packages/CompanionDeviceManager/res/values/strings.xml @@ -81,6 +81,18 @@ <!-- Description of the helper dialog for COMPUTER profile. [CHAR LIMIT=NONE] --> <string name="helper_summary_computer"><xliff:g id="app_name" example="GMS">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="device_type" example="Chromebook">%2$s</xliff:g> to access your phone\u2019s photos, media, and notifications</string> + <!-- TODO(b/256140614) To replace all nearby_device_streaming related strings with final versions --> + <!-- ================= DEVICE_PROFILE_NEARBY_DEVICE_STREAMING ================= --> + + <!-- Confirmation for associating an application with a companion device of NEARBY_DEVICE_STREAMING profile (type) [CHAR LIMIT=NONE] --> + <string name="title_nearby_device_streaming">Allow <strong><xliff:g id="app_name" example="NearbyStreamer">%1$s</xliff:g></strong> to perform this action from your phone</string> + + <!-- Title of the helper dialog for NEARBY_DEVICE_STREAMING profile [CHAR LIMIT=30]. --> + <string name="helper_title_nearby_device_streaming">Cross-device services</string> + + <!-- Description of the helper dialog for NEARBY_DEVICE_STREAMING profile. [CHAR LIMIT=NONE] --> + <string name="helper_summary_nearby_device_streaming"><xliff:g id="app_name" example="NearbyStreamerApp">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="device_type" example="NearbyDevice">%2$s</xliff:g> to stream content to nearby devices</string> + <!-- ================= null profile ================= --> <!-- A noun for a companion device with unspecified profile (type) [CHAR LIMIT=30] --> @@ -128,7 +140,7 @@ <!-- Calendar permission will be granted of corresponding profile [CHAR LIMIT=30] --> <string name="permission_calendar">Calendar</string> - <!-- Calendar permission will be granted of corresponding profile [CHAR LIMIT=30] --> + <!-- Nearby devices permission will be granted of corresponding profile [CHAR LIMIT=30] --> <string name="permission_nearby_devices">Nearby devices</string> <!-- Storage permission will be granted of corresponding profile [CHAR LIMIT=30] --> @@ -140,6 +152,9 @@ <!-- Apps permission will be granted of corresponding profile [CHAR LIMIT=30] --> <string name="permission_app_streaming">Apps</string> + <!-- Nearby_device_streaming permission will be granted to the corresponding profile [CHAR LIMIT=30] --> + <string name="permission_nearby_device_streaming">Nearby Device Streaming</string> + <!-- Description of phone permission of corresponding profile [CHAR LIMIT=NONE] --> <string name="permission_phone_summary">Can access your phone number and network info. Required for making calls and VoIP, voicemail, call redirect, and editing call logs</string> @@ -167,4 +182,8 @@ <!-- Description of storage permission of corresponding profile [CHAR LIMIT=NONE] --> <string name="permission_storage_summary"></string> + <!-- Description of nearby_device_streaming permission of corresponding profile [CHAR LIMIT=NONE] --> + <!-- TODO(b/256140614) Need the description for nearby devices' permission --> + <string name="permission_nearby_device_streaming_summary">Stream content to a nearby device</string> + </resources> diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceActivity.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceActivity.java index c95b3bcae589..c249f5522429 100644 --- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceActivity.java +++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceActivity.java @@ -20,6 +20,7 @@ import static android.companion.AssociationRequest.DEVICE_PROFILE_APP_STREAMING; import static android.companion.AssociationRequest.DEVICE_PROFILE_AUTOMOTIVE_PROJECTION; import static android.companion.AssociationRequest.DEVICE_PROFILE_COMPUTER; import static android.companion.AssociationRequest.DEVICE_PROFILE_GLASSES; +import static android.companion.AssociationRequest.DEVICE_PROFILE_NEARBY_DEVICE_STREAMING; import static android.companion.AssociationRequest.DEVICE_PROFILE_WATCH; import static android.companion.CompanionDeviceManager.REASON_CANCELED; import static android.companion.CompanionDeviceManager.REASON_DISCOVERY_TIMEOUT; @@ -36,6 +37,7 @@ import static com.android.companiondevicemanager.PermissionListAdapter.PERMISSIO import static com.android.companiondevicemanager.PermissionListAdapter.PERMISSION_CALENDAR; import static com.android.companiondevicemanager.PermissionListAdapter.PERMISSION_CONTACTS; import static com.android.companiondevicemanager.PermissionListAdapter.PERMISSION_NEARBY_DEVICES; +import static com.android.companiondevicemanager.PermissionListAdapter.PERMISSION_NEARBY_DEVICE_STREAMING; import static com.android.companiondevicemanager.PermissionListAdapter.PERMISSION_NOTIFICATION; import static com.android.companiondevicemanager.PermissionListAdapter.PERMISSION_PHONE; import static com.android.companiondevicemanager.PermissionListAdapter.PERMISSION_SMS; @@ -502,6 +504,12 @@ public class CompanionDeviceActivity extends FragmentActivity implements mPermissionTypes.addAll(Arrays.asList(PERMISSION_NOTIFICATION, PERMISSION_STORAGE)); break; + case DEVICE_PROFILE_NEARBY_DEVICE_STREAMING: + title = getHtmlFromResources(this, R.string.title_nearby_device_streaming, + deviceName); + mPermissionTypes.add(PERMISSION_NEARBY_DEVICE_STREAMING); + break; + default: throw new RuntimeException("Unsupported profile " + deviceProfile); } diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionVendorHelperDialogFragment.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionVendorHelperDialogFragment.java index 804e7577366b..eae14a6ac175 100644 --- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionVendorHelperDialogFragment.java +++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionVendorHelperDialogFragment.java @@ -18,6 +18,7 @@ package com.android.companiondevicemanager; import static android.companion.AssociationRequest.DEVICE_PROFILE_APP_STREAMING; import static android.companion.AssociationRequest.DEVICE_PROFILE_COMPUTER; +import static android.companion.AssociationRequest.DEVICE_PROFILE_NEARBY_DEVICE_STREAMING; import static com.android.companiondevicemanager.Utils.getApplicationIcon; import static com.android.companiondevicemanager.Utils.getHtmlFromResources; @@ -134,6 +135,14 @@ public class CompanionVendorHelperDialogFragment extends DialogFragment { getContext(), R.string.helper_summary_computer, title, displayName); break; + case DEVICE_PROFILE_NEARBY_DEVICE_STREAMING: + title = getHtmlFromResources(getContext(), + R.string.helper_title_nearby_device_streaming); + summary = getHtmlFromResources( + getContext(), R.string.helper_summary_nearby_device_streaming, title, + displayName); + break; + default: throw new RuntimeException("Unsupported profile " + deviceProfile); } diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/PermissionListAdapter.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/PermissionListAdapter.java index 0ee94a2c3921..90b94fbd3de5 100644 --- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/PermissionListAdapter.java +++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/PermissionListAdapter.java @@ -50,6 +50,7 @@ class PermissionListAdapter extends RecyclerView.Adapter<PermissionListAdapter.V static final int PERMISSION_CONTACTS = 5; static final int PERMISSION_CALENDAR = 6; static final int PERMISSION_NEARBY_DEVICES = 7; + static final int PERMISSION_NEARBY_DEVICE_STREAMING = 8; private static final Map<Integer, Integer> sTitleMap; static { @@ -62,6 +63,7 @@ class PermissionListAdapter extends RecyclerView.Adapter<PermissionListAdapter.V map.put(PERMISSION_CONTACTS, R.string.permission_contacts); map.put(PERMISSION_CALENDAR, R.string.permission_calendar); map.put(PERMISSION_NEARBY_DEVICES, R.string.permission_nearby_devices); + map.put(PERMISSION_NEARBY_DEVICE_STREAMING, R.string.permission_nearby_device_streaming); sTitleMap = unmodifiableMap(map); } @@ -76,6 +78,8 @@ class PermissionListAdapter extends RecyclerView.Adapter<PermissionListAdapter.V map.put(PERMISSION_CONTACTS, R.string.permission_contacts_summary); map.put(PERMISSION_CALENDAR, R.string.permission_calendar_summary); map.put(PERMISSION_NEARBY_DEVICES, R.string.permission_nearby_devices_summary); + map.put(PERMISSION_NEARBY_DEVICE_STREAMING, + R.string.permission_nearby_device_streaming_summary); sSummaryMap = unmodifiableMap(map); } @@ -90,6 +94,8 @@ class PermissionListAdapter extends RecyclerView.Adapter<PermissionListAdapter.V map.put(PERMISSION_CONTACTS, R.drawable.ic_permission_contacts); map.put(PERMISSION_CALENDAR, R.drawable.ic_permission_calendar); map.put(PERMISSION_NEARBY_DEVICES, R.drawable.ic_permission_nearby_devices); + map.put(PERMISSION_NEARBY_DEVICE_STREAMING, + R.drawable.ic_permission_nearby_device_streaming); sIconMap = unmodifiableMap(map); } diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index 533ad1805076..627c445a38eb 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -321,6 +321,7 @@ <uses-permission android:name="android.permission.REQUEST_COMPANION_PROFILE_APP_STREAMING" /> <uses-permission android:name="android.permission.REQUEST_COMPANION_PROFILE_COMPUTER" /> <uses-permission android:name="android.permission.REQUEST_COMPANION_PROFILE_AUTOMOTIVE_PROJECTION" /> + <uses-permission android:name="android.permission.REQUEST_COMPANION_PROFILE_NEARBY_DEVICE_STREAMING" /> <uses-permission android:name="android.permission.REQUEST_COMPANION_PROFILE_WATCH" /> <uses-permission android:name="android.permission.REQUEST_COMPANION_PROFILE_GLASSES" /> <uses-permission android:name="android.permission.REQUEST_COMPANION_SELF_MANAGED" /> diff --git a/services/companion/java/com/android/server/companion/MetricUtils.java b/services/companion/java/com/android/server/companion/MetricUtils.java index d1b4a8082192..cf867b67cbca 100644 --- a/services/companion/java/com/android/server/companion/MetricUtils.java +++ b/services/companion/java/com/android/server/companion/MetricUtils.java @@ -20,6 +20,7 @@ import static android.companion.AssociationRequest.DEVICE_PROFILE_APP_STREAMING; import static android.companion.AssociationRequest.DEVICE_PROFILE_AUTOMOTIVE_PROJECTION; import static android.companion.AssociationRequest.DEVICE_PROFILE_COMPUTER; import static android.companion.AssociationRequest.DEVICE_PROFILE_GLASSES; +import static android.companion.AssociationRequest.DEVICE_PROFILE_NEARBY_DEVICE_STREAMING; import static android.companion.AssociationRequest.DEVICE_PROFILE_WATCH; import static com.android.internal.util.FrameworkStatsLog.CDM_ASSOCIATION_ACTION; @@ -29,6 +30,7 @@ import static com.android.internal.util.FrameworkStatsLog.CDM_ASSOCIATION_ACTION import static com.android.internal.util.FrameworkStatsLog.CDM_ASSOCIATION_ACTION__DEVICE_PROFILE__DEVICE_PROFILE_AUTO_PROJECTION; import static com.android.internal.util.FrameworkStatsLog.CDM_ASSOCIATION_ACTION__DEVICE_PROFILE__DEVICE_PROFILE_COMPUTER; import static com.android.internal.util.FrameworkStatsLog.CDM_ASSOCIATION_ACTION__DEVICE_PROFILE__DEVICE_PROFILE_GLASSES; +import static com.android.internal.util.FrameworkStatsLog.CDM_ASSOCIATION_ACTION__DEVICE_PROFILE__DEVICE_PROFILE_NEARBY_DEVICE_STREAMING; import static com.android.internal.util.FrameworkStatsLog.CDM_ASSOCIATION_ACTION__DEVICE_PROFILE__DEVICE_PROFILE_NULL; import static com.android.internal.util.FrameworkStatsLog.CDM_ASSOCIATION_ACTION__DEVICE_PROFILE__DEVICE_PROFILE_WATCH; import static com.android.internal.util.FrameworkStatsLog.write; @@ -65,6 +67,10 @@ final class MetricUtils { DEVICE_PROFILE_GLASSES, CDM_ASSOCIATION_ACTION__DEVICE_PROFILE__DEVICE_PROFILE_GLASSES ); + map.put( + DEVICE_PROFILE_NEARBY_DEVICE_STREAMING, + CDM_ASSOCIATION_ACTION__DEVICE_PROFILE__DEVICE_PROFILE_NEARBY_DEVICE_STREAMING + ); METRIC_DEVICE_PROFILE = unmodifiableMap(map); } diff --git a/services/companion/java/com/android/server/companion/PermissionsUtils.java b/services/companion/java/com/android/server/companion/PermissionsUtils.java index 27c45d8e0d71..0ff3fb7a2d58 100644 --- a/services/companion/java/com/android/server/companion/PermissionsUtils.java +++ b/services/companion/java/com/android/server/companion/PermissionsUtils.java @@ -24,6 +24,7 @@ import static android.companion.AssociationRequest.DEVICE_PROFILE_APP_STREAMING; import static android.companion.AssociationRequest.DEVICE_PROFILE_AUTOMOTIVE_PROJECTION; import static android.companion.AssociationRequest.DEVICE_PROFILE_COMPUTER; import static android.companion.AssociationRequest.DEVICE_PROFILE_GLASSES; +import static android.companion.AssociationRequest.DEVICE_PROFILE_NEARBY_DEVICE_STREAMING; import static android.companion.AssociationRequest.DEVICE_PROFILE_WATCH; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.os.Binder.getCallingPid; @@ -67,6 +68,8 @@ public final class PermissionsUtils { Manifest.permission.REQUEST_COMPANION_PROFILE_AUTOMOTIVE_PROJECTION); map.put(DEVICE_PROFILE_COMPUTER, Manifest.permission.REQUEST_COMPANION_PROFILE_COMPUTER); map.put(DEVICE_PROFILE_GLASSES, Manifest.permission.REQUEST_COMPANION_PROFILE_GLASSES); + map.put(DEVICE_PROFILE_NEARBY_DEVICE_STREAMING, + Manifest.permission.REQUEST_COMPANION_PROFILE_NEARBY_DEVICE_STREAMING); DEVICE_PROFILE_TO_PERMISSION = unmodifiableMap(map); } |