Fix work profile issue

Test: manual
Bug: 281332256
Change-Id: I5f47aacc84e5abe739ecc3bbad474957334e7c91
This commit is contained in:
Becca Hughes
2023-05-08 17:43:20 +00:00
parent 2971c13923
commit ad13689915
10 changed files with 91 additions and 32 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -41,6 +41,7 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.OutcomeReceiver;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
import android.service.autofill.AutofillServiceInfo;
import android.text.TextUtils;
@@ -110,6 +111,7 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
private @Nullable PreferenceScreen mPreferenceScreen = null;
private boolean mVisibility = false;
private boolean mIsWorkProfile = false;
public CredentialManagerPreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
@@ -169,14 +171,17 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
* @param fragmentManager the fragment manager to use
* @param intent the intent used to start the activity
* @param delegate the delegate to send results back to
* @param isWorkProfile whether this controller is under a work profile user
*/
public void init(
DashboardFragment fragment,
FragmentManager fragmentManager,
@Nullable Intent launchIntent,
@NonNull Delegate delegate) {
@NonNull Delegate delegate,
boolean isWorkProfile) {
fragment.getSettingsLifecycle().addObserver(this);
mFragmentManager = fragmentManager;
mIsWorkProfile = isWorkProfile;
setDelegate(delegate);
verifyReceivedIntent(launchIntent);
}
@@ -420,7 +425,7 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
continue;
}
Drawable icon = combinedInfo.getAppIcon(context);
Drawable icon = combinedInfo.getAppIcon(context, getUser());
CharSequence title = combinedInfo.getAppName(context);
// 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);
}
private int getUser() {
UserHandle workUser = getWorkProfileUser();
return workUser != null ? workUser.getIdentifier() : UserHandle.myUserId();
protected int getUser() {
if (mIsWorkProfile) {
UserHandle workProfile = Utils.getManagedProfile(UserManager.get(mContext));
return workProfile.getIdentifier();
}
return UserHandle.myUserId();
}
/** 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 java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class DefaultCombinedPicker extends DefaultAppPickerFragment {
@@ -65,6 +63,7 @@ public class DefaultCombinedPicker extends DefaultAppPickerFragment {
private DialogInterface.OnClickListener mCancelListener;
private CredentialManager mCredentialManager;
private int mIntentSenderUserId = -1;
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -79,9 +78,11 @@ public class DefaultCombinedPicker extends DefaultAppPickerFragment {
};
// If mCancelListener is not null, fragment is started from
// 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);
update();
}
@@ -167,7 +168,7 @@ public class DefaultCombinedPicker extends DefaultAppPickerFragment {
Settings.Secure.getStringForUser(
getActivity().getContentResolver(),
Settings.Secure.AUTOFILL_SERVICE_SEARCH_URI,
mUserId);
getUser());
if (TextUtils.isEmpty(searchUri)) {
return null;
}
@@ -177,7 +178,7 @@ public class DefaultCombinedPicker extends DefaultAppPickerFragment {
final Preference preference = new Preference(context);
preference.setOnPreferenceClickListener(
p -> {
context.startActivityAsUser(addNewServiceIntent, UserHandle.of(mUserId));
context.startActivityAsUser(addNewServiceIntent, UserHandle.of(getUser()));
return true;
});
preference.setTitle(R.string.print_menu_item_add_service);
@@ -212,17 +213,17 @@ public class DefaultCombinedPicker extends DefaultAppPickerFragment {
private List<CombinedProviderInfo> getAllProviders() {
final Context context = getContext();
final List<AutofillServiceInfo> autofillProviders =
AutofillServiceInfo.getAvailableServices(context, mUserId);
AutofillServiceInfo.getAvailableServices(context, getUser());
final CredentialManager service = getCredentialProviderService();
final List<CredentialProviderInfo> credManProviders = new ArrayList<>();
if (service != null) {
credManProviders.addAll(
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(
autofillProviders, credManProviders, selectedAutofillProvider);
}
@@ -244,7 +245,7 @@ public class DefaultCombinedPicker extends DefaultAppPickerFragment {
new DefaultAppInfo(
context,
mPm,
mUserId,
getUser(),
cpi.getApplicationInfo(),
cpi.getSettingsSubtitle(),
true));
@@ -253,7 +254,7 @@ public class DefaultCombinedPicker extends DefaultAppPickerFragment {
new DefaultAppInfo(
context,
mPm,
mUserId,
getUser(),
brandingService,
cpi.getSettingsSubtitle(),
true));
@@ -350,7 +351,7 @@ public class DefaultCombinedPicker extends DefaultAppPickerFragment {
}
Settings.Secure.putStringForUser(
getContext().getContentResolver(), AUTOFILL_SETTING, autofillProvider, mUserId);
getContext().getContentResolver(), AUTOFILL_SETTING, autofillProvider, getUser());
final CredentialManager service = getCredentialProviderService();
if (service == null) {
@@ -362,7 +363,7 @@ public class DefaultCombinedPicker extends DefaultAppPickerFragment {
final List<String> credManProviders = new ArrayList<>();
for (CredentialProviderInfo cpi :
service.getCredentialProviderServices(
mUserId, CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_ONLY)) {
getUser(), CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_ONLY)) {
if (cpi.isEnabled()) {
credManProviders.add(cpi.getServiceInfo().getComponentName().flattenToString());
@@ -374,7 +375,7 @@ public class DefaultCombinedPicker extends DefaultAppPickerFragment {
service.setEnabledProviders(
primaryCredManProviders,
credManProviders,
mUserId,
getUser(),
ContextCompat.getMainExecutor(getContext()),
new OutcomeReceiver<Void, SetEnabledProvidersException>() {
@Override
@@ -388,4 +389,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.credentials.CredentialManager;
import android.credentials.CredentialProviderInfo;
import android.os.UserHandle;
import android.provider.Settings;
import android.service.autofill.AutofillService;
import android.service.autofill.AutofillServiceInfo;
@@ -75,13 +76,13 @@ public class DefaultCombinedPreferenceController extends DefaultAppPreferenceCon
return null;
}
final AutofillSettingIntentProvider intentProvider =
new AutofillSettingIntentProvider(mContext, mUserId, info.getKey());
new AutofillSettingIntentProvider(mContext, getUser(), info.getKey());
return intentProvider.getIntent();
}
@Override
protected DefaultAppInfo getDefaultAppInfo() {
List<CombinedProviderInfo> providers = getAllProviders(mUserId);
List<CombinedProviderInfo> providers = getAllProviders(getUser());
CombinedProviderInfo topProvider = CombinedProviderInfo.getTopProvider(providers);
if (topProvider != null) {
ServiceInfo brandingService = topProvider.getBrandingService();
@@ -89,7 +90,7 @@ public class DefaultCombinedPreferenceController extends DefaultAppPreferenceCon
return new DefaultAppInfo(
mContext,
mPackageManager,
mUserId,
getUser(),
topProvider.getApplicationInfo(),
topProvider.getSettingsSubtitle(),
true);
@@ -97,7 +98,7 @@ public class DefaultCombinedPreferenceController extends DefaultAppPreferenceCon
return new DefaultAppInfo(
mContext,
mPackageManager,
mUserId,
getUser(),
brandingService,
topProvider.getSettingsSubtitle(),
true);
@@ -178,4 +179,8 @@ public class DefaultCombinedPreferenceController extends DefaultAppPreferenceCon
return null;
}
}
protected int getUser() {
return UserHandle.myUserId();
}
}

View File

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