/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.googlecode.android_scripting.facade;
import android.app.Activity;
import android.content.Intent;
import com.googlecode.android_scripting.Constants;
import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
import com.googlecode.android_scripting.rpc.Rpc;
import com.googlecode.android_scripting.rpc.RpcParameter;
import java.io.Serializable;
/**
* Allows you to return results to a startActivityForResult call.
*
*/
public class ActivityResultFacade extends RpcReceiver {
private static final String sRpcDescription =
"Sets the result of a script execution. Whenever the script APK is called via "
+ "startActivityForResult(), the resulting intent will contain " + Constants.EXTRA_RESULT
+ " extra with the given value.";
private static final String sCodeDescription =
"The result code to propagate back to the originating activity, often RESULT_CANCELED (0) "
+ "or RESULT_OK (-1)";
private Activity mActivity = null;
private Intent mResult = null;
private int mResultCode;
public ActivityResultFacade(FacadeManager manager) {
super(manager);
}
@Rpc(description = sRpcDescription)
public synchronized void setResultBoolean(
@RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
@RpcParameter(name = "resultValue") Boolean resultValue) {
mResult = new Intent();
mResult.putExtra(Constants.EXTRA_RESULT, resultValue.booleanValue());
mResultCode = resultCode;
if (mActivity != null) {
setResult();
}
}
@Rpc(description = sRpcDescription)
public synchronized void setResultByte(
@RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
@RpcParameter(name = "resultValue") Byte resultValue) {
mResult = new Intent();
mResult.putExtra(Constants.EXTRA_RESULT, resultValue.byteValue());
mResultCode = resultCode;
if (mActivity != null) {
setResult();
}
}
@Rpc(description = sRpcDescription)
public synchronized void setResultShort(
@RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
@RpcParameter(name = "resultValue") Short resultValue) {
mResult = new Intent();
mResult.putExtra(Constants.EXTRA_RESULT, resultValue.shortValue());
mResultCode = resultCode;
if (mActivity != null) {
setResult();
}
}
@Rpc(description = sRpcDescription)
public synchronized void setResultChar(
@RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
@RpcParameter(name = "resultValue") Character resultValue) {
mResult = new Intent();
mResult.putExtra(Constants.EXTRA_RESULT, resultValue.charValue());
mResultCode = resultCode;
if (mActivity != null) {
setResult();
}
}
@Rpc(description = sRpcDescription)
public synchronized void setResultInteger(
@RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
@RpcParameter(name = "resultValue") Integer resultValue) {
mResult = new Intent();
mResult.putExtra(Constants.EXTRA_RESULT, resultValue.intValue());
mResultCode = resultCode;
if (mActivity != null) {
setResult();
}
}
@Rpc(description = sRpcDescription)
public synchronized void setResultLong(
@RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
@RpcParameter(name = "resultValue") Long resultValue) {
mResult = new Intent();
mResult.putExtra(Constants.EXTRA_RESULT, resultValue.longValue());
mResultCode = resultCode;
if (mActivity != null) {
setResult();
}
}
@Rpc(description = sRpcDescription)
public synchronized void setResultFloat(
@RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
@RpcParameter(name = "resultValue") Float resultValue) {
mResult = new Intent();
mResult.putExtra(Constants.EXTRA_RESULT, resultValue.floatValue());
mResultCode = resultCode;
if (mActivity != null) {
setResult();
}
}
@Rpc(description = sRpcDescription)
public synchronized void setResultDouble(
@RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
@RpcParameter(name = "resultValue") Double resultValue) {
mResult = new Intent();
mResult.putExtra(Constants.EXTRA_RESULT, resultValue.doubleValue());
mResultCode = resultCode;
if (mActivity != null) {
setResult();
}
}
@Rpc(description = sRpcDescription)
public synchronized void setResultString(
@RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
@RpcParameter(name = "resultValue") String resultValue) {
mResult = new Intent();
mResult.putExtra(Constants.EXTRA_RESULT, resultValue);
mResultCode = resultCode;
if (mActivity != null) {
setResult();
}
}
@Rpc(description = sRpcDescription)
public synchronized void setResultBooleanArray(
@RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
@RpcParameter(name = "resultValue") Boolean[] resultValue) {
mResult = new Intent();
boolean[] array = new boolean[resultValue.length];
for (int i = 0; i < resultValue.length; i++) {
array[i] = resultValue[i];
}
mResult.putExtra(Constants.EXTRA_RESULT, array);
mResultCode = resultCode;
if (mActivity != null) {
setResult();
}
}
@Rpc(description = sRpcDescription)
public synchronized void setResultByteArray(
@RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
@RpcParameter(name = "resultValue") Byte[] resultValue) {
mResult = new Intent();
byte[] array = new byte[resultValue.length];
for (int i = 0; i < resultValue.length; i++) {
array[i] = resultValue[i];
}
mResult.putExtra(Constants.EXTRA_RESULT, array);
mResultCode = resultCode;
if (mActivity != null) {
setResult();
}
}
@Rpc(description = sRpcDescription)
public synchronized void setResultShortArray(
@RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
@RpcParameter(name = "resultValue") Short[] resultValue) {
mResult = new Intent();
short[] array = new short[resultValue.length];
for (int i = 0; i < resultValue.length; i++) {
array[i] = resultValue[i];
}
mResult.putExtra(Constants.EXTRA_RESULT, array);
mResultCode = resultCode;
if (mActivity != null) {
setResult();
}
}
@Rpc(description = sRpcDescription)
public synchronized void setResultCharArray(
@RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
@RpcParameter(name = "resultValue") Character[] resultValue) {
mResult = new Intent();
char[] array = new char[resultValue.length];
for (int i = 0; i < resultValue.length; i++) {
array[i] = resultValue[i];
}
mResult.putExtra(Constants.EXTRA_RESULT, array);
mResultCode = resultCode;
if (mActivity != null) {
setResult();
}
}
@Rpc(description = sRpcDescription)
public synchronized void setResultIntegerArray(
@RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
@RpcParameter(name = "resultValue") Integer[] resultValue) {
mResult = new Intent();
int[] array = new int[resultValue.length];
for (int i = 0; i < resultValue.length; i++) {
array[i] = resultValue[i];
}
mResult.putExtra(Constants.EXTRA_RESULT, array);
mResultCode = resultCode;
if (mActivity != null) {
setResult();
}
}
@Rpc(description = sRpcDescription)
public synchronized void setResultLongArray(
@RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
@RpcParameter(name = "resultValue") Long[] resultValue) {
mResult = new Intent();
long[] array = new long[resultValue.length];
for (int i = 0; i < resultValue.length; i++) {
array[i] = resultValue[i];
}
mResult.putExtra(Constants.EXTRA_RESULT, array);
mResultCode = resultCode;
if (mActivity != null) {
setResult();
}
}
@Rpc(description = sRpcDescription)
public synchronized void setResultFloatArray(
@RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
@RpcParameter(name = "resultValue") Float[] resultValue) {
mResult = new Intent();
float[] array = new float[resultValue.length];
for (int i = 0; i < resultValue.length; i++) {
array[i] = resultValue[i];
}
mResult.putExtra(Constants.EXTRA_RESULT, array);
mResultCode = resultCode;
if (mActivity != null) {
setResult();
}
}
@Rpc(description = sRpcDescription)
public synchronized void setResultDoubleArray(
@RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
@RpcParameter(name = "resultValue") Double[] resultValue) {
mResult = new Intent();
double[] array = new double[resultValue.length];
for (int i = 0; i < resultValue.length; i++) {
array[i] = resultValue[i];
}
mResult.putExtra(Constants.EXTRA_RESULT, array);
mResultCode = resultCode;
if (mActivity != null) {
setResult();
}
}
@Rpc(description = sRpcDescription)
public synchronized void setResultStringArray(
@RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
@RpcParameter(name = "resultValue") String[] resultValue) {
mResult = new Intent();
mResult.putExtra(Constants.EXTRA_RESULT, resultValue);
mResultCode = resultCode;
if (mActivity != null) {
setResult();
}
}
@Rpc(description = sRpcDescription)
public synchronized void setResultSerializable(
@RpcParameter(name = "resultCode", description = sCodeDescription) Integer resultCode,
@RpcParameter(name = "resultValue") Serializable resultValue) {
mResult = new Intent();
mResult.putExtra(Constants.EXTRA_RESULT, resultValue);
mResultCode = resultCode;
if (mActivity != null) {
setResult();
}
}
public synchronized void setActivity(Activity activity) {
mActivity = activity;
if (mResult != null) {
setResult();
}
}
private void setResult() {
mActivity.setResult(mResultCode, mResult);
mActivity.finish();
}
@Override
public void shutdown() {
}
}