blob: 2cd2058ee14a3efa31be225cdd3d644565e2cee6 [file] [log] [blame]
package org.robolectric.shadows;
import static android.os.Build.VERSION_CODES.JELLY_BEAN;
import static android.os.Build.VERSION_CODES.LOLLIPOP_MR1;
import static org.robolectric.RuntimeEnvironment.getApiLevel;
import android.content.BroadcastReceiver;
import android.content.Intent;
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;
@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);
}
}
static BroadcastReceiver.PendingResult createSticky(Intent intent) {
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(
0 /*resultCode*/,
intent.getDataString(),
intent.getExtras(),
0 /* type */,
false /*ordered*/,
true /*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(
0 /*resultCode*/,
intent.getDataString(),
intent.getExtras(),
0 /* type */,
false /*ordered*/,
true /*sticky*/,
null /* ibinder token */,
0 /* userid */);
} else {
return new BroadcastReceiver.PendingResult(
0 /*resultCode*/,
intent.getDataString(),
intent.getExtras(),
0 /* type */,
false /*ordered*/,
true /*sticky*/,
null /* ibinder token */,
0 /* userid */,
0 /* flags */);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private final SettableFuture<BroadcastReceiver.PendingResult> finished = SettableFuture.create();
@Implementation
protected final void finish() {
Preconditions.checkState(finished.set(pendingResult), "Broadcast already finished");
}
public ListenableFuture<BroadcastReceiver.PendingResult> getFuture() {
return finished;
}
}