Removing last BluetoothManagerService hidden APIs
Tag: #feature
Test: manual
Bug: 211851706
Ignore-AOSP-First: changes only in internal
Change-Id: I598de43d8889429355eafcd34886a4eefd6bfc67
diff --git a/android/app/src/com/android/bluetooth/Utils.java b/android/app/src/com/android/bluetooth/Utils.java
index 2cdabc3..a6fa589 100644
--- a/android/app/src/com/android/bluetooth/Utils.java
+++ b/android/app/src/com/android/bluetooth/Utils.java
@@ -22,10 +22,10 @@
import static android.Manifest.permission.BLUETOOTH_CONNECT;
import static android.Manifest.permission.BLUETOOTH_SCAN;
import static android.Manifest.permission.RENOUNCE_PERMISSIONS;
-import static android.content.PermissionChecker.PERMISSION_HARD_DENIED;
import static android.content.pm.PackageManager.GET_PERMISSIONS;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.os.PowerExemptionManager.TEMPORARY_ALLOW_LIST_TYPE_FOREGROUND_SERVICE_ALLOWED;
+import static android.permission.PermissionManager.PERMISSION_HARD_DENIED;
import android.Manifest;
import android.annotation.NonNull;
diff --git a/android/app/src/com/android/bluetooth/btservice/AdapterService.java b/android/app/src/com/android/bluetooth/btservice/AdapterService.java
index 8edbdb2..a662553 100644
--- a/android/app/src/com/android/bluetooth/btservice/AdapterService.java
+++ b/android/app/src/com/android/bluetooth/btservice/AdapterService.java
@@ -46,6 +46,7 @@
import android.bluetooth.BluetoothAdapter.ActiveDeviceUse;
import android.bluetooth.BluetoothClass;
import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothFrameworkInitializer;
import android.bluetooth.BluetoothProfile;
import android.bluetooth.BluetoothProtoEnums;
import android.bluetooth.BluetoothServerSocket;
@@ -129,7 +130,6 @@
import com.android.bluetooth.vc.VolumeControlService;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.os.BinderCallsStats;
import com.android.modules.utils.BackgroundThread;
import com.android.modules.utils.BytesMatcher;
@@ -324,8 +324,6 @@
private CsipSetCoordinatorService mCsipSetCoordinatorService;
private LeAudioService mLeAudioService;
- private BinderCallsStats.SettingsObserver mBinderCallsSettingsObserver;
-
private volatile boolean mTestModeEnabled = false;
private MetricsLogger mMetricsLogger;
@@ -486,11 +484,7 @@
int configCompareResult = mBluetoothKeystoreService.getCompareResult();
// Start tracking Binder latency for the bluetooth process.
- mBinderCallsSettingsObserver = new BinderCallsStats.SettingsObserver(
- getApplicationContext(),
- new BinderCallsStats(
- new BinderCallsStats.Injector(),
- com.android.internal.os.BinderLatencyProto.Dims.BLUETOOTH));
+ BluetoothFrameworkInitializer.initializeBinderCallsStats(getApplicationContext());
// Android TV doesn't show consent dialogs for just works and encryption only le pairing
boolean isAtvDevice = getApplicationContext().getPackageManager().hasSystemFeature(
diff --git a/android/app/src/com/android/bluetooth/btservice/Config.java b/android/app/src/com/android/bluetooth/btservice/Config.java
index d1aad20..1d2938c 100644
--- a/android/app/src/com/android/bluetooth/btservice/Config.java
+++ b/android/app/src/com/android/bluetooth/btservice/Config.java
@@ -240,7 +240,7 @@
}
private static boolean isHearingAidSettingsEnabled(Context context) {
- final String flagOverridePrefix = "sys.fflag.override.";
+ final String flagOverridePrefix = "persist.sys.fflag.override.";
final String hearingAidSettings = "settings_bluetooth_hearing_aid";
// Override precedence:
diff --git a/android/app/src/com/android/bluetooth/map/BluetoothMapSmsPdu.java b/android/app/src/com/android/bluetooth/map/BluetoothMapSmsPdu.java
index 5323d7c..137dc91 100644
--- a/android/app/src/com/android/bluetooth/map/BluetoothMapSmsPdu.java
+++ b/android/app/src/com/android/bluetooth/map/BluetoothMapSmsPdu.java
@@ -24,7 +24,6 @@
import android.util.Log;
import com.android.bluetooth.util.GsmAlphabet;
-import com.android.internal.telephony.SmsConstants;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
@@ -780,4 +779,64 @@
return tableValue;
}
+ private static class SmsConstants {
+ /** User data text encoding code unit size */
+ public static final int ENCODING_UNKNOWN = 0;
+ public static final int ENCODING_7BIT = 1;
+ public static final int ENCODING_8BIT = 2;
+ public static final int ENCODING_16BIT = 3;
+
+ /** The maximum number of payload septets per message */
+ public static final int MAX_USER_DATA_SEPTETS = 160;
+
+ /**
+ * The maximum number of payload septets per message if a user data header
+ * is present. This assumes the header only contains the
+ * CONCATENATED_8_BIT_REFERENCE element.
+ */
+ public static final int MAX_USER_DATA_SEPTETS_WITH_HEADER = 153;
+
+ /**
+ * This value is not defined in global standard. Only in Korea, this is used.
+ */
+ public static final int ENCODING_KSC5601 = 4;
+
+ /** The maximum number of payload bytes per message */
+ public static final int MAX_USER_DATA_BYTES = 140;
+
+ /**
+ * The maximum number of payload bytes per message if a user data header
+ * is present. This assumes the header only contains the
+ * CONCATENATED_8_BIT_REFERENCE element.
+ */
+ public static final int MAX_USER_DATA_BYTES_WITH_HEADER = 134;
+
+ /**
+ * SMS Class enumeration.
+ * See TS 23.038.
+ */
+ public enum MessageClass{
+ UNKNOWN,
+ CLASS_0,
+ CLASS_1,
+ CLASS_2,
+ CLASS_3;
+ }
+
+ /**
+ * Indicates unknown format SMS message.
+ */
+ public static final String FORMAT_UNKNOWN = "unknown";
+
+ /**
+ * Indicates a 3GPP format SMS message.
+ */
+ public static final String FORMAT_3GPP = "3gpp";
+
+ /**
+ * Indicates a 3GPP2 format SMS message.
+ */
+ public static final String FORMAT_3GPP2 = "3gpp2";
+ }
+
}
diff --git a/service/java/com/android/server/bluetooth/BluetoothDeviceConfigListener.java b/service/java/com/android/server/bluetooth/BluetoothDeviceConfigListener.java
index 611a37d..49779c0 100644
--- a/service/java/com/android/server/bluetooth/BluetoothDeviceConfigListener.java
+++ b/service/java/com/android/server/bluetooth/BluetoothDeviceConfigListener.java
@@ -17,7 +17,7 @@
package com.android.server;
import android.provider.DeviceConfig;
-import android.util.Slog;
+import android.util.Log;
import java.util.ArrayList;
@@ -57,7 +57,7 @@
for (String name : properties.getKeyset()) {
flags.add(name + "='" + properties.getString(name, "") + "'");
}
- Slog.d(TAG, "onPropertiesChanged: " + String.join(",", flags));
+ Log.d(TAG, "onPropertiesChanged: " + String.join(",", flags));
}
boolean foundInit = false;
for (String name : properties.getKeyset()) {
diff --git a/service/java/com/android/server/bluetooth/BluetoothManagerService.java b/service/java/com/android/server/bluetooth/BluetoothManagerService.java
index e77a783..0c0e739 100644
--- a/service/java/com/android/server/bluetooth/BluetoothManagerService.java
+++ b/service/java/com/android/server/bluetooth/BluetoothManagerService.java
@@ -54,6 +54,7 @@
import android.content.ServiceConnection;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
import android.content.res.Resources;
import android.database.ContentObserver;
import android.os.Binder;
@@ -75,18 +76,18 @@
import android.provider.Settings.SettingNotFoundException;
import android.sysprop.BluetoothProperties;
import android.text.TextUtils;
-import android.util.FeatureFlagUtils;
import android.util.Log;
import android.util.proto.ProtoOutputStream;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.util.DumpUtils;
import com.android.internal.util.FrameworkStatsLog;
import java.io.FileDescriptor;
+import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.LinkedList;
+import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.NoSuchElementException;
@@ -499,12 +500,11 @@
mIsHearingAidProfileSupported =
BluetoothProperties.isProfileAshaCentralEnabled().orElse(false);
- // TODO: We need a more generic way to initialize the persist keys of FeatureFlagUtils
- String value = SystemProperties.get(FeatureFlagUtils.PERSIST_PREFIX + FeatureFlagUtils.HEARING_AID_SETTINGS);
+ String value = SystemProperties.get(
+ "persist.sys.fflag.override.settings_bluetooth_hearing_aid");
if (!TextUtils.isEmpty(value)) {
boolean isHearingAidEnabled = Boolean.parseBoolean(value);
Log.v(TAG, "set feature flag HEARING_AID_SETTINGS to " + isHearingAidEnabled);
- FeatureFlagUtils.setEnabled(context, FeatureFlagUtils.HEARING_AID_SETTINGS, isHearingAidEnabled);
if (isHearingAidEnabled && !mIsHearingAidProfileSupported) {
// Overwrite to enable support by FeatureFlag
mIsHearingAidProfileSupported = true;
@@ -2456,7 +2456,7 @@
}
boolean doBind(Intent intent, ServiceConnection conn, int flags, UserHandle user) {
- ComponentName comp = intent.resolveSystemService(mContext.getPackageManager(), 0);
+ ComponentName comp = resolveSystemService(intent, mContext.getPackageManager(), 0);
intent.setComponent(comp);
if (comp == null || !mContext.bindServiceAsUser(intent, conn, flags, user)) {
Log.e(TAG, "Fail to bind to: " + intent);
@@ -2681,7 +2681,7 @@
int state = enable ? FrameworkStatsLog.BLUETOOTH_ENABLED_STATE_CHANGED__STATE__ENABLED :
FrameworkStatsLog.BLUETOOTH_ENABLED_STATE_CHANGED__STATE__DISABLED;
- FrameworkStatsLog.write_non_chained(FrameworkStatsLog.BLUETOOTH_ENABLED_STATE_CHANGED,
+ FrameworkStatsLog.write_non_chained(1,
Binder.getCallingUid(), null, state, reason, packageName);
}
@@ -2791,7 +2791,8 @@
@Override
public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
- if (!DumpUtils.checkDumpPermission(mContext, TAG, writer)) {
+ if ((mContext.checkCallingOrSelfPermission(
+ android.Manifest.permission.DUMP) != PackageManager.PERMISSION_GRANTED)) {
return;
}
if ((args.length > 0) && args[0].startsWith("--proto")) {
@@ -2867,7 +2868,7 @@
}
private void dumpProto(FileDescriptor fd) {
- final ProtoOutputStream proto = new ProtoOutputStream(fd);
+ final ProtoOutputStream proto = new ProtoOutputStream(new FileOutputStream(fd));
proto.write(BluetoothManagerServiceDumpProto.ENABLED, isEnabled());
proto.write(BluetoothManagerServiceDumpProto.STATE, mState);
proto.write(BluetoothManagerServiceDumpProto.STATE_NAME,
@@ -2977,4 +2978,27 @@
PowerExemptionManager.REASON_BLUETOOTH_BROADCAST, "");
return bOptions.toBundle();
}
+
+ private ComponentName resolveSystemService(@NonNull Intent intent,
+ @NonNull PackageManager pm, int flags) {
+ List<ResolveInfo> results = pm.queryIntentServices(intent, flags);
+ if (results == null) {
+ return null;
+ }
+ ComponentName comp = null;
+ for (int i = 0; i < results.size(); i++) {
+ ResolveInfo ri = results.get(i);
+ if ((ri.serviceInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
+ continue;
+ }
+ ComponentName foundComp = new ComponentName(ri.serviceInfo.applicationInfo.packageName,
+ ri.serviceInfo.name);
+ if (comp != null) {
+ throw new IllegalStateException("Multiple system services handle " + intent
+ + ": " + comp + ", " + foundComp);
+ }
+ comp = foundComp;
+ }
+ return comp;
+ }
}