1 /* 2 * Copyright (C) 2019 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.car.settings.applications.managedomainurls; 18 19 import android.car.drivingstate.CarUxRestrictions; 20 import android.content.Context; 21 import android.content.pm.PackageManager; 22 import android.hardware.usb.IUsbManager; 23 import android.os.IBinder; 24 import android.os.RemoteException; 25 import android.os.ServiceManager; 26 27 import androidx.annotation.VisibleForTesting; 28 import androidx.preference.Preference; 29 30 import com.android.car.settings.R; 31 import com.android.car.settings.common.FragmentController; 32 import com.android.car.settings.common.Logger; 33 import com.android.settingslib.applications.AppUtils; 34 35 /** 36 * Business logic to reset a user preference for auto launching an app. 37 * 38 * <p>i.e. if a user has both NavigationAppA and NavigationAppB installed and NavigationAppA is set 39 * as the default navigation app, the user can reset that preference to pick a different default 40 * navigation app. 41 */ 42 public class ClearDefaultsPreferenceController extends 43 AppLaunchSettingsBasePreferenceController<Preference> { 44 45 private static final Logger LOG = new Logger(ClearDefaultsPreferenceController.class); 46 47 private final IUsbManager mUsbManager; 48 ClearDefaultsPreferenceController(Context context, String preferenceKey, FragmentController fragmentController, CarUxRestrictions uxRestrictions)49 public ClearDefaultsPreferenceController(Context context, String preferenceKey, 50 FragmentController fragmentController, CarUxRestrictions uxRestrictions) { 51 super(context, preferenceKey, fragmentController, uxRestrictions); 52 IBinder b = ServiceManager.getService(Context.USB_SERVICE); 53 mUsbManager = IUsbManager.Stub.asInterface(b); 54 } 55 56 @VisibleForTesting ClearDefaultsPreferenceController(Context context, String preferenceKey, FragmentController fragmentController, CarUxRestrictions uxRestrictions, PackageManager packageManager, IUsbManager iUsbManager)57 ClearDefaultsPreferenceController(Context context, String preferenceKey, 58 FragmentController fragmentController, CarUxRestrictions uxRestrictions, 59 PackageManager packageManager, IUsbManager iUsbManager) { 60 super(context, preferenceKey, fragmentController, uxRestrictions, packageManager); 61 mUsbManager = iUsbManager; 62 } 63 64 @Override getPreferenceType()65 protected Class<Preference> getPreferenceType() { 66 return Preference.class; 67 } 68 69 @Override updateState(Preference preference)70 protected void updateState(Preference preference) { 71 boolean autoLaunchEnabled = AppUtils.hasPreferredActivities(mPm, getPackageName()) 72 || isDefaultBrowser(getPackageName()) 73 || hasUsbDefaults(mUsbManager, getPackageName()); 74 75 preference.setEnabled(autoLaunchEnabled); 76 if (autoLaunchEnabled) { 77 preference.setTitle(R.string.auto_launch_reset_text); 78 preference.setSummary(R.string.auto_launch_enable_text); 79 } else { 80 preference.setTitle(R.string.auto_launch_disable_text); 81 preference.setSummary(null); 82 } 83 } 84 85 @Override handlePreferenceClicked(Preference preference)86 protected boolean handlePreferenceClicked(Preference preference) { 87 if (mUsbManager != null) { 88 int userId = getCurrentUserId(); 89 mPm.clearPackagePreferredActivities(getPackageName()); 90 if (isDefaultBrowser(getPackageName())) { 91 mPm.setDefaultBrowserPackageNameAsUser(/* packageName= */ null, userId); 92 } 93 try { 94 mUsbManager.clearDefaults(getPackageName(), userId); 95 } catch (RemoteException e) { 96 LOG.e("mUsbManager.clearDefaults", e); 97 } 98 refreshUi(); 99 } 100 return true; 101 } 102 isDefaultBrowser(String packageName)103 private boolean isDefaultBrowser(String packageName) { 104 String defaultBrowser = mPm.getDefaultBrowserPackageNameAsUser(getCurrentUserId()); 105 return packageName.equals(defaultBrowser); 106 } 107 hasUsbDefaults(IUsbManager usbManager, String packageName)108 private boolean hasUsbDefaults(IUsbManager usbManager, String packageName) { 109 try { 110 if (usbManager != null) { 111 return usbManager.hasDefaults(packageName, getCurrentUserId()); 112 } 113 } catch (RemoteException e) { 114 LOG.e("mUsbManager.hasDefaults", e); 115 } 116 return false; 117 } 118 } 119