Java程序  |  327行  |  10.91 KB

/*
 * 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() {
  }
}