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

Commit d478c3a2 authored by Xin Li's avatar Xin Li
Browse files

Merge 24Q4 into AOSP main

Bug: 370570306
Merged-In: I55c45289591e7e6939874c4b9c09251fd1ebb966
Change-Id: I2e95b90025f0b3bbe810106042a85b524253e726
parents 880b201d 3ba222fe
Loading
Loading
Loading
Loading
+21 −1
Original line number Diff line number Diff line
@@ -32,6 +32,8 @@

package com.android.bluetooth.opp;

import static android.os.UserHandle.myUserId;

import android.bluetooth.BluetoothProfile;
import android.bluetooth.BluetoothProtoEnums;
import android.content.ContentResolver;
@@ -41,6 +43,7 @@ import android.database.Cursor;
import android.database.sqlite.SQLiteException;
import android.net.Uri;
import android.provider.OpenableColumns;
import android.text.TextUtils;
import android.util.EventLog;
import android.util.Log;

@@ -53,12 +56,13 @@ import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Objects;

/**
 * This class stores information about a single sending file It will only be used for outbound
 * share.
 */
// Next tag value for ContentProfileErrorReportUtils.report(): 15
// Next tag value for ContentProfileErrorReportUtils.report(): 16
public class BluetoothOppSendFileInfo {
    private static final String TAG = "BluetoothOppSendFileInfo";

@@ -124,6 +128,16 @@ public class BluetoothOppSendFileInfo {
                return SEND_FILE_INFO_ERROR;
            }

            if (isContentUriForOtherUser(uri)) {
                Log.e(TAG, "Uri: " + uri + " is invalid for user " + myUserId());
                ContentProfileErrorReportUtils.report(
                        BluetoothProfile.OPP,
                        BluetoothProtoEnums.BLUETOOTH_OPP_SEND_FILE_INFO,
                        BluetoothStatsLog.BLUETOOTH_CONTENT_PROFILE_ERROR_REPORTED__TYPE__LOG_ERROR,
                        15);
                return SEND_FILE_INFO_ERROR;
            }

