diff --git a/packages/CompanionDeviceManager/res/drawable-night/ic_permission_call_logs.xml b/packages/CompanionDeviceManager/res/drawable-night/ic_permission_call_logs.xml
new file mode 100644
index 0000000000000..4db291a3d321f
--- /dev/null
+++ b/packages/CompanionDeviceManager/res/drawable-night/ic_permission_call_logs.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/CompanionDeviceManager/res/drawable/helper_back_button.xml b/packages/CompanionDeviceManager/res/drawable/helper_back_button.xml
index 6ce1f12636387..6ec63581df254 100644
--- a/packages/CompanionDeviceManager/res/drawable/helper_back_button.xml
+++ b/packages/CompanionDeviceManager/res/drawable/helper_back_button.xml
@@ -18,6 +18,6 @@
-
+
\ No newline at end of file
diff --git a/packages/CompanionDeviceManager/res/drawable/ic_permission_call_logs.xml b/packages/CompanionDeviceManager/res/drawable/ic_permission_call_logs.xml
new file mode 100644
index 0000000000000..817d3a0863a2f
--- /dev/null
+++ b/packages/CompanionDeviceManager/res/drawable/ic_permission_call_logs.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/CompanionDeviceManager/res/values/strings.xml b/packages/CompanionDeviceManager/res/values/strings.xml
index 0764d9032c1b8..c410d648e7eeb 100644
--- a/packages/CompanionDeviceManager/res/values/strings.xml
+++ b/packages/CompanionDeviceManager/res/values/strings.xml
@@ -143,7 +143,10 @@
Microphone
-
+
+ Call logs
+
+
Nearby devices
@@ -159,26 +162,26 @@
Nearby Device Streaming
- Can access your phone number and network info. Required for making calls and VoIP, voicemail, call redirect, and editing call logs
+ Can make and manage phone calls
+
+
+ Can read and write phone call log
-
-
+ Can send and view SMS messages
- Can read, create, or edit our contact list, as well as access the list of all accounts used on your device
+ Can access your contacts
-
-
+ Can access your calendar
Can record audio using the microphone
-
-
+ Can find, connect to, and determine the relative position of nearby devices
Can read all notifications, including information like contacts, messages, and photos
diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceActivity.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceActivity.java
index 8d0a2c04ee2b3..c5ed5c9680a81 100644
--- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceActivity.java
+++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceActivity.java
@@ -16,12 +16,6 @@
package com.android.companiondevicemanager;
-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;
import static android.companion.CompanionDeviceManager.REASON_INTERNAL_ERROR;
@@ -33,16 +27,14 @@ import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTE
import static com.android.companiondevicemanager.CompanionDeviceDiscoveryService.DiscoveryState;
import static com.android.companiondevicemanager.CompanionDeviceDiscoveryService.DiscoveryState.FINISHED_TIMEOUT;
-import static com.android.companiondevicemanager.PermissionListAdapter.PERMISSION_APP_STREAMING;
-import static com.android.companiondevicemanager.PermissionListAdapter.PERMISSION_CALENDAR;
-import static com.android.companiondevicemanager.PermissionListAdapter.PERMISSION_CONTACTS;
-import static com.android.companiondevicemanager.PermissionListAdapter.PERMISSION_MICROPHONE;
-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;
-import static com.android.companiondevicemanager.PermissionListAdapter.PERMISSION_STORAGE;
+import static com.android.companiondevicemanager.CompanionDeviceResources.MULTI_DEVICES_SUMMARIES;
+import static com.android.companiondevicemanager.CompanionDeviceResources.PERMISSION_TYPES;
+import static com.android.companiondevicemanager.CompanionDeviceResources.PROFILES_NAME;
+import static com.android.companiondevicemanager.CompanionDeviceResources.PROFILE_ICON;
+import static com.android.companiondevicemanager.CompanionDeviceResources.SUMMARIES;
+import static com.android.companiondevicemanager.CompanionDeviceResources.SUPPORTED_PROFILES;
+import static com.android.companiondevicemanager.CompanionDeviceResources.SUPPORTED_SELF_MANAGED_PROFILES;
+import static com.android.companiondevicemanager.CompanionDeviceResources.TITLES;
import static com.android.companiondevicemanager.Utils.getApplicationLabel;
import static com.android.companiondevicemanager.Utils.getHtmlFromResources;
import static com.android.companiondevicemanager.Utils.getIcon;
@@ -92,7 +84,6 @@ import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
/**
@@ -470,6 +461,10 @@ public class CompanionDeviceActivity extends FragmentActivity implements
int nightModeFlags = getResources().getConfiguration().uiMode
& Configuration.UI_MODE_NIGHT_MASK;
+ if (!SUPPORTED_SELF_MANAGED_PROFILES.contains(deviceProfile)) {
+ throw new RuntimeException("Unsupported profile " + deviceProfile);
+ }
+
mPermissionTypes = new ArrayList<>();
try {
@@ -488,32 +483,8 @@ public class CompanionDeviceActivity extends FragmentActivity implements
return;
}
- // TODO(b/253644212): Add maps for profile -> title, summary, permissions
- switch (deviceProfile) {
- case DEVICE_PROFILE_APP_STREAMING:
- title = getHtmlFromResources(this, R.string.title_app_streaming, deviceName);
- mPermissionTypes.add(PERMISSION_APP_STREAMING);
- break;
-
- case DEVICE_PROFILE_AUTOMOTIVE_PROJECTION:
- title = getHtmlFromResources(
- this, R.string.title_automotive_projection, deviceName);
- break;
-
- case DEVICE_PROFILE_COMPUTER:
- title = getHtmlFromResources(this, R.string.title_computer, deviceName);
- 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);
- }
+ title = getHtmlFromResources(this, TITLES.get(deviceProfile), deviceName);
+ mPermissionTypes.addAll(PERMISSION_TYPES.get(deviceProfile));
// Summary is not needed for selfManaged dialog.
mSummary.setVisibility(View.GONE);
@@ -566,46 +537,28 @@ public class CompanionDeviceActivity extends FragmentActivity implements
}
final String deviceName = mSelectedDevice.getDisplayName();
- final String profileName;
final Spanned title;
final Spanned summary;
final Drawable profileIcon;
+ if (!SUPPORTED_PROFILES.contains(deviceProfile)) {
+ throw new RuntimeException("Unsupported profile " + deviceProfile);
+ }
+
if (deviceProfile == null) {
- title = getHtmlFromResources(this, R.string.confirmation_title, appLabel, deviceName);
- summary = getHtmlFromResources(this, R.string.summary_generic);
- profileIcon = getIcon(this, R.drawable.ic_device_other);
// Summary is not needed for null profile.
mSummary.setVisibility(View.GONE);
mConstraintList.setVisibility(View.GONE);
- } else if (deviceProfile.equals(DEVICE_PROFILE_WATCH)) {
- profileName = getString(R.string.profile_name_watch);
- title = getHtmlFromResources(this, R.string.confirmation_title, appLabel, deviceName);
- summary = getHtmlFromResources(
- this, R.string.summary_watch_single_device, profileName, appLabel);
- profileIcon = getIcon(this, R.drawable.ic_watch);
-
- mPermissionTypes.addAll(Arrays.asList(
- PERMISSION_NOTIFICATION, PERMISSION_PHONE, PERMISSION_SMS, PERMISSION_CONTACTS,
- PERMISSION_CALENDAR, PERMISSION_NEARBY_DEVICES));
-
- setupPermissionList();
- } else if (deviceProfile.equals(DEVICE_PROFILE_GLASSES)) {
- profileName = getString(R.string.profile_name_glasses);
- title = getHtmlFromResources(this, R.string.confirmation_title, appLabel, deviceName);
- summary = getHtmlFromResources(
- this, R.string.summary_glasses_single_device, profileName, appLabel);
- profileIcon = getIcon(this, R.drawable.ic_glasses);
-
- mPermissionTypes.addAll(Arrays.asList(
- PERMISSION_NOTIFICATION, PERMISSION_PHONE, PERMISSION_SMS, PERMISSION_CONTACTS,
- PERMISSION_MICROPHONE, PERMISSION_NEARBY_DEVICES));
-
- setupPermissionList();
} else {
- throw new RuntimeException("Unsupported profile " + deviceProfile);
+ mPermissionTypes.addAll(PERMISSION_TYPES.get(deviceProfile));
+ setupPermissionList();
}
+ title = getHtmlFromResources(this, TITLES.get(deviceProfile), appLabel, deviceName);
+ summary = getHtmlFromResources(this, SUMMARIES.get(deviceProfile),
+ getString(PROFILES_NAME.get(deviceProfile)), appLabel);
+ profileIcon = getIcon(this, PROFILE_ICON.get(deviceProfile));
+
mTitle.setText(title);
mSummary.setText(summary);
mProfileIcon.setImageDrawable(profileIcon);
@@ -621,22 +574,23 @@ public class CompanionDeviceActivity extends FragmentActivity implements
final String profileName;
final Spanned summary;
final Drawable profileIcon;
- if (deviceProfile == null) {
- profileName = getString(R.string.profile_name_generic);
- summary = getHtmlFromResources(this, R.string.summary_generic);
- profileIcon = getIcon(this, R.drawable.ic_device_other);
- mSummary.setVisibility(View.GONE);
- } else if (deviceProfile.equals(DEVICE_PROFILE_WATCH)) {
- profileName = getString(R.string.profile_name_watch);
- summary = getHtmlFromResources(this, R.string.summary_watch, profileName, appLabel);
- profileIcon = getIcon(this, R.drawable.ic_watch);
- } else if (deviceProfile.equals(DEVICE_PROFILE_GLASSES)) {
- profileName = getString(R.string.profile_name_glasses);
- summary = getHtmlFromResources(this, R.string.summary_glasses, profileName, appLabel);
- profileIcon = getIcon(this, R.drawable.ic_glasses);
- } else {
+ final int summaryResourceId;
+
+ if (!SUPPORTED_PROFILES.contains(deviceProfile)) {
throw new RuntimeException("Unsupported profile " + deviceProfile);
}
+
+ profileName = getString(PROFILES_NAME.get(deviceProfile));
+ profileIcon = getIcon(this, PROFILE_ICON.get(deviceProfile));
+ summaryResourceId = MULTI_DEVICES_SUMMARIES.get(deviceProfile);
+
+ if (deviceProfile == null) {
+ summary = getHtmlFromResources(this, summaryResourceId);
+ mSummary.setVisibility(View.GONE);
+ } else {
+ summary = getHtmlFromResources(this, summaryResourceId, profileName, appLabel);
+ }
+
final Spanned title = getHtmlFromResources(
this, R.string.chooser_title, profileName, appLabel);
diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceResources.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceResources.java
new file mode 100644
index 0000000000000..6f5f4fe91c992
--- /dev/null
+++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/CompanionDeviceResources.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2023 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.companiondevicemanager;
+
+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.companiondevicemanager.PermissionListAdapter.PERMISSION_APP_STREAMING;
+import static com.android.companiondevicemanager.PermissionListAdapter.PERMISSION_CALENDAR;
+import static com.android.companiondevicemanager.PermissionListAdapter.PERMISSION_CALL_LOGS;
+import static com.android.companiondevicemanager.PermissionListAdapter.PERMISSION_CONTACTS;
+import static com.android.companiondevicemanager.PermissionListAdapter.PERMISSION_MICROPHONE;
+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;
+import static com.android.companiondevicemanager.PermissionListAdapter.PERMISSION_STORAGE;
+
+import static java.util.Collections.unmodifiableMap;
+import static java.util.Collections.unmodifiableSet;
+
+import android.util.ArrayMap;
+import android.util.ArraySet;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * A class contains maps that have deviceProfile as the key and resourceId as the value
+ * for the corresponding profile.
+ */
+final class CompanionDeviceResources {
+ static final Map TITLES;
+ static {
+ final Map map = new ArrayMap<>();
+ map.put(DEVICE_PROFILE_APP_STREAMING, R.string.title_app_streaming);
+ map.put(DEVICE_PROFILE_AUTOMOTIVE_PROJECTION, R.string.title_automotive_projection);
+ map.put(DEVICE_PROFILE_COMPUTER, R.string.title_computer);
+ map.put(DEVICE_PROFILE_NEARBY_DEVICE_STREAMING, R.string.title_nearby_device_streaming);
+ map.put(DEVICE_PROFILE_WATCH, R.string.confirmation_title);
+ map.put(DEVICE_PROFILE_GLASSES, R.string.confirmation_title);
+ map.put(null, R.string.confirmation_title);
+
+ TITLES = unmodifiableMap(map);
+ }
+
+ static final Map> PERMISSION_TYPES;
+ static {
+ final Map> map = new ArrayMap<>();
+ map.put(DEVICE_PROFILE_APP_STREAMING, Arrays.asList(PERMISSION_APP_STREAMING));
+ map.put(DEVICE_PROFILE_COMPUTER, Arrays.asList(
+ PERMISSION_NOTIFICATION, PERMISSION_STORAGE));
+ map.put(DEVICE_PROFILE_NEARBY_DEVICE_STREAMING,
+ Arrays.asList(PERMISSION_NEARBY_DEVICE_STREAMING));
+ map.put(DEVICE_PROFILE_WATCH, Arrays.asList(PERMISSION_NOTIFICATION, PERMISSION_PHONE,
+ PERMISSION_CALL_LOGS, PERMISSION_SMS, PERMISSION_CONTACTS, PERMISSION_CALENDAR,
+ PERMISSION_NEARBY_DEVICES));
+ map.put(DEVICE_PROFILE_GLASSES, Arrays.asList(PERMISSION_NOTIFICATION, PERMISSION_PHONE,
+ PERMISSION_SMS, PERMISSION_CONTACTS, PERMISSION_MICROPHONE,
+ PERMISSION_NEARBY_DEVICES));
+
+ PERMISSION_TYPES = unmodifiableMap(map);
+ }
+
+ static final Map SUMMARIES;
+ static {
+ final Map map = new ArrayMap<>();
+ map.put(DEVICE_PROFILE_WATCH, R.string.summary_watch_single_device);
+ map.put(DEVICE_PROFILE_GLASSES, R.string.summary_glasses_single_device);
+ map.put(null, R.string.summary_generic);
+
+ SUMMARIES = unmodifiableMap(map);
+ }
+
+ static final Map MULTI_DEVICES_SUMMARIES;
+ static {
+ final Map map = new ArrayMap<>();
+ map.put(DEVICE_PROFILE_WATCH, R.string.summary_watch);
+ map.put(DEVICE_PROFILE_GLASSES, R.string.summary_glasses);
+ map.put(null, R.string.summary_generic);
+
+ MULTI_DEVICES_SUMMARIES = unmodifiableMap(map);
+ }
+
+ static final Map PROFILES_NAME;
+ static {
+ final Map map = new ArrayMap<>();
+ map.put(DEVICE_PROFILE_WATCH, R.string.profile_name_watch);
+ map.put(DEVICE_PROFILE_GLASSES, R.string.profile_name_glasses);
+ map.put(null, R.string.profile_name_generic);
+
+ PROFILES_NAME = unmodifiableMap(map);
+ }
+
+ static final Map PROFILE_ICON;
+ static {
+ final Map map = new ArrayMap<>();
+ map.put(DEVICE_PROFILE_WATCH, R.drawable.ic_watch);
+ map.put(DEVICE_PROFILE_GLASSES, R.drawable.ic_glasses);
+ map.put(null, R.drawable.ic_device_other);
+
+ PROFILE_ICON = unmodifiableMap(map);
+ }
+
+ static final Set SUPPORTED_PROFILES;
+ static {
+ final Set set = new ArraySet<>();
+ set.add(DEVICE_PROFILE_WATCH);
+ set.add(DEVICE_PROFILE_GLASSES);
+ set.add(null);
+
+ SUPPORTED_PROFILES = unmodifiableSet(set);
+ }
+
+
+ static final Set SUPPORTED_SELF_MANAGED_PROFILES;
+ static {
+ final Set set = new ArraySet<>();
+ set.add(DEVICE_PROFILE_APP_STREAMING);
+ set.add(DEVICE_PROFILE_COMPUTER);
+ set.add(DEVICE_PROFILE_AUTOMOTIVE_PROJECTION);
+ set.add(DEVICE_PROFILE_NEARBY_DEVICE_STREAMING);
+ set.add(null);
+
+ SUPPORTED_SELF_MANAGED_PROFILES = unmodifiableSet(set);
+ }
+
+
+}
diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/PermissionListAdapter.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/PermissionListAdapter.java
index 00c44d6927822..556a05c55f88f 100644
--- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/PermissionListAdapter.java
+++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/PermissionListAdapter.java
@@ -52,6 +52,7 @@ class PermissionListAdapter extends RecyclerView.Adapter sTitleMap;
static {
@@ -66,6 +67,7 @@ class PermissionListAdapter extends RecyclerView.Adapter