/* * Copyright (C) 2010 Google Inc. * * 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. * * @author Alexey Reznichenko (alexey.reznichenko@gmail.com) */ 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() { } }