mirror of
https://github.com/samsonjs/media.git
synced 2026-04-05 11:15:46 +00:00
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
(cherry picked from commit 0bddd06938)
This commit is contained in:
parent
7d063e9aab
commit
77bccf0dd1
2 changed files with 36 additions and 9 deletions
|
|
@ -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…
Reference in a new issue