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;
+    }
 }