Merge "Fix work profile issue" into udc-dev

This commit is contained in:
Guangjie (Jerry) Shi
2023-05-09 03:47:05 +00:00
committed by Android (Google) Code Review
10 changed files with 91 additions and 32 deletions

View File

@@ -28,8 +28,8 @@
android:title="@string/credman_chosen_app_title"> android:title="@string/credman_chosen_app_title">
<com.android.settings.widget.GearPreference <com.android.settings.widget.GearPreference
android:fragment="com.android.settings.applications.credentials.DefaultCombinedPicker" android:fragment="com.android.settings.applications.credentials.DefaultCombinedPickerWork"
android:key="default_credman_autofill_main" android:key="default_credman_autofill_main_work"
android:title="@string/credman_chosen_app_title" android:title="@string/credman_chosen_app_title"
settings:searchable="false"> settings:searchable="false">
<extra <extra

View File

@@ -86,7 +86,7 @@ public class AccountDashboardFragment extends DashboardFragment {
forceUpdatePreferences(); forceUpdatePreferences();
} }
}; };
cmpp.init(this, getFragmentManager(), getIntent(), delegate); cmpp.init(this, getFragmentManager(), getIntent(), delegate, /*isWorkProfile=*/false);
} else { } else {
getSettingsLifecycle().addObserver(use(PasswordsPreferenceController.class)); getSettingsLifecycle().addObserver(use(PasswordsPreferenceController.class));
} }

View File

@@ -78,7 +78,7 @@ public class AccountPersonalDashboardFragment extends DashboardFragment {
forceUpdatePreferences(); forceUpdatePreferences();
} }
}; };
cmpp.init(this, getFragmentManager(), getIntent(), delegate); cmpp.init(this, getFragmentManager(), getIntent(), delegate, /*isWorkProfile=*/false);
} else { } else {
getSettingsLifecycle().addObserver(use(PasswordsPreferenceController.class)); getSettingsLifecycle().addObserver(use(PasswordsPreferenceController.class));
} }

View File

@@ -78,7 +78,7 @@ public class AccountWorkProfileDashboardFragment extends DashboardFragment {
forceUpdatePreferences(); forceUpdatePreferences();
} }
}; };
cmpp.init(this, getFragmentManager(), getIntent(), delegate); cmpp.init(this, getFragmentManager(), getIntent(), delegate, /*isWorkProfile=*/true);
} else { } else {
getSettingsLifecycle().addObserver(use(PasswordsPreferenceController.class)); getSettingsLifecycle().addObserver(use(PasswordsPreferenceController.class));
} }

View File

@@ -26,6 +26,7 @@ import android.credentials.CredentialProviderInfo;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.service.autofill.AutofillServiceInfo; import android.service.autofill.AutofillServiceInfo;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.IconDrawableFactory;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@@ -83,11 +84,12 @@ public final class CombinedProviderInfo {
/** Returns the app icon. */ /** Returns the app icon. */
@Nullable @Nullable
public Drawable getAppIcon(@NonNull Context context) { public Drawable getAppIcon(@NonNull Context context, int userId) {
IconDrawableFactory factory = IconDrawableFactory.newInstance(context);
Drawable icon = null; Drawable icon = null;
ServiceInfo brandingService = getBrandingService(); ServiceInfo brandingService = getBrandingService();
if (brandingService != null) { if (brandingService != null) {
icon = brandingService.loadIcon(context.getPackageManager()); icon = factory.getBadgedIcon(brandingService, getApplicationInfo(), userId);
} }
// If the branding service gave us a icon then use that. // If the branding service gave us a icon then use that.
@@ -95,8 +97,8 @@ public final class CombinedProviderInfo {
return icon; return icon;
} }
// Otherwise fallback to the app label and then the package name. // Otherwise fallback to the app icon and then the package name.
return getApplicationInfo().loadIcon(context.getPackageManager()); return factory.getBadgedIcon(getApplicationInfo(), userId);
} }
/** Returns the app name. */ /** Returns the app name. */

View File