            contentType = contentResolver.getType(uri);
            Cursor metadataCursor;
            try {
@@ -353,6 +367,12 @@ public class BluetoothOppSendFileInfo {
        return new BluetoothOppSendFileInfo(fileName, contentType, length, is, 0);
    }

    private static boolean isContentUriForOtherUser(Uri uri) {
        String uriUserId = uri.getUserInfo();
        return !TextUtils.isEmpty(uriUserId)
                && !Objects.equals(uriUserId, String.valueOf(myUserId()));
    }

    private static long getStreamSize(FileInputStream is) throws IOException {
        long length = 0;
        byte[] unused = new byte[4096];
+106 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.bluetooth.opp;

import static android.os.UserHandle.myUserId;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.ArgumentMatchers.any;
@@ -119,6 +121,110 @@ public class BluetoothOppSendFileInfoTest {
        assertThat(info).isEqualTo(BluetoothOppSendFileInfo.SEND_FILE_INFO_ERROR);
    }

    @Test
    public void generateFileInfo_withContentUriForOtherUser_returnsSendFileInfoError()
            throws Exception {
        String type = "image/jpeg";
        Uri uri = buildContentUriWithEncodedAuthority((myUserId() + 1) + "@media");

        long fileLength = 1000;
        String fileName = "pic.jpg";

        FileInputStream fs = mock(FileInputStream.class);
        AssetFileDescriptor fd = mock(AssetFileDescriptor.class);
        doReturn(fileLength).when(fd).getLength();
        doReturn(fs).when(fd).createInputStream();

        doReturn(fd).when(mCallProxy).contentResolverOpenAssetFileDescriptor(any(), eq(uri), any());

        mCursor =
                new MatrixCursor(new String[] {OpenableColumns.DISPLAY_NAME, OpenableColumns.SIZE});
        mCursor.addRow(new Object[] {fileName, fileLength});

        doReturn(mCursor)
                .when(mCallProxy)
                .contentResolverQuery(any(), eq(uri), any(), any(), any(), any());

        BluetoothOppSendFileInfo info =
                BluetoothOppSendFileInfo.generateFileInfo(mContext, uri, type, true);

        assertThat(info).isEqualTo(BluetoothOppSendFileInfo.SEND_FILE_INFO_ERROR);
    }

    @Test
    public void generateFileInfo_withContentUriForImplicitUser_returnsInfoWithCorrectLength()
            throws Exception {
        String type = "image/jpeg";
        Uri uri = buildContentUriWithEncodedAuthority("media");

        long fileLength = 1000;
        String fileName = "pic.jpg";

        FileInputStream fs = mock(FileInputStream.class);
        AssetFileDescriptor fd = mock(AssetFileDescriptor.class);
        doReturn(fileLength).when(fd).getLength();
        doReturn(fs).when(fd).createInputStream();

        doReturn(fd).when(mCallProxy).contentResolverOpenAssetFileDescriptor(any(), eq(uri), any());

        mCursor =
                new MatrixCursor(new String[] {OpenableColumns.DISPLAY_NAME, OpenableColumns.SIZE});
        mCursor.addRow(new Object[] {fileName, fileLength});

        doReturn(mCursor)
                .when(mCallProxy)
                .contentResolverQuery(any(), eq(uri), any(), any(), any(), any());

        BluetoothOppSendFileInfo info =
                BluetoothOppSendFileInfo.generateFileInfo(mContext, uri, type, true);

        assertThat(info.mInputStream).isEqualTo(fs);
        assertThat(info.mFileName).isEqualTo(fileName);
        assertThat(info.mLength).isEqualTo(fileLength);
        assertThat(info.mStatus).isEqualTo(0);
    }

    @Test
    public void generateFileInfo_withContentUriForSameUser_returnsInfoWithCorrectLength()
            throws Exception {
        String type = "image/jpeg";
        Uri uri = buildContentUriWithEncodedAuthority(myUserId() + "@media");

        long fileLength = 1000;
        String fileName = "pic.jpg";

        FileInputStream fs = mock(FileInputStream.class);
        AssetFileDescriptor fd = mock(AssetFileDescriptor.class);
        doReturn(fileLength).when(fd).getLength();
        doReturn(fs).when(fd).createInputStream();

        doReturn(fd).when(mCallProxy).contentResolverOpenAssetFileDescriptor(any(), eq(uri), any());

        mCursor =
                new MatrixCursor(new String[] {OpenableColumns.DISPLAY_NAME, OpenableColumns.SIZE});
        mCursor.addRow(new Object[] {fileName, fileLength});

        doReturn(mCursor)
                .when(mCallProxy)
                .contentResolverQuery(any(), eq(uri), any(), any(), any(), any());

        BluetoothOppSendFileInfo info =
                BluetoothOppSendFileInfo.generateFileInfo(mContext, uri, type, true);

        assertThat(info.mInputStream).isEqualTo(fs);
        assertThat(info.mFileName).isEqualTo(fileName);
        assertThat(info.mLength).isEqualTo(fileLength);
        assertThat(info.mStatus).isEqualTo(0);
    }

    private static Uri buildContentUriWithEncodedAuthority(String authority) {
        return new Uri.Builder()
                .scheme("content")
                .encodedAuthority(authority)
                .path("external/images/media/1")
                .build();
    }

    @Test
    public void generateFileInfo_withoutPermissionForAccessingUri_returnsSendFileInfoError() {
        String type = "text/plain";
+19 −0
Original line number Diff line number Diff line
@@ -25,3 +25,22 @@ flag {
  }
}

flag {
  name: "btsec_check_valid_discovery_database"
  namespace: "bluetooth"
  description: "Check for a valid discovery database before using it, and don't set up a discovery database for a new HF client if one has already been defined for it"
  bug: "356201480"
  metadata {
    purpose: PURPOSE_BUGFIX
  }
}

flag {
  name: "le_enc_on_reconnection"
  namespace: "bluetooth"
  description: "Encrypt LE link on reconnection with bonded devices"
  bug: "356201480"
  metadata {
    purpose: PURPOSE_BUGFIX
  }
}
+1 −1
Original line number Diff line number Diff line
@@ -78,7 +78,7 @@ java_sdk_library {
        "//packages/modules/Bluetooth/service",
        "//packages/services/Car/car-builtin-lib",
        // TODO(240720385)
        "//packages/services/Car/tests/carservice_unit_test",
        "//packages/services/Car/tests/CarBuiltinLibUnitTest",
        ":__subpackages__",
    ],

+19 −7
Original line number Diff line number Diff line
@@ -1770,13 +1770,25 @@ void bta_av_setconfig_rej(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {

  AVDT_ConfigRsp(avdt_handle, p_scb->avdt_label, err_code, 0);

  tBTA_AV bta_av_data = {
  tBTA_AV bta_av_data;

  if (com::android::bluetooth::flags::bta_av_setconfig_rej_type_confusion()) {
    bta_av_data = {
        .reject =
            {
                .bd_addr = p_scb->PeerAddress(),
                .hndl = p_scb->hndl,
            },
    };
  } else {
    bta_av_data = {
        .reject =
            {
                .bd_addr = p_data->str_msg.bd_addr,
                .hndl = p_scb->hndl,
            },
    };
  }

  (*bta_av_cb.p_cback)(BTA_AV_REJECT_EVT, &bta_av_data);
}
Loading