Make BundleListRetriever local Binder aware
When used within the same process, we don't have to go via the onTransact method (which includes marshalling and unmarhsalling the data), but can directly return the list. #minor-release PiperOrigin-RevId: 572179846
This commit is contained in:
parent
fe7c62afe0
commit
0bddd06938
@ -23,6 +23,7 @@ import android.os.IBinder;
|
||||
import android.os.Parcel;
|
||||
import android.os.RemoteException;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
import androidx.media3.common.util.UnstableApi;
|
||||
import androidx.media3.common.util.Util;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
@ -97,11 +98,18 @@ public final class BundleListRetriever extends Binder {
|
||||
* @return The list of {@link Bundle Bundles}.
|
||||
*/
|
||||
public static ImmutableList<Bundle> getList(IBinder binder) {
|
||||
ImmutableList.Builder<Bundle> builder = ImmutableList.builder();
|
||||
if (binder instanceof BundleListRetriever) {
|
||||
// In-process binder calls can return the list directly instead of using the transact method.
|
||||
return ((BundleListRetriever) binder).list;
|
||||
}
|
||||
return getListFromRemoteBinder(binder);
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
/* package-private */ static ImmutableList<Bundle> getListFromRemoteBinder(IBinder binder) {
|
||||
ImmutableList.Builder<Bundle> builder = ImmutableList.builder();
|
||||
int index = 0;
|
||||
int replyCode = REPLY_CONTINUE;
|
||||
|
||||
while (replyCode != REPLY_END_OF_LIST) {
|
||||
Parcel data = Parcel.obtain();
|
||||
Parcel reply = Parcel.obtain();
|
||||
@ -121,7 +129,6 @@ public final class BundleListRetriever extends Binder {
|
||||
data.recycle();
|
||||
}
|
||||
}
|
||||
|
||||
return builder.build();
|
||||
}
|
||||
}
|
||||
|
@ -15,11 +15,12 @@
|
||||
*/
|
||||
package androidx.media3.common;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import android.os.Bundle;
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
import androidx.test.ext.truth.os.BundleSubject;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
@ -28,16 +29,35 @@ import org.junit.runner.RunWith;
|
||||
public class BundleListRetrieverTest {
|
||||
|
||||
@Test
|
||||
public void getList_preservedLargeList() {
|
||||
public void getList_inProcess_returnsOriginalImmutableList() {
|
||||
int count = 100_000;
|
||||
List<Bundle> listBefore = new ArrayList<>();
|
||||
ImmutableList.Builder<Bundle> listBuilder = ImmutableList.builder();
|
||||
for (int i = 0; i < count; i++) {
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putInt("i", i);
|
||||
listBefore.add(bundle);
|
||||
listBuilder.add(bundle);
|
||||
}
|
||||
ImmutableList<Bundle> listBefore = listBuilder.build();
|
||||
|
||||
List<Bundle> listAfter = BundleListRetriever.getList(new BundleListRetriever(listBefore));
|
||||
ImmutableList<Bundle> listAfter =
|
||||
BundleListRetriever.getList(new BundleListRetriever(listBefore));
|
||||
|
||||
assertThat(listAfter).isSameInstanceAs(listBefore);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getList_fromRemoteBinder_preservedLargeList() {
|
||||
int count = 100_000;
|
||||
ImmutableList.Builder<Bundle> listBuilder = ImmutableList.builder();
|
||||
for (int i = 0; i < count; i++) {
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putInt("i", i);
|
||||
listBuilder.add(bundle);
|
||||
}
|
||||
ImmutableList<Bundle> listBefore = listBuilder.build();
|
||||
|
||||
ImmutableList<Bundle> listAfter =
|
||||
BundleListRetriever.getListFromRemoteBinder(new BundleListRetriever(listBefore));
|
||||
|
||||
for (int i = 0; i < count; i++) {
|
||||
Bundle bundle = listAfter.get(i);
|
||||
|
Loading…
x
Reference in New Issue
Block a user