@@ -41,6 +41,7 @@ import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.OutcomeReceiver; import android.os.OutcomeReceiver;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings; import android.provider.Settings;
import android.service.autofill.AutofillServiceInfo; import android.service.autofill.AutofillServiceInfo;
import android.text.TextUtils; import android.text.TextUtils;
@@ -110,6 +111,7 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
private @Nullable PreferenceScreen mPreferenceScreen = null; private @Nullable PreferenceScreen mPreferenceScreen = null;
private boolean mVisibility = false; private boolean mVisibility = false;
private boolean mIsWorkProfile = false;
public CredentialManagerPreferenceController(Context context, String preferenceKey) { public CredentialManagerPreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey); super(context, preferenceKey);
@@ -169,14 +171,17 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
* @param fragmentManager the fragment manager to use * @param fragmentManager the fragment manager to use
* @param intent the intent used to start the activity * @param intent the intent used to start the activity
* @param delegate the delegate to send results back to * @param delegate the delegate to send results back to
* @param isWorkProfile whether this controller is under a work profile user
*/ */
public void init( public void init(
DashboardFragment fragment, DashboardFragment fragment,
FragmentManager fragmentManager, FragmentManager fragmentManager,
@Nullable Intent launchIntent, @Nullable Intent launchIntent,
@NonNull Delegate delegate) { @NonNull Delegate delegate,
boolean isWorkProfile) {
fragment.getSettingsLifecycle().addObserver(this); fragment.getSettingsLifecycle().addObserver(this);
mFragmentManager = fragmentManager; mFragmentManager = fragmentManager;
mIsWorkProfile = isWorkProfile;
setDelegate(delegate); setDelegate(delegate);
verifyReceivedIntent(launchIntent); verifyReceivedIntent(launchIntent);
} }
@@ -420,7 +425,7 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
continue; continue;
} }
Drawable icon = combinedInfo.getAppIcon(context); Drawable icon = combinedInfo.getAppIcon(context, getUser());
CharSequence title = combinedInfo.getAppName(context); CharSequence title = combinedInfo.getAppName(context);
// Build the pref and add it to the output & group. // Build the pref and add it to the output & group.
@@ -681,9 +686,12 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
return new ConfirmationDialogFragment(host, packageName, appName); return new ConfirmationDialogFragment(host, packageName, appName);
} }
private int getUser() { protected int getUser() {
UserHandle workUser = getWorkProfileUser(); if (mIsWorkProfile) {
return workUser != null ? workUser.getIdentifier() : UserHandle.myUserId(); UserHandle workProfile = Utils.getManagedProfile(UserManager.get(mContext));
return workProfile.getIdentifier();
}
return UserHandle.myUserId();
} }
/** Called when the dialog button is clicked. */ /** Called when the dialog button is clicked. */

View File

