AI2 Component  (Version nb184)
ActivityStarter.java
Go to the documentation of this file.
1 // -*- mode: java; c-basic-offset: 2; -*-
2 // Copyright 2009-2011 Google, All Rights reserved
3 // Copyright 2011-2020 MIT, All rights reserved
4 // Released under the Apache License, Version 2.0
5 // http://www.apache.org/licenses/LICENSE-2.0
6 
7 package com.google.appinventor.components.runtime;
8 
9 import android.app.Activity;
10 
11 import android.content.ActivityNotFoundException;
12 import android.content.ComponentName;
13 import android.content.Intent;
14 import android.content.pm.PackageManager;
15 import android.content.pm.ResolveInfo;
16 
17 import android.net.Uri;
18 
19 import android.text.TextUtils;
20 
21 import android.util.Log;
22 
30 
34 
36 
41 
42 import java.io.File;
43 
76 @DesignerComponent(version = YaVersion.ACTIVITYSTARTER_COMPONENT_VERSION,
77  designerHelpDescription = "A component that can launch an activity " +
78  "using the <code>StartActivity</code> method." +
79  "<p>Activities that can be launched include: <ul> \n" +
80  "<li> starting other App Inventor for Android apps </li> \n" +
81  "<li> starting the camera application </li> \n" +
82  "<li> performing web search </li> \n" +
83  "<li> opening a browser to a specified web page</li> \n" +
84  "<li> opening the map application to a specified location</li></ul> \n" +
85  "You can also launch activities that return text data. See the " +
86  "documentation on using the Activity Starter for examples.</p>",
87 
88 
89  // TODO(user): Add more information about bringing up maps when
90  // the issues with html quoting (bug 2386151) are fixed.
91  description = "A component that can launch an activity using " +
92  "the <code>StartActivity</code> method. \n" +
93  "<p>Activities that can be launched include:<ul> " +
94  "<li> Starting another App Inventor for Android app. \n To do so, first " +
95  " find out the <em>class</em> of the other application by " +
96  " downloading the source code and using a file explorer or unzip " +
97  " utility to find a file named " +
98  " \"youngandroidproject/project.properties\". \n The first line of " +
99  " the file will start with \"main=\" and be followed by the class " +
100  " name; for example, " +
101  " <code>main=com.gmail.Bitdiddle.Ben.HelloPurr.Screen1</code>. " +
102  " (The first components indicate that it was created by " +
103  " Ben.Bitdiddle@gmail.com.) \n To make your " +
104  " <code>ActivityStarter</code> launch this application, set the " +
105  " following properties: <ul>\n " +
106  " <li> <code>ActivityPackage</code> to the class name, dropping the " +
107  " last component (for example, " +
108  " <code>com.gmail.Bitdiddle.Ben.HelloPurr</code>)</li>\n " +
109  " <li> <code>ActivityClass</code> to the entire class name (for " +
110  " example, " +
111  " <code>com.gmail.Bitdiddle.Ben.HelloPurr.Screen1</code>)</li> " +
112  " </ul></li> \n" +
113  "<li> Starting the camera application by setting the following " +
114  " properties:<ul> \n" +
115  " <li> <code>Action: android.intent.action.MAIN</code> </li> \n" +
116  " <li> <code>ActivityPackage: com.android.camera</code> </li> \n" +
117  " <li> <code>ActivityClass: com.android.camera.Camera</code></li>\n " +
118  " </ul></li>\n" +
119  "<li> Performing web search. Assuming the term you want to search " +
120  " for is \"vampire\" (feel free to substitute your own choice), \n" +
121  " set the properties to:\n<ul><code>" +
122  " <li>Action: android.intent.action.WEB_SEARCH</li> " +
123  " <li>ExtraKey: query</li> " +
124  " <li>ExtraValue: vampire</li> " +
125  " <li>ActivityPackage: com.google.android.providers.enhancedgooglesearch</li>" +
126  " <li>ActivityClass: com.google.android.providers.enhancedgooglesearch.Launcher</li> " +
127  " </code></ul></li> \n" +
128  "<li> Opening a browser to a specified web page. Assuming the page you " +
129  " want to go to is \"www.facebook.com\" (feel free to substitute " +
130  " your own choice), set the properties to:\n<ul><code> " +
131  " <li>Action: android.intent.action.VIEW</li> " +
132  " <li>DataUri: http://www.facebook.com</li> </code> </ul> </li> " +
133  "</ul></p>",
134  category = ComponentCategory.CONNECTIVITY,
135  nonVisible = true,
136  iconName = "images/activityStarter.png")
137 @SimpleObject
140 
141  private String action;
142  private String dataUri;
143  private String dataType;
144  private String activityPackage;
145  private String activityClass;
146  private String extraKey;
147  private String extraValue;
148  private String resultName;
149  private Intent resultIntent;
150  private String result;
151  private int requestCode;
152  private YailList extras;
153  private final ComponentContainer container;
154 
155  private static final String LOG_TAG = "ActivityStarter";
156 
163  super(container.$form());
164  // Save the container for later
165  this.container = container;
166  result = "";
167  Action(Intent.ACTION_MAIN);
168  ActivityPackage("");
169  ActivityClass("");
170  DataUri("");
171  DataType("");
172  ExtraKey("");
173  ExtraValue("");
174  Extras(new YailList());
175  ResultName("");
176  }
177 
182  category = PropertyCategory.BEHAVIOR)
183  public String Action() {
184  return action;
185  }
186 
191  defaultValue = "")
193  public void Action(String action) {
194  this.action = action.trim();
195  }
196 
197  // TODO(lizlooney) - currently we support just one extra name/value pair that will be passed to
198  // the activity. The user specifies the ExtraKey and ExtraValue properties.
199  // We should allow more extra name/value pairs, but we'd need a different interface with regard
200  // to properties and functions.
201  // In the documentation for Intent, they use the term "name", not "key", and we might want to use
202  // the term "name", also.
203  // There are backwards compatibility issues with removing the ExtraKey and ExtraValue properties.
204  // Also, while extra names are always Strings, the values can be other types. We'd need to know
205  // the correct type of the value in order to call the appropriate Intent.putExtra method.
206  // Adding multiple functions like PutStringExtra, PutStringArrayExtra, PutCharExtra,
207  // PutCharArrayExtra, PutBooleanExtra, PutBooleanArrayExtra, PutByteExtra, PutByteArrayExtra,
208  // PutShortExtra, PutShortArrayExtra, PutIntExtra, PutIntArrayExtra, PutLongExtra,
209  // PutLongArrayExtra, PutFloatExtra, PutFloatArrayExtra, PutDoubleExtra, PutDoubleArrayExtra,
210  // etc, seems like a bad idea.
211 
217  description = "Returns the extra key that will be passed to the activity.\n" +
218  "DEPRECATED: New code should use Extras property instead.",
219  category = PropertyCategory.BEHAVIOR)
220  public String ExtraKey() {
221  return extraKey;
222  }
223 
229  defaultValue = "")
231  public void ExtraKey(String extraKey) {
232  this.extraKey = extraKey.trim();
233  }
234 
235 
241  description = "Returns the extra value that will be passed to the activity.\n" +
242  "DEPRECATED: New code should use Extras property instead.",
243  category = PropertyCategory.BEHAVIOR)
244  public String ExtraValue() {
245  return extraValue;
246  }
247 
253  defaultValue = "")
255  public void ExtraValue(String extraValue) {
256  this.extraValue = extraValue.trim();
257  }
258 
259  // TODO(lizlooney) - currently we support retrieving just one string extra result from the
260  // activity. The user specifies the ResultName property and, then after the activity finishes,
261  // the string extra result corresponding to ResultName is passed as the result parameter to the
262  // AfterActivity event and is also available from the Result property getter.
263  // We should allow access to more extra results, but we'd need a different interface with regard
264  // to properties, functions, and events parameters.
265  // There are backwards compatibility issues with removing the AfterActivity event's result
266  // parameter and the Result property.
267  // Also, while extra names are always Strings, the values can be other types. We'd need to know
268  // the correct type of the value in order to call the appropriate Intent.get...Extra method.
269  // Adding multiple functions like GetStringExtra, GetStringArrayExtra, GetCharExtra,
270  // GetCharArrayExtra, GetBooleanExtra, GetBooleanArrayExtra, GetByteExtra, GetByteArrayExtra,
271  // GetShortExtra, GetShortArrayExtra, GetIntExtra, GetIntArrayExtra, GetLongExtra,
272  // GetLongArrayExtra, GetFloatExtra, GetFloatArrayExtra, GetDoubleExtra, GetDoubleArrayExtra,
273  // etc, seems like a bad idea.
274 
279  category = PropertyCategory.BEHAVIOR)
280  public String ResultName() {
281  return resultName;
282  }
283 
289  defaultValue = "")
291  public void ResultName(String resultName) {
292  this.resultName = resultName.trim();
293  }
294 
299  category = PropertyCategory.BEHAVIOR)
300  public String Result() {
301  return result;
302  }
303 
308  category = PropertyCategory.BEHAVIOR)
309  public String DataUri() {
310  return dataUri;
311  }
312 
317  defaultValue = "")
319  public void DataUri(String dataUri) {
320  this.dataUri = dataUri.trim();
321  }
322 
327  category = PropertyCategory.BEHAVIOR)
328  public String DataType() {
329  return dataType;
330  }
331 
336  defaultValue = "")
338  public void DataType(String dataType) {
339  this.dataType = dataType.trim();
340  }
341 
346  category = PropertyCategory.BEHAVIOR)
347  public String ActivityPackage() {
348  return activityPackage;
349  }
350 
355  defaultValue = "")
357  public void ActivityPackage(String activityPackage) {
358  this.activityPackage = activityPackage.trim();
359  }
360 
365  category = PropertyCategory.BEHAVIOR)
366  public String ActivityClass() {
367  return activityClass;
368  }
369 
374  defaultValue = "")
376  public void ActivityClass(String activityClass) {
377  this.activityClass = activityClass.trim();
378  }
379 
384  @SimpleEvent(description = "Event raised after this ActivityStarter returns.")
385  public void AfterActivity(String result) {
386  EventDispatcher.dispatchEvent(this, "AfterActivity", result);
387  }
388 
392  @SimpleEvent(description =
393  "Event raised if this ActivityStarter returns because the activity was canceled.")
394  public void ActivityCanceled() {
395  EventDispatcher.dispatchEvent(this, "ActivityCanceled");
396  }
397 
402  category = PropertyCategory.BEHAVIOR)
403  public String ResultType() {
404  if (resultIntent != null) {
405  String resultType = resultIntent.getType();
406  if (resultType != null) {
407  return resultType;
408  }
409  }
410  return "";
411  }
412 
417  category = PropertyCategory.BEHAVIOR)
418  public String ResultUri() {
419  if (resultIntent != null) {
420  String resultUri = resultIntent.getDataString();
421  if (resultUri != null) {
422  return resultUri;
423  }
424  }
425  return "";
426  }
427 
432  public void Extras(YailList pairs) {
433  for (Object pair : pairs.toArray()) {
434  boolean isYailList = pair instanceof YailList;
435  boolean isPair = isYailList ? ((YailList) pair).size() == 2 : false;
436  if (!isYailList || !isPair) {
437  throw new YailRuntimeError("Argument to Extras should be a list of pairs",
438  "ActivityStarter Error");
439  }
440  }
441  extras = pairs;
442  }
443 
448  public YailList Extras() {
449  return extras;
450  }
451 
452 
457  @SimpleFunction(description = "Returns the name of the activity that corresponds to this " +
458  "ActivityStarter, or an empty string if no corresponding activity can be found.")
459  public String ResolveActivity() {
460  Intent intent = buildActivityIntent();
461  PackageManager pm = container.$context().getPackageManager();
462  ResolveInfo resolveInfo = pm.resolveActivity(intent, 0);
463  if (resolveInfo != null && resolveInfo.activityInfo != null) {
464  return resolveInfo.activityInfo.name;
465  }
466  return "";
467  }
468 
472  @SimpleFunction(description = "Start the activity corresponding to this ActivityStarter.")
473  public void StartActivity() {
474  resultIntent = null;
475  result = "";
476 
477  Intent intent = buildActivityIntent();
478 
479  if (requestCode == 0) {
480  // First time, we need to register this as an ActivityResultListener with the Form.
481  // The Form's onActivityResult method will be called when the activity returns. If we
482  // register with the Form and then use the requestCode when we start an activity, the Form
483  // will call our resultReturned method.
484  requestCode = form.registerForActivityResult(this);
485  }
486 
487  if (intent == null) {
488  form.dispatchErrorOccurredEvent(this, "StartActivity",
490  } else {
491  try {
492  container.$context().startActivityForResult(intent, requestCode);
493  String openAnim = container.$form().getOpenAnimType();
494  AnimationUtil.ApplyOpenScreenAnimation(container.$context(), openAnim);
495  } catch (ActivityNotFoundException e) {
496  form.dispatchErrorOccurredEvent(this, "StartActivity",
498  }
499  }
500  }
501 
502  private Intent buildActivityIntent() {
503  Uri uri = (dataUri.length() != 0) ? Uri.parse(dataUri) : null;
504  Intent intent = new Intent(action);
505 
506  if (uri != null && dataUri.toLowerCase().startsWith("file://") ) {
507  Log.d(LOG_TAG, "Using file://");
508  File file = new File(uri.getPath());
509  if (file.isFile()) {
510  Log.d(LOG_TAG, "It's a file");
511  uri = NougatUtil.getPackageUri(form, file);
512  intent = new Intent(action);
513  intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
514  Log.d(LOG_TAG, "added permissions"); // adb log shows this gets printed
515  }
516  }
517 
518  if (TextUtils.isEmpty(Action())) {
519  return null;
520  }
521 
522  if (dataType.length() != 0) {
523  if (uri != null) {
524  intent.setDataAndType(uri, dataType);
525  } else {
526  intent.setType(dataType);
527  }
528  } else {
529  intent.setData(uri);
530  }
531 
532  if (activityPackage.length() != 0 || activityClass.length() != 0) {
533  ComponentName component = new ComponentName(activityPackage, activityClass);
534  intent.setComponent(component);
535  } else if (Action().equals("android.intent.action.MAIN")) {
536  return null;
537  }
538 
539  if (extraKey.length() != 0 && extraValue.length() != 0) {
540  Log.i(LOG_TAG, "Adding extra, key = " + extraKey + " value = " + extraValue);
541  intent.putExtra(extraKey, extraValue);
542  }
543 
544  // If the extra value is a string, put it to the intent. If the extra value is a list
545  // of strings, convert it to a java list and put that to the intent.
546  for (Object extra : extras.toArray()) {
547  YailList castExtra = (YailList) extra;
548  String key = castExtra.getString(0);
549  Object value = castExtra.getObject(1);
550  Log.i(LOG_TAG, "Adding extra, key = " + key + " value = " + value);
551  if ((key.length() != 0)) {
552  if (value instanceof YailList) {
553  Log.i(LOG_TAG, "Adding extra list, key = " + key + " value = " + value);
554  intent.putExtra(key, ((YailList) value).toStringArray());
555  }
556  else {
557  String stringValue = castExtra.getString(1);
558  Log.i(LOG_TAG, "Adding extra string, key = " + key + " value = " + stringValue);
559  intent.putExtra(key, stringValue);
560  }
561  };
562  };
563  return intent;
564  }
565 
566  @Override
567  public void resultReturned(int requestCode, int resultCode, Intent data) {
568  if (requestCode == this.requestCode) {
569  Log.i(LOG_TAG, "resultReturned - resultCode = " + resultCode);
570  if (resultCode == Activity.RESULT_OK) {
571  resultIntent = data;
572  if (resultName.length() != 0 && resultIntent != null &&
573  resultIntent.hasExtra(resultName)) {
574  result = resultIntent.getStringExtra(resultName);
575  } else {
576  result = "";
577  }
578  // call user's AfterActivity event handler
579  AfterActivity(result);
580  } else if (resultCode == Activity.RESULT_CANCELED) {
582  }
583  }
584  }
585 
586  @SimpleEvent(description = "The ActivityError event is no longer used. " +
587  "Please use the Screen.ErrorOccurred event instead.",
588  userVisible = false)
589  public void ActivityError(String message) {
590  }
591 
592  // Deleteable implementation
593 
594  @Override
595  public void onDelete() {
597  }
598 }
com.google.appinventor.components.runtime.EventDispatcher
Definition: EventDispatcher.java:22
com.google.appinventor.components.runtime.ActivityStarter.ExtraValue
void ExtraValue(String extraValue)
Definition: ActivityStarter.java:255
com.google.appinventor.components.runtime.ActivityStarter.ExtraKey
String ExtraKey()
Definition: ActivityStarter.java:220
com.google.appinventor.components.runtime.util.YailList
Definition: YailList.java:26
com.google.appinventor.components.runtime.ActivityStarter.ActivityError
void ActivityError(String message)
Definition: ActivityStarter.java:589
com.google.appinventor.components.annotations.SimpleFunction
Definition: SimpleFunction.java:23
com.google.appinventor.components.runtime.ActivityStarter.AfterActivity
void AfterActivity(String result)
Definition: ActivityStarter.java:385
com.google.appinventor.components.runtime.ActivityStarter.ResultUri
String ResultUri()
Definition: ActivityStarter.java:418
com.google.appinventor.components.runtime.util.ErrorMessages
Definition: ErrorMessages.java:17
com.google.appinventor.components.runtime.util
-*- mode: java; c-basic-offset: 2; -*-
Definition: AccountChooser.java:7
com.google.appinventor.components.common.YaVersion
Definition: YaVersion.java:14
com.google.appinventor.components.runtime.ActivityStarter.onDelete
void onDelete()
Definition: ActivityStarter.java:595
com.google.appinventor.components.annotations.DesignerProperty
Definition: DesignerProperty.java:25
com.google.appinventor.components.runtime.ActivityStarter.ActivityStarter
ActivityStarter(ComponentContainer container)
Definition: ActivityStarter.java:162
com.google.appinventor.components.runtime.ActivityStarter.resultReturned
void resultReturned(int requestCode, int resultCode, Intent data)
Definition: ActivityStarter.java:567
com.google.appinventor.components.common.PropertyTypeConstants.PROPERTY_TYPE_STRING
static final String PROPERTY_TYPE_STRING
Definition: PropertyTypeConstants.java:237
com.google.appinventor.components
com.google.appinventor.components.runtime.ActivityStarter.ActivityPackage
String ActivityPackage()
Definition: ActivityStarter.java:347
com.google.appinventor.components.runtime.util.YailList.toArray
Object[] toArray()
Definition: YailList.java:97
com.google.appinventor.components.runtime.ActivityStarter.ResultName
void ResultName(String resultName)
Definition: ActivityStarter.java:291
com.google.appinventor.components.runtime.ActivityStarter.ActivityClass
String ActivityClass()
Definition: ActivityStarter.java:366
com.google.appinventor.components.runtime.util.AnimationUtil
Definition: AnimationUtil.java:24
com.google.appinventor.components.annotations.DesignerComponent
Definition: DesignerComponent.java:22
com.google.appinventor.components.annotations.SimpleEvent
Definition: SimpleEvent.java:20
com.google.appinventor.components.annotations.PropertyCategory.BEHAVIOR
BEHAVIOR
Definition: PropertyCategory.java:15
com.google.appinventor.components.runtime.util.NougatUtil.getPackageUri
static Uri getPackageUri(Form form, File apk)
Definition: NougatUtil.java:23
com.google.appinventor.components.runtime.ActivityStarter.Extras
YailList Extras()
Definition: ActivityStarter.java:448
com.google.appinventor.components.runtime.ActivityStarter.Action
void Action(String action)
Definition: ActivityStarter.java:193
com.google.appinventor.components.runtime.File
Definition: File.java:53
com.google.appinventor.components.runtime.ActivityStarter.ExtraValue
String ExtraValue()
Definition: ActivityStarter.java:244
com.google.appinventor.components.runtime.ActivityStarter.DataUri
String DataUri()
Definition: ActivityStarter.java:309
com.google.appinventor.components.runtime.util.ErrorMessages.ERROR_ACTIVITY_STARTER_NO_CORRESPONDING_ACTIVITY
static final int ERROR_ACTIVITY_STARTER_NO_CORRESPONDING_ACTIVITY
Definition: ErrorMessages.java:90
com.google.appinventor.components.runtime.ActivityStarter.ResultType
String ResultType()
Definition: ActivityStarter.java:403
com.google.appinventor.components.runtime.Form.getOpenAnimType
String getOpenAnimType()
Definition: Form.java:1687
com.google.appinventor.components.runtime.util.ErrorMessages.ERROR_ACTIVITY_STARTER_NO_ACTION_INFO
static final int ERROR_ACTIVITY_STARTER_NO_ACTION_INFO
Definition: ErrorMessages.java:91
com.google.appinventor.components.runtime.ActivityStarter.ResultName
String ResultName()
Definition: ActivityStarter.java:280
com.google.appinventor.components.runtime.EventDispatcher.dispatchEvent
static boolean dispatchEvent(Component component, String eventName, Object...args)
Definition: EventDispatcher.java:188
com.google.appinventor.components.runtime.util.AnimationUtil.ApplyOpenScreenAnimation
static void ApplyOpenScreenAnimation(Activity activity, String animType)
Definition: AnimationUtil.java:81
com.google.appinventor.components.runtime.AndroidNonvisibleComponent
Definition: AndroidNonvisibleComponent.java:17
com.google.appinventor.components.runtime.ActivityStarter.ActivityPackage
void ActivityPackage(String activityPackage)
Definition: ActivityStarter.java:357
com.google.appinventor.components.runtime.ActivityStarter.Result
String Result()
Definition: ActivityStarter.java:300
com.google.appinventor.components.runtime.errors.YailRuntimeError
Definition: YailRuntimeError.java:14
com.google.appinventor.components.annotations.SimpleProperty
Definition: SimpleProperty.java:23
com.google.appinventor.components.annotations.PropertyCategory
Definition: PropertyCategory.java:13
com.google.appinventor.components.runtime.ActivityStarter.Extras
void Extras(YailList pairs)
Definition: ActivityStarter.java:432
com.google.appinventor.components.runtime.ComponentContainer
Definition: ComponentContainer.java:16
com.google.appinventor.components.runtime
Copyright 2009-2011 Google, All Rights reserved.
Definition: AccelerometerSensor.java:8
com.google.appinventor.components.runtime.Component
Definition: Component.java:17
com.google.appinventor.components.runtime.ActivityStarter.DataUri
void DataUri(String dataUri)
Definition: ActivityStarter.java:319
com.google.appinventor.components.runtime.Deleteable
Definition: Deleteable.java:15
com.google.appinventor.components.common
Definition: ComponentCategory.java:7
com.google.appinventor.components.common.ComponentCategory
Definition: ComponentCategory.java:48
com.google.appinventor.components.runtime.util.NougatUtil
Definition: NougatUtil.java:16
com.google.appinventor.components.runtime.Form.unregisterForActivityResult
void unregisterForActivityResult(ActivityResultListener listener)
Definition: Form.java:660
com.google.appinventor.components.runtime.Form.dispatchErrorOccurredEvent
void dispatchErrorOccurredEvent(final Component component, final String functionName, final int errorNumber, final Object... messageArgs)
Definition: Form.java:1011
com.google.appinventor.components.runtime.ActivityResultListener
Definition: ActivityResultListener.java:16
com.google.appinventor.components.runtime.ActivityStarter.DataType
String DataType()
Definition: ActivityStarter.java:328
com.google.appinventor.components.annotations.SimpleObject
Definition: SimpleObject.java:23
com.google.appinventor.components.runtime.ActivityStarter.ActivityCanceled
void ActivityCanceled()
Definition: ActivityStarter.java:394
com.google.appinventor.components.runtime.ActivityStarter
Definition: ActivityStarter.java:138
com.google
com
com.google.appinventor.components.runtime.errors
Definition: ArrayIndexOutOfBoundsError.java:7
com.google.appinventor.components.runtime.ComponentContainer.$form
Form $form()
com.google.appinventor.components.runtime.ComponentContainer.$context
Activity $context()
com.google.appinventor.components.runtime.ActivityStarter.ResolveActivity
String ResolveActivity()
Definition: ActivityStarter.java:459
com.google.appinventor.components.runtime.ActivityStarter.Action
String Action()
Definition: ActivityStarter.java:183
com.google.appinventor.components.runtime.ActivityStarter.DataType
void DataType(String dataType)
Definition: ActivityStarter.java:338
com.google.appinventor.components.runtime.AndroidNonvisibleComponent.form
final Form form
Definition: AndroidNonvisibleComponent.java:19
com.google.appinventor.components.runtime.Form.registerForActivityResult
int registerForActivityResult(ActivityResultListener listener)
Definition: Form.java:638
com.google.appinventor.components.runtime.ActivityStarter.ExtraKey
void ExtraKey(String extraKey)
Definition: ActivityStarter.java:231
com.google.appinventor.components.common.PropertyTypeConstants
Definition: PropertyTypeConstants.java:14
com.google.appinventor.components.annotations
com.google.appinventor.components.runtime.ActivityStarter.StartActivity
void StartActivity()
Definition: ActivityStarter.java:473
com.google.appinventor.components.runtime.util.YailList.size
int size()
Definition: YailList.java:172
com.google.appinventor.components.runtime.ActivityStarter.ActivityClass
void ActivityClass(String activityClass)
Definition: ActivityStarter.java:376
com.google.appinventor