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