@@ -47,9 +47,7 @@ import com.android.settingslib.utils.ThreadUtils;
import com.android.settingslib.widget.CandidateInfo; import com.android.settingslib.widget.CandidateInfo;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set;
public class DefaultCombinedPicker extends DefaultAppPickerFragment { public class DefaultCombinedPicker extends DefaultAppPickerFragment {
@@ -65,6 +63,7 @@ public class DefaultCombinedPicker extends DefaultAppPickerFragment {
private DialogInterface.OnClickListener mCancelListener; private DialogInterface.OnClickListener mCancelListener;
private CredentialManager mCredentialManager; private CredentialManager mCredentialManager;
private int mIntentSenderUserId = -1;
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
@@ -79,9 +78,11 @@ public class DefaultCombinedPicker extends DefaultAppPickerFragment {
}; };
// If mCancelListener is not null, fragment is started from // If mCancelListener is not null, fragment is started from
// ACTION_REQUEST_SET_AUTOFILL_SERVICE and we should always use the calling uid. // ACTION_REQUEST_SET_AUTOFILL_SERVICE and we should always use the calling uid.
mUserId = UserHandle.myUserId(); mIntentSenderUserId = UserHandle.myUserId();
} }
getUser();
mSettingsPackageMonitor.register(activity, activity.getMainLooper(), false); mSettingsPackageMonitor.register(activity, activity.getMainLooper(), false);
update(); update();
} }
@@ -167,7 +168,7 @@ public class DefaultCombinedPicker extends DefaultAppPickerFragment {
Settings.Secure.getStringForUser( Settings.Secure.getStringForUser(
getActivity().getContentResolver(), getActivity().getContentResolver(),
Settings.Secure.AUTOFILL_SERVICE_SEARCH_URI, Settings.Secure.AUTOFILL_SERVICE_SEARCH_URI,
mUserId); getUser());
if (TextUtils.isEmpty(searchUri)) { if (TextUtils.isEmpty(searchUri)) {
return null; return null;
} }
@@ -177,7 +178,7 @@ public class DefaultCombinedPicker extends DefaultAppPickerFragment {
final Preference preference = new Preference(context); final Preference preference = new Preference(context);
preference.setOnPreferenceClickListener( preference.setOnPreferenceClickListener(
p -> { p -> {
context.startActivityAsUser(addNewServiceIntent, UserHandle.of(mUserId)); context.startActivityAsUser(addNewServiceIntent, UserHandle.of(getUser()));
return true; return true;
}); });
preference.setTitle(R.string.print_menu_item_add_service); preference.setTitle(R.string.print_menu_item_add_service);
@@ -212,17 +213,17 @@ public class DefaultCombinedPicker extends DefaultAppPickerFragment {
private List<CombinedProviderInfo> getAllProviders() { private List<CombinedProviderInfo> getAllProviders() {
final Context context = getContext(); final Context context = getContext();
final List<AutofillServiceInfo> autofillProviders = final List<AutofillServiceInfo> autofillProviders =
AutofillServiceInfo.getAvailableServices(context, mUserId); AutofillServiceInfo.getAvailableServices(context, getUser());
final CredentialManager service = getCredentialProviderService(); final CredentialManager service = getCredentialProviderService();
final List<CredentialProviderInfo> credManProviders = new ArrayList<>(); final List<CredentialProviderInfo> credManProviders = new ArrayList<>();
if (service != null) { if (service != null) {
credManProviders.addAll( credManProviders.addAll(
service.getCredentialProviderServices( service.getCredentialProviderServices(
mUserId, CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_ONLY)); getUser(), CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_ONLY));
} }
final String selectedAutofillProvider = getSelectedAutofillProvider(context, mUserId); final String selectedAutofillProvider = getSelectedAutofillProvider(context, getUser());
return CombinedProviderInfo.buildMergedList( return CombinedProviderInfo.buildMergedList(
autofillProviders, credManProviders, selectedAutofillProvider); autofillProviders, credManProviders, selectedAutofillProvider);
} }
@@ -244,7 +245,7 @@ public class DefaultCombinedPicker extends DefaultAppPickerFragment {
new DefaultAppInfo( new DefaultAppInfo(
context, context,
mPm, mPm,
mUserId, getUser(),
cpi.getApplicationInfo(), cpi.getApplicationInfo(),
cpi.getSettingsSubtitle(), cpi.getSettingsSubtitle(),
true)); true));
@@ -253,7 +254,7 @@ public class DefaultCombinedPicker extends DefaultAppPickerFragment {
new DefaultAppInfo( new DefaultAppInfo(
context, context,
mPm, mPm,
mUserId, getUser(),
brandingService, brandingService,
cpi.getSettingsSubtitle(), cpi.getSettingsSubtitle(),
true)); true));
@@ -350,7 +351,7 @@ public class DefaultCombinedPicker extends DefaultAppPickerFragment {
} }
Settings.Secure.putStringForUser( Settings.Secure.putStringForUser(
getContext().getContentResolver(), AUTOFILL_SETTING, autofillProvider, mUserId); getContext().getContentResolver(), AUTOFILL_SETTING, autofillProvider, getUser());
final CredentialManager service = getCredentialProviderService(); final CredentialManager service = getCredentialProviderService();
if (service == null) { if (service == null) {
@@ -362,7 +363,7 @@ public class DefaultCombinedPicker extends DefaultAppPickerFragment {
final List<String> credManProviders = new ArrayList<>(); final List<String> credManProviders = new ArrayList<>();
for (CredentialProviderInfo cpi : for (CredentialProviderInfo cpi :
service.getCredentialProviderServices( service.getCredentialProviderServices(
mUserId, CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_ONLY)) { getUser(), CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_ONLY)) {
if (cpi.isEnabled() && !cpi.isPrimary()) { if (cpi.isEnabled() && !cpi.isPrimary()) {
credManProviders.add(cpi.getServiceInfo().getComponentName().flattenToString()); credManProviders.add(cpi.getServiceInfo().getComponentName().flattenToString());
@@ -379,7 +380,7 @@ public class DefaultCombinedPicker extends DefaultAppPickerFragment {
service.setEnabledProviders( service.setEnabledProviders(
primaryCredManProviders, primaryCredManProviders,
credManProviders, credManProviders,
mUserId, getUser(),
ContextCompat.getMainExecutor(getContext()), ContextCompat.getMainExecutor(getContext()),
new OutcomeReceiver<Void, SetEnabledProvidersException>() { new OutcomeReceiver<Void, SetEnabledProvidersException>() {
@Override @Override
@@ -393,4 +394,11 @@ public class DefaultCombinedPicker extends DefaultAppPickerFragment {
} }
}); });
} }
protected int getUser() {
if (mIntentSenderUserId >= 0) {
return mIntentSenderUserId;
}
return UserHandle.myUserId();
}
} }

View File

@@ -0,0 +1,31 @@
/*
* 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.settings.applications.credentials;
import android.os.UserHandle;
import android.os.UserManager;
import com.android.settings.Utils;
public class DefaultCombinedPickerWork extends DefaultCombinedPicker {
@Override
protected int getUser() {
UserHandle workProfile = Utils.getManagedProfile(UserManager.get(getContext()));
return workProfile.getIdentifier();
}
}

View File

@@ -24,6 +24,7 @@ import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo; import android.content.pm.ServiceInfo;
import android.credentials.CredentialManager; import android.credentials.CredentialManager;
import android.credentials.CredentialProviderInfo; import android.credentials.CredentialProviderInfo;
import android.os.UserHandle;
import android.provider.Settings; import android.provider.Settings;
import android.service.autofill.AutofillService; import android.service.autofill.AutofillService;
import android.service.autofill.AutofillServiceInfo; import android.service.autofill.AutofillServiceInfo;
@@ -75,13 +76,13 @@ public class DefaultCombinedPreferenceController extends DefaultAppPreferenceCon
return null; return null;
} }
final AutofillSettingIntentProvider intentProvider = final AutofillSettingIntentProvider intentProvider =
new AutofillSettingIntentProvider(mContext, mUserId, info.getKey()); new AutofillSettingIntentProvider(mContext, getUser(), info.getKey());
return intentProvider.getIntent(); return intentProvider.getIntent();
} }
@Override @Override
protected DefaultAppInfo getDefaultAppInfo() { protected DefaultAppInfo getDefaultAppInfo() {
List<CombinedProviderInfo> providers = getAllProviders(mUserId); List<CombinedProviderInfo> providers = getAllProviders(getUser());
CombinedProviderInfo topProvider = CombinedProviderInfo.getTopProvider(providers); CombinedProviderInfo topProvider = CombinedProviderInfo.getTopProvider(providers);
if (topProvider != null) { if (topProvider != null) {
ServiceInfo brandingService = topProvider.getBrandingService(); ServiceInfo brandingService = topProvider.getBrandingService();
@@ -89,7 +90,7 @@ public class DefaultCombinedPreferenceController extends DefaultAppPreferenceCon
return new DefaultAppInfo( return new DefaultAppInfo(
mContext, mContext,
mPackageManager, mPackageManager,
mUserId, getUser(),
topProvider.getApplicationInfo(), topProvider.getApplicationInfo(),
topProvider.getSettingsSubtitle(), topProvider.getSettingsSubtitle(),
true); true);
@@ -97,7 +98,7 @@ public class DefaultCombinedPreferenceController extends DefaultAppPreferenceCon
return new DefaultAppInfo( return new DefaultAppInfo(
mContext, mContext,
mPackageManager, mPackageManager,
mUserId, getUser(),
brandingService, brandingService,
topProvider.getSettingsSubtitle(), topProvider.getSettingsSubtitle(),
true); true);
@@ -178,4 +179,8 @@ public class DefaultCombinedPreferenceController extends DefaultAppPreferenceCon
return null; return null;
} }
} }
protected int getUser() {
return UserHandle.myUserId();
}
} }

View File

@@ -44,7 +44,7 @@ public class DefaultWorkCombinedPreferenceController extends DefaultCombinedPref
@Override @Override
public String getPreferenceKey() { public String getPreferenceKey() {
return "default_autofill_work"; return "default_credman_autofill_main_work";
} }
@Override @Override
@@ -81,4 +81,9 @@ public class DefaultWorkCombinedPreferenceController extends DefaultCombinedPref
protected void startActivity(Intent intent) { protected void startActivity(Intent intent) {
mContext.startActivityAsUser(intent, mUserHandle); mContext.startActivityAsUser(intent, mUserHandle);
} }
@Override
protected int getUser() {
return mUserHandle.getIdentifier();
}
} }