From 9827abaffec30865f73f6fc0eeda85adc3f4878f Mon Sep 17 00:00:00 2001 From: Rahul Arya Date: Fri, 8 Jul 2022 12:06:55 +0000 Subject: [PATCH] Fix admin enable/disable of Bluetooth file sharing This is an extremely partial fix for a mostly-broken feature. For fully-managed devices, this fixes the toggle for the file sharing option, by detecting which Bluetooth package should be used rather than just guessing. However, on work profiles, the file sharing option does not really work anyway, it just infinitely loads. In addition, it is not correctly disabled when Bluetooth stops, so the icon just remains but doesn't do anything. A full fix would add the enable/disable sequence for *work* UserHandles to BluetoothOppManager, so the LAUNCHER_ACTIVITY is properly enabled and disabled. In addition, it would fix the issue described in the linked bug to prevent infinite loading (dedicated bug: b/112625123). Tag: #stability Ignore-AOSP-First: For T? Bug: 237389774 Test: Manual, verifying the *badged* BT file sharing icon appears/disappears as needed Change-Id: I070987bc884947246c372c65691c4866ebd1e7c7 (cherry picked from commit 36362f254b029bd96d00705a141eff3345864b5b) Merged-In: I070987bc884947246c372c65691c4866ebd1e7c7 --- .../bluetooth/BluetoothManagerService.java | 65 ++++++++++++++----- 1 file changed, 49 insertions(+), 16 deletions(-) diff --git a/service/java/com/android/server/bluetooth/BluetoothManagerService.java b/service/java/com/android/server/bluetooth/BluetoothManagerService.java index 042a4353c5..dda3f04067 100644 --- a/service/java/com/android/server/bluetooth/BluetoothManagerService.java +++ b/service/java/com/android/server/bluetooth/BluetoothManagerService.java @@ -56,6 +56,7 @@ import android.content.IntentFilter; import android.content.ServiceConnection; import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.database.ContentObserver; @@ -2892,24 +2893,56 @@ private boolean isBluetoothDisallowed() { */ private void updateOppLauncherComponentState(UserHandle userHandle, boolean bluetoothSharingDisallowed) { - final ComponentName oppLauncherComponent = new ComponentName( - mContext.getPackageManager().getPackagesForUid(Process.BLUETOOTH_UID)[0], - "com.android.bluetooth.opp.BluetoothOppLauncherActivity"); - int newState; - if (bluetoothSharingDisallowed) { - newState = PackageManager.COMPONENT_ENABLED_STATE_DISABLED; - } else if (BluetoothProperties.isProfileOppEnabled().orElse(false)) { - newState = PackageManager.COMPONENT_ENABLED_STATE_ENABLED; - } else { - newState = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; - } try { - mContext.createContextAsUser(userHandle, 0) - .getPackageManager() - .setComponentEnabledSetting(oppLauncherComponent, newState, - PackageManager.DONT_KILL_APP); + int newState; + if (bluetoothSharingDisallowed) { + newState = PackageManager.COMPONENT_ENABLED_STATE_DISABLED; + } else if (BluetoothProperties.isProfileOppEnabled().orElse(false)) { + newState = PackageManager.COMPONENT_ENABLED_STATE_ENABLED; + } else { + newState = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; + } + + String launcherActivity = "com.android.bluetooth.opp.BluetoothOppLauncherActivity"; + + PackageManager packageManager = mContext.createContextAsUser(userHandle, 0) + .getPackageManager(); + var allPackages = packageManager.getPackagesForUid(Process.BLUETOOTH_UID); + for (String candidatePackage : allPackages) { + PackageInfo packageInfo; + try { + // note: we need the package manager for the SYSTEM user, not our userHandle + packageInfo = mContext.getPackageManager().getPackageInfo( + candidatePackage, + PackageManager.PackageInfoFlags.of(PackageManager.GET_ACTIVITIES)); + } catch (PackageManager.NameNotFoundException e) { + // ignore, try next package + Log.e(TAG, "Could not find package " + candidatePackage); + continue; + } catch (Exception e) { + Log.e(TAG, "Error while loading package" + e); + continue; + } + if (packageInfo.activities == null) { + continue; + } + for (var activity : packageInfo.activities) { + if (launcherActivity.equals(activity.name)) { + final ComponentName oppLauncherComponent = new ComponentName( + candidatePackage, launcherActivity + ); + packageManager.setComponentEnabledSetting( + oppLauncherComponent, newState, PackageManager.DONT_KILL_APP + ); + return; + } + } + } + + Log.e(TAG, + "Cannot toggle BluetoothOppLauncherActivity, could not find it in any package"); } catch (Exception e) { - // The component was not found, do nothing. + Log.e(TAG, "updateOppLauncherComponentState failed: " + e); } }