19f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li/*
2f04335f899f2cce69f843692a3cb9cec229683c2tturney * Copyright (C) 2017 The Android Open Source Project
39f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li *
4f04335f899f2cce69f843692a3cb9cec229683c2tturney * Licensed under the Apache License, Version 2.0 (the "License");
5f04335f899f2cce69f843692a3cb9cec229683c2tturney * you may not use this file except in compliance with the License.
6f04335f899f2cce69f843692a3cb9cec229683c2tturney * You may obtain a copy of the License at
79f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li *
8f04335f899f2cce69f843692a3cb9cec229683c2tturney *      http://www.apache.org/licenses/LICENSE-2.0
99f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li *
109f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li * Unless required by applicable law or agreed to in writing, software
11f04335f899f2cce69f843692a3cb9cec229683c2tturney * distributed under the License is distributed on an "AS IS" BASIS,
12f04335f899f2cce69f843692a3cb9cec229683c2tturney * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f04335f899f2cce69f843692a3cb9cec229683c2tturney * See the License for the specific language governing permissions and
14f04335f899f2cce69f843692a3cb9cec229683c2tturney * limitations under the License.
159f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li */
169f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
179f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Lipackage com.googlecode.android_scripting.activity;
189f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
199f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport android.app.Activity;
209f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport android.app.Service;
219f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport android.content.Intent;
229f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport android.content.pm.ResolveInfo;
239f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport android.os.Bundle;
249f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport android.view.ContextMenu;
259f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport android.view.ContextMenu.ContextMenuInfo;
269f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport android.view.KeyEvent;
279f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport android.view.Menu;
289f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport android.view.View;
299f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
309f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport com.googlecode.android_scripting.BaseApplication;
319f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport com.googlecode.android_scripting.Constants;
329f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport com.googlecode.android_scripting.FutureActivityTaskExecutor;
339f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport com.googlecode.android_scripting.Log;
349f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport com.googlecode.android_scripting.future.FutureActivityTask;
359f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport com.googlecode.android_scripting.jsonrpc.RpcReceiver;
369f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
379f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li/**
389f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li * This {@link Activity} is launched by {@link RpcReceiver}s in order to perform operations that a
399f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li * {@link Service} is unable to do. For example: start another activity for result, show dialogs,
409f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li * etc.
419f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li *
429f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li */
439f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Lipublic class FutureActivity extends Activity {
449f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  private FutureActivityTask<?> mTask;
459f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
469f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  @Override
479f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  protected void onCreate(Bundle savedInstanceState) {
489f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    super.onCreate(savedInstanceState);
499f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    Log.v("FutureActivity created.");
509f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    int id = getIntent().getIntExtra(Constants.EXTRA_TASK_ID, 0);
519f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    if (id == 0) {
529f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      throw new RuntimeException("FutureActivityTask ID is not specified.");
539f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    }
549f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    FutureActivityTaskExecutor taskQueue = ((BaseApplication) getApplication()).getTaskExecutor();
559f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mTask = taskQueue.getTask(id);
569f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    if (mTask == null) { // TODO: (Robbie) This is now less of a kludge. Would still like to know
579f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li                         // what is happening.
589f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      Log.w("FutureActivity has no task!");
599f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      try {
609f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li        Intent intent = new Intent(Intent.ACTION_MAIN); // Should default to main of current app.
619f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li        intent.addCategory(Intent.CATEGORY_LAUNCHER);
629f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li        String packageName = getPackageName();
639f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li        for (ResolveInfo resolve : getPackageManager().queryIntentActivities(intent, 0)) {
649f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li          if (resolve.activityInfo.packageName.equals(packageName)) {
659f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li            intent.setClassName(packageName, resolve.activityInfo.name);
669f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li            break;
679f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li          }
689f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li        }
699f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li        startActivity(intent);
709f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      } catch (Exception e) {
719f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li        Log.e("Can't find main activity.");
729f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      }
739f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    } else {
749f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      mTask.setActivity(this);
759f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      mTask.onCreate();
769f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    }
779f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
789f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
799f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  @Override
809f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  protected void onStart() {
819f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    super.onStart();
829f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    if (mTask != null) {
839f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      mTask.onStart();
849f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    }
859f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
869f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
879f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  @Override
889f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  protected void onResume() {
899f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    super.onResume();
909f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    if (mTask != null) {
919f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      mTask.onResume();
929f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    }
939f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
949f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
959f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  @Override
969f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  protected void onPause() {
979f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    super.onPause();
989f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    if (mTask != null) {
999f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      mTask.onPause();
1009f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    }
1019f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1029f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1039f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  @Override
1049f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  protected void onStop() {
1059f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    super.onStop();
1069f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    if (mTask != null) {
1079f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      mTask.onStop();
1089f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    }
1099f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1109f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1119f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  @Override
1129f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  protected void onDestroy() {
1139f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    super.onDestroy();
1149f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    if (mTask != null) {
1159f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      mTask.onDestroy();
1169f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    }
1179f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1189f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1199f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  @Override
1209f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
1219f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    if (mTask != null) {
1229f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      mTask.onCreateContextMenu(menu, v, menuInfo);
1239f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    }
1249f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1259f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1269f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  @Override
1279f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public boolean onPrepareOptionsMenu(Menu menu) {
1289f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    super.onPrepareOptionsMenu(menu);
1299f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    if (mTask == null) {
1309f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      return false;
1319f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    } else {
1329f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      return mTask.onPrepareOptionsMenu(menu);
1339f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    }
1349f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1359f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1369f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  @Override
1379f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public void onActivityResult(int requestCode, int resultCode, Intent data) {
1389f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    if (mTask != null) {
1399f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      mTask.onActivityResult(requestCode, resultCode, data);
1409f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    }
1419f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1429f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1439f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  @Override
1449f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public boolean onKeyDown(int keyCode, KeyEvent event) {
1459f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    if (mTask != null) {
1469f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      return mTask.onKeyDown(keyCode, event);
1479f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    }
1489f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    return false;
1499f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1509f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li}
151