package org.robolectric.shadows;
import android.content.BroadcastReceiver;
import android.os.Bundle;
import android.os.IBinder;
import com.google.common.base.Preconditions;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.SettableFuture;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.annotation.RealObject;
import static android.os.Build.VERSION_CODES.JELLY_BEAN;
import static android.os.Build.VERSION_CODES.LOLLIPOP_MR1;
import static org.robolectric.RuntimeEnvironment.getApiLevel;
@Implements(BroadcastReceiver.PendingResult.class)
public final class ShadowBroadcastPendingResult {
@RealObject BroadcastReceiver.PendingResult pendingResult;
static BroadcastReceiver.PendingResult create(int resultCode, String resultData, Bundle resultExtras, boolean ordered) {
try {
if (getApiLevel() <= JELLY_BEAN) {
return BroadcastReceiver.PendingResult.class
.getConstructor(int.class, String.class, Bundle.class, int.class, boolean.class, boolean.class, IBinder.class)
.newInstance(
resultCode,
resultData,
resultExtras,
0 /* type */,
ordered,
false /*sticky*/,
null /* ibinder token */);
} else if (getApiLevel() <= LOLLIPOP_MR1) {
return BroadcastReceiver.PendingResult.class
.getConstructor(int.class, String.class, Bundle.class, int.class, boolean.class, boolean.class, IBinder.class, int.class)
.newInstance(
resultCode,
resultData,
resultExtras,
0 /* type */,
ordered,
false /*sticky*/,
null /* ibinder token */,
0 /* userid */);
} else {
return new BroadcastReceiver.PendingResult(
resultCode,
resultData,
resultExtras,
0 /* type */,
ordered,
false /*sticky*/,
null /* ibinder token */,
0 /* userid */,
0 /* flags */);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private final SettableFuture<BroadcastReceiver.PendingResult> finished = SettableFuture.create();
@Implementation
public final void finish() {
Preconditions.checkState(finished.set(pendingResult), "Broadcast already finished");
}
public ListenableFuture<BroadcastReceiver.PendingResult> getFuture() {
return finished;
}
}