Merge "Better Support for profiles in "People that can interrupt"" into main

This commit is contained in:
Treehugger Robot
2024-10-07 20:11:09 +00:00
committed by Android (Google) Code Review
6 changed files with 520 additions and 40 deletions

View File

@@ -18,13 +18,17 @@ package com.android.settings.notification.modes;
import android.annotation.Nullable;
import android.app.INotificationManager;
import android.content.ContentProvider;
import android.content.Context;
import android.content.pm.ParceledListSlice;
import android.database.Cursor;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.ServiceManager;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.ContactsContract;
import android.provider.ContactsContract.Contacts;
import android.service.notification.ConversationChannelWrapper;
import android.util.Log;
@@ -39,6 +43,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
/**
* Class used for Settings-system_server interactions that are not <em>directly</em> related to
@@ -54,6 +59,7 @@ class ZenHelperBackend {
private final Context mContext;
private final INotificationManager mInm;
private final UserManager mUserManager;
static ZenHelperBackend getInstance(Context context) {
if (sInstance == null) {
@@ -66,6 +72,7 @@ class ZenHelperBackend {
mContext = context;
mInm = INotificationManager.Stub.asInterface(
ServiceManager.getService(Context.NOTIFICATION_SERVICE));
mUserManager = context.getSystemService(UserManager.class);
}
/**
@@ -81,10 +88,12 @@ class ZenHelperBackend {
}
}
/** Returns all conversation channels for profiles of the current user. */
ImmutableList<ConversationChannelWrapper> getAllConversations() {
return getConversations(false);
}
/** Returns all important (priority) conversation channels for profiles of the current user. */
ImmutableList<ConversationChannelWrapper> getImportantConversations() {
return getConversations(true);
}
@@ -97,7 +106,9 @@ class ZenHelperBackend {
onlyImportant);
if (parceledList != null) {
for (ConversationChannelWrapper conversation : parceledList.getList()) {
if (!conversation.getNotificationChannel().isDemoted()) {
if (conversation.getShortcutInfo() != null
&& conversation.getNotificationChannel() != null
&& !conversation.getNotificationChannel().isDemoted()) {
list.add(conversation);
}
}
@@ -109,38 +120,52 @@ class ZenHelperBackend {
}
}
record Contact(long id, @Nullable String displayName, @Nullable Uri photoUri) { }
record Contact(UserHandle user, long contactId, @Nullable String displayName,
@Nullable Uri photoUri) { }
/** Returns all contacts for profiles of the current user. */
ImmutableList<Contact> getAllContacts() {
try (Cursor cursor = queryAllContactsData()) {
return getContactsFromCursor(cursor);
}
return getContactsForUserProfiles(this::queryAllContactsData);
}
/** Returns all starred contacts for profiles of the current user. */
ImmutableList<Contact> getStarredContacts() {
try (Cursor cursor = queryStarredContactsData()) {
return getContactsFromCursor(cursor);
}
return getContactsForUserProfiles(this::queryStarredContactsData);
}
private ImmutableList<Contact> getContactsFromCursor(Cursor cursor) {
ImmutableList.Builder<Contact> list = new ImmutableList.Builder<>();
private ImmutableList<Contact> getContactsForUserProfiles(
Function<UserHandle, Cursor> userQuery) {
ImmutableList.Builder<Contact> contacts = new ImmutableList.Builder<>();
for (UserHandle user : mUserManager.getAllProfiles()) {
try (Cursor cursor = userQuery.apply(user)) {
loadContactsFromCursor(user, cursor, contacts);
}
}
return contacts.build();
}
private void loadContactsFromCursor(UserHandle user, Cursor cursor,
ImmutableList.Builder<Contact> contactsListBuilder) {
if (cursor != null && cursor.moveToFirst()) {
do {
long id = cursor.getLong(0);
String name = Strings.emptyToNull(cursor.getString(1));
String photoUriStr = cursor.getString(2);
Uri photoUri = !Strings.isNullOrEmpty(photoUriStr) ? Uri.parse(photoUriStr) : null;
list.add(new Contact(id, name, photoUri));
contactsListBuilder.add(new Contact(user, id, name,
ContentProvider.maybeAddUserId(photoUri, user.getIdentifier())));
} while (cursor.moveToNext());
}
return list.build();
}
int getAllContactsCount() {
try (Cursor cursor = queryAllContactsData()) {
return cursor != null ? cursor.getCount() : 0;
int count = 0;
for (UserHandle user : mUserManager.getEnabledProfiles()) {
try (Cursor cursor = queryAllContactsData(user)) {
count += (cursor != null ? cursor.getCount() : 0);
}
}
return count;
}
private static final String[] CONTACTS_PROJECTION = new String[] {
@@ -149,17 +174,17 @@ class ZenHelperBackend {
ContactsContract.Contacts.PHOTO_THUMBNAIL_URI
};
private Cursor queryStarredContactsData() {
private Cursor queryStarredContactsData(UserHandle user) {
return mContext.getContentResolver().query(
ContactsContract.Contacts.CONTENT_URI,
ContentProvider.maybeAddUserId(Contacts.CONTENT_URI, user.getIdentifier()),
CONTACTS_PROJECTION,
/* selection= */ ContactsContract.Data.STARRED + "=1", /* selectionArgs= */ null,
/* sortOrder= */ ContactsContract.Contacts.DISPLAY_NAME_PRIMARY);
}
private Cursor queryAllContactsData() {
private Cursor queryAllContactsData(UserHandle user) {
return mContext.getContentResolver().query(
ContactsContract.Contacts.CONTENT_URI,
ContentProvider.maybeAddUserId(Contacts.CONTENT_URI, user.getIdentifier()),
CONTACTS_PROJECTION,
/* selection= */ null, /* selectionArgs= */ null,
/* sortOrder= */ ContactsContract.Contacts.DISPLAY_NAME_PRIMARY);

View File

@@ -28,11 +28,14 @@ import static android.service.notification.ZenPolicy.PEOPLE_TYPE_UNSET;
import static com.google.common.base.Preconditions.checkNotNull;
import android.app.Dialog;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.icu.text.MessageFormat;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Contacts;
import android.service.notification.ZenPolicy;
import android.view.View;
@@ -46,6 +49,7 @@ import androidx.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.dashboard.profileselector.ProfileSelectDialog;
import com.android.settings.notification.app.ConversationListSettings;
import com.android.settingslib.notification.modes.ZenMode;
import com.android.settingslib.notification.modes.ZenModesBackend;
@@ -55,6 +59,7 @@ import com.google.common.collect.ImmutableSet;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
@@ -87,16 +92,18 @@ class ZenModePrioritySendersPreferenceController
private static final Intent STARRED_CONTACTS_INTENT =
new Intent(Contacts.Intents.UI.LIST_STARRED_ACTION)
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
private static final Intent FALLBACK_INTENT = new Intent(Intent.ACTION_MAIN)
private static final Intent FALLBACK_CONTACTS_INTENT = new Intent(Intent.ACTION_MAIN)
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
private final ZenHelperBackend mHelperBackend;
private final UserManager mUserManager;
private final PackageManager mPackageManager;
private PreferenceCategory mPreferenceCategory;
private final LinkedHashMap<String, SelectorWithWidgetPreference> mOptions =
new LinkedHashMap<>();
private final ZenModeSummaryHelper mZenModeSummaryHelper;
@Nullable private Dialog mProfileSelectDialog;
public ZenModePrioritySendersPreferenceController(Context context, String key,
boolean isMessages, ZenModesBackend backend, ZenHelperBackend helperBackend) {
@@ -107,11 +114,12 @@ class ZenModePrioritySendersPreferenceController
String contactsPackage = context.getString(R.string.config_contacts_package_name);
ALL_CONTACTS_INTENT.setPackage(contactsPackage);
STARRED_CONTACTS_INTENT.setPackage(contactsPackage);
FALLBACK_INTENT.setPackage(contactsPackage);
FALLBACK_CONTACTS_INTENT.setPackage(contactsPackage);
mUserManager = mContext.getSystemService(UserManager.class);
mPackageManager = mContext.getPackageManager();
if (!FALLBACK_INTENT.hasCategory(Intent.CATEGORY_APP_CONTACTS)) {
FALLBACK_INTENT.addCategory(Intent.CATEGORY_APP_CONTACTS);
if (!FALLBACK_CONTACTS_INTENT.hasCategory(Intent.CATEGORY_APP_CONTACTS)) {
FALLBACK_CONTACTS_INTENT.addCategory(Intent.CATEGORY_APP_CONTACTS);
}
mZenModeSummaryHelper = new ZenModeSummaryHelper(mContext, mHelperBackend);
}
@@ -270,32 +278,48 @@ class ZenModePrioritySendersPreferenceController
}
return v -> {
if (KEY_STARRED.equals(key)
&& STARRED_CONTACTS_INTENT.resolveActivity(mPackageManager) != null) {
mContext.startActivity(STARRED_CONTACTS_INTENT);
} else if (KEY_CONTACTS.equals(key)
&& ALL_CONTACTS_INTENT.resolveActivity(mPackageManager) != null) {
mContext.startActivity(ALL_CONTACTS_INTENT);
if (KEY_STARRED.equals(key)) {
startContactsActivity(STARRED_CONTACTS_INTENT);
} else if (KEY_CONTACTS.equals(key)) {
startContactsActivity(ALL_CONTACTS_INTENT);
} else if (KEY_ANY_CONVERSATIONS.equals(key)
|| KEY_IMPORTANT_CONVERSATIONS.equals(key)) {
new SubSettingLauncher(mContext)
.setDestination(ConversationListSettings.class.getName())
.setSourceMetricsCategory(SettingsEnums.DND_MESSAGES)
.launch();
} else {
mContext.startActivity(FALLBACK_INTENT);
}
};
}
private void startContactsActivity(Intent preferredIntent) {
Intent intent = preferredIntent.resolveActivity(mPackageManager) != null
? preferredIntent : FALLBACK_CONTACTS_INTENT;
List<UserHandle> userProfiles = mUserManager.getEnabledProfiles();
if (userProfiles.size() <= 1) {
mContext.startActivity(intent);
}
mProfileSelectDialog = ProfileSelectDialog.createDialog(mContext, userProfiles,
position -> {
mContext.startActivityAsUser(intent, userProfiles.get(position));
if (mProfileSelectDialog != null) {
mProfileSelectDialog.dismiss();
mProfileSelectDialog = null;
}
});
mProfileSelectDialog.show();
}
private boolean isStarredIntentValid() {
return STARRED_CONTACTS_INTENT.resolveActivity(mPackageManager) != null
|| FALLBACK_INTENT.resolveActivity(mPackageManager) != null;
|| FALLBACK_CONTACTS_INTENT.resolveActivity(mPackageManager) != null;
}
private boolean isContactsIntentValid() {
return ALL_CONTACTS_INTENT.resolveActivity(mPackageManager) != null
|| FALLBACK_INTENT.resolveActivity(mPackageManager) != null;
|| FALLBACK_CONTACTS_INTENT.resolveActivity(mPackageManager) != null;
}
void updateSummaries() {