Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 39dd48cc authored by Ugo Yu's avatar Ugo Yu Committed by android-build-merger
Browse files

Merge "Bluetooth database log clean up"

am: 5943d480

Change-Id: I79b9f2e39822e4d850918bd276ddbadc47d8afd1
parents a74f0fce 5943d480
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := \
        services.net \
        libprotobuf-java-lite \
        bluetooth-protos-lite \
        guava \

LOCAL_STATIC_ANDROID_LIBRARIES := \
        androidx.core_core \
+13 −2
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@

package com.android.bluetooth;

import android.app.ActivityManager;
import android.app.AppOpsManager;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
@@ -41,7 +40,9 @@ import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.util.List;
import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

@@ -468,4 +469,14 @@ public final class Utils {
    public static String getUidPidString() {
        return "uid/pid=" + Binder.getCallingUid() + "/" + Binder.getCallingPid();
    }

    /**
     * Get system local time
     *
     * @return "MM-dd HH:mm:ss.SSS"
     */
    public static String getLocalTimeString() {
        return DateTimeFormatter.ofPattern("MM-dd HH:mm:ss.SSS")
                .withZone(ZoneId.systemDefault()).format(Instant.now());
    }
}
+1 −0
Original line number Diff line number Diff line
@@ -3282,6 +3282,7 @@ public class AdapterService extends Service {
            profile.dump(sb);
        }
        mSilenceDeviceManager.dump(fd, writer, args);
        mDatabaseManager.dump(writer);

        writer.write(sb.toString());
        writer.flush();
+47 −0
Original line number Diff line number Diff line
@@ -37,4 +37,51 @@ class CustomizedMetadataEntity {
    public byte[] untethered_right_charging;
    public byte[] untethered_case_charging;
    public byte[] enhanced_settings_ui_uri;

    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append("manufacturer_name=")
                .append(metadataToString(manufacturer_name))
                .append("|model_name=")
                .append(metadataToString(model_name))
                .append("|software_version=")
                .append(metadataToString(software_version))
                .append("|hardware_version=")
                .append(metadataToString(hardware_version))
                .append("|companion_app=")
                .append(metadataToString(companion_app))
                .append("|main_icon=")
                .append(metadataToString(main_icon))
                .append("|is_untethered_headset=")
                .append(metadataToString(is_untethered_headset))
                .append("|untethered_left_icon=")
                .append(metadataToString(untethered_left_icon))
                .append("|untethered_right_icon=")
                .append(metadataToString(untethered_right_icon))
                .append("|untethered_case_icon=")
                .append(metadataToString(untethered_case_icon))
                .append("|untethered_left_battery=")
                .append(metadataToString(untethered_left_battery))
                .append("|untethered_right_battery=")
                .append(metadataToString(untethered_right_battery))
                .append("|untethered_case_battery=")
                .append(metadataToString(untethered_case_battery))
                .append("|untethered_left_charging=")
                .append(metadataToString(untethered_left_charging))
                .append("|untethered_right_charging=")
                .append(metadataToString(untethered_right_charging))
                .append("|untethered_case_charging=")
                .append(metadataToString(untethered_case_charging))
                .append("|enhanced_settings_ui_uri=")
                .append(metadataToString(enhanced_settings_ui_uri));

        return builder.toString();
    }

    private String metadataToString(byte[] metadata) {
        if (metadata == null) {
            return null;
        }
        return new String(metadata);
    }
}
+58 −44
Original line number Diff line number Diff line
@@ -39,6 +39,9 @@ import com.android.bluetooth.Utils;
import com.android.bluetooth.btservice.AdapterService;
import com.android.internal.annotations.VisibleForTesting;

import com.google.common.collect.EvictingQueue;

import java.io.PrintWriter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
@@ -52,8 +55,6 @@ import java.util.concurrent.TimeUnit;
 * for Bluetooth persistent data.
 */
public class DatabaseManager {
    private static final boolean DBG = true;
    private static final boolean VERBOSE = true;
    private static final String TAG = "BluetoothDatabase";

    private AdapterService mAdapterService = null;
@@ -65,6 +66,8 @@ public class DatabaseManager {
    @VisibleForTesting
    final Map<String, Metadata> mMetadataCache = new HashMap<>();
    private final Semaphore mSemaphore = new Semaphore(1);
    private static final int METADATA_CHANGED_LOG_MAX_SIZE = 20;
    private final EvictingQueue<String> mMetadataChangedLog;

    private static final int LOAD_DATABASE_TIMEOUT = 500; // milliseconds
    private static final int MSG_LOAD_DATABASE = 0;
@@ -78,6 +81,7 @@ public class DatabaseManager {
     */
    public DatabaseManager(AdapterService service) {
        mAdapterService = service;
        mMetadataChangedLog = EvictingQueue.create(METADATA_CHANGED_LOG_MAX_SIZE);
    }

    class DatabaseHandler extends Handler {
@@ -218,21 +222,17 @@ public class DatabaseManager {
            }

            String address = device.getAddress();
            if (VERBOSE) {
                Log.d(TAG, "setCustomMeta: " + address + ", key=" + key);
            }
            if (!mMetadataCache.containsKey(address)) {
                createMetadata(address);
            }
            Metadata data = mMetadataCache.get(address);
            byte[] oldValue = data.getCustomizedMeta(key);
            if (oldValue != null && Arrays.equals(oldValue, newValue)) {
                if (VERBOSE) {
                    Log.d(TAG, "setCustomMeta: metadata not changed.");
                }
                Log.v(TAG, "setCustomMeta: metadata not changed.");
                return true;
            }
            logManufacturerInfo(device, key, newValue);
            logMetadataChange(address, "setCustomMeta key=" + key);
            data.setCustomizedMeta(key, newValue);

            updateDatabase(data);
@@ -259,7 +259,7 @@ public class DatabaseManager {
            String address = device.getAddress();

            if (!mMetadataCache.containsKey(address)) {
                Log.e(TAG, "getCustomMeta: device " + address + " is not in cache");
                Log.d(TAG, "getCustomMeta: device " + address + " is not in cache");
                return null;
            }

@@ -302,10 +302,6 @@ public class DatabaseManager {
            }

            String address = device.getAddress();
            if (VERBOSE) {
                Log.v(TAG, "setProfilePriority: " + address + ", profile=" + profile
                        + ", priority = " + newPriority);
            }
            if (!mMetadataCache.containsKey(address)) {
                if (newPriority == BluetoothProfile.PRIORITY_UNDEFINED) {
                    return true;
@@ -315,11 +311,12 @@ public class DatabaseManager {
            Metadata data = mMetadataCache.get(address);
            int oldPriority = data.getProfilePriority(profile);
            if (oldPriority == newPriority) {
                if (VERBOSE) {
                Log.v(TAG, "setProfilePriority priority not changed.");
                }
                return true;
            }
            String profileStr = BluetoothProfile.getProfileName(profile);
            logMetadataChange(address, profileStr + " priority changed: "
                    + ": " + oldPriority + " -> " + newPriority);

            data.setProfilePriority(profile, newPriority);
            updateDatabase(data);
@@ -355,16 +352,14 @@ public class DatabaseManager {
            String address = device.getAddress();

            if (!mMetadataCache.containsKey(address)) {
                Log.e(TAG, "getProfilePriority: device " + address + " is not in cache");
                Log.d(TAG, "getProfilePriority: device " + address + " is not in cache");
                return BluetoothProfile.PRIORITY_UNDEFINED;
            }

            Metadata data = mMetadataCache.get(address);
            int priority = data.getProfilePriority(profile);
            if (VERBOSE) {
            Log.v(TAG, "getProfilePriority: " + address + ", profile=" + profile
                    + ", priority = " + priority);
            }
            return priority;
        }
    }
@@ -402,6 +397,8 @@ public class DatabaseManager {
            if (oldValue == newValue) {
                return;
            }
            logMetadataChange(address, "Supports optional codec changed: "
                    + oldValue + " -> " + newValue);

            data.a2dpSupportsOptionalCodecs = newValue;
            updateDatabase(data);
@@ -428,7 +425,7 @@ public class DatabaseManager {
            String address = device.getAddress();

            if (!mMetadataCache.containsKey(address)) {
                Log.e(TAG, "getA2dpOptionalCodec: device " + address + " is not in cache");
                Log.d(TAG, "getA2dpOptionalCodec: device " + address + " is not in cache");
                return BluetoothA2dp.OPTIONAL_CODECS_SUPPORT_UNKNOWN;
            }

@@ -470,6 +467,8 @@ public class DatabaseManager {
            if (oldValue == newValue) {
                return;
            }
            logMetadataChange(address, "Enable optional codec changed: "
                    + oldValue + " -> " + newValue);

            data.a2dpOptionalCodecsEnabled = newValue;
            updateDatabase(data);
@@ -496,7 +495,7 @@ public class DatabaseManager {
            String address = device.getAddress();

            if (!mMetadataCache.containsKey(address)) {
                Log.e(TAG, "getA2dpOptionalCodecEnabled: device " + address + " is not in cache");
                Log.d(TAG, "getA2dpOptionalCodecEnabled: device " + address + " is not in cache");
                return BluetoothA2dp.OPTIONAL_CODECS_PREF_UNKNOWN;
            }

@@ -525,10 +524,7 @@ public class DatabaseManager {
     * @param database the Bluetooth storage {@link MetadataDatabase}
     */
    public void start(MetadataDatabase database) {
        if (DBG) {
        Log.d(TAG, "start()");
        }

        if (mAdapterService == null) {
            Log.e(TAG, "stat failed, mAdapterService is null.");
            return;
@@ -582,12 +578,10 @@ public class DatabaseManager {
    }

    void createMetadata(String address) {
        if (VERBOSE) {
            Log.v(TAG, "createMetadata " + address);
        }
        Metadata data = new Metadata(address);
        mMetadataCache.put(address, data);
        updateDatabase(data);
        logMetadataChange(address, "Metadata created");
    }

    @VisibleForTesting
@@ -623,14 +617,10 @@ public class DatabaseManager {
            mMigratedFromSettingsGlobal = true;
            for (Metadata data : list) {
                String address = data.getAddress();
                if (VERBOSE) {
                Log.v(TAG, "cacheMetadata: found device " + address);
                }
                mMetadataCache.put(address, data);
            }
            if (VERBOSE) {
                Log.v(TAG, "cacheMetadata: Database is ready");
            }
            Log.i(TAG, "cacheMetadata: Database is ready");
        }
    }

@@ -726,9 +716,7 @@ public class DatabaseManager {
    }

    private void loadDatabase() {
        if (DBG) {
        Log.d(TAG, "Load Database");
        }
        Message message = mHandler.obtainMessage(MSG_LOAD_DATABASE);
        mHandler.sendMessage(message);
        try {
@@ -744,20 +732,19 @@ public class DatabaseManager {
            Log.e(TAG, "updateDatabase: address is null");
            return;
        }
        if (DBG) {
        Log.d(TAG, "updateDatabase " + data.getAddress());
        }
        Message message = mHandler.obtainMessage(MSG_UPDATE_DATABASE);
        message.obj = data;
        mHandler.sendMessage(message);
    }

    private void deleteDatabase(Metadata data) {
        if (data.getAddress() == null) {
        String address = data.getAddress();
        if (address == null) {
            Log.e(TAG, "deleteDatabase: address is null");
            return;
        }
        Log.d(TAG, "deleteDatabase: " + data.getAddress());
        logMetadataChange(address, "Metadata deleted");
        Message message = mHandler.obtainMessage(MSG_DELETE_DATABASE);
        message.obj = data.getAddress();
        mHandler.sendMessage(message);
@@ -793,4 +780,31 @@ public class DatabaseManager {
                BluetoothProtoEnums.DEVICE_INFO_EXTERNAL, callingApp, manufacturerName, modelName,
                hardwareVersion, softwareVersion);
    }

    private void logMetadataChange(String address, String log) {
        String time = Utils.getLocalTimeString();
        String uidPid = Utils.getUidPidString();
        mMetadataChangedLog.add(time + " (" + uidPid + ") " + address + " " + log);
    }

    /**
     * Dump database info to a PrintWriter
     *
     * @param writer the PrintWriter to write log
     */
    public void dump(PrintWriter writer) {
        writer.println("\nBluetoothDatabase:");
        writer.println("  Metadata Changes:");
        for (String log : mMetadataChangedLog) {
            writer.println("    " + log);
        }
        writer.println("\nMetadata:");
        for (HashMap.Entry<String, Metadata> entry : mMetadataCache.entrySet()) {
            if (entry.getKey().equals(LOCAL_STORAGE)) {
                // No need to dump local storage
                continue;
            }
            writer.println("    " + entry.getValue());
        }
    }
}
Loading