507 lines
38 KiB
Java
507 lines
38 KiB
Java
/*
|
|
* This program and the accompanying materials
|
|
* are made available under the terms of the Eclipse Public License v1.0
|
|
* which accompanies this distribution, and is available at
|
|
* http://www.eclipse.org/legal/epl-v10.html.
|
|
*
|
|
* This file is a derivative of code released under the terms listed below.
|
|
*
|
|
*/
|
|
/*
|
|
* Copyright (c) 2013,
|
|
* Tobias Blaschke <code@tobiasblaschke.de>
|
|
* All rights reserved.
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are met:
|
|
*
|
|
* 1. Redistributions of source code must retain the above copyright notice,
|
|
* this list of conditions and the following disclaimer.
|
|
*
|
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
* this list of conditions and the following disclaimer in the documentation
|
|
* and/or other materials provided with the distribution.
|
|
*
|
|
* 3. The names of the contributors may not be used to endorse or promote
|
|
* products derived from this software without specific prior written
|
|
* permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
package com.ibm.wala.dalvik.ipa.callgraph.propagation.cfa;
|
|
|
|
import java.util.Collections;
|
|
import java.util.EnumSet;
|
|
import java.util.HashMap;
|
|
import java.util.Set;
|
|
|
|
import com.ibm.wala.dalvik.ipa.callgraph.propagation.cfa.Intent.IntentType;
|
|
import com.ibm.wala.dalvik.util.AndroidComponent;
|
|
import com.ibm.wala.dalvik.util.AndroidTypes;
|
|
import com.ibm.wala.ipa.cha.IClassHierarchy;
|
|
import com.ibm.wala.types.ClassLoaderReference;
|
|
import com.ibm.wala.types.MethodReference;
|
|
import com.ibm.wala.types.Selector;
|
|
import com.ibm.wala.types.TypeReference;
|
|
import com.ibm.wala.util.collections.HashMapFactory;
|
|
|
|
/**
|
|
* Contains Information on functions that start Android-Components based on an Intent.
|
|
*
|
|
* This is used by the IntentContextSelector to add an IntentContext to this Methods.
|
|
*
|
|
* TODO:
|
|
* @todo Fill in better values for targetAccuracy and componentType
|
|
* @todo Add declaring class
|
|
* @author Tobias Blaschke <code@tobiasblaschke.de>
|
|
* @since 1013-10-16
|
|
*/
|
|
public class IntentStarters {
|
|
/**
|
|
* The flags influence the later model.
|
|
*/
|
|
public enum StarterFlags {
|
|
/**
|
|
* Call the function onActivityResult of the calling Activity.
|
|
*/
|
|
CALL_ON_ACTIVITY_RESULT,
|
|
/**
|
|
* The intent is started using other permissions as the caller has.
|
|
*
|
|
* This is used with startIntentSender
|
|
*/
|
|
QUENCH_PERMISSIONS,
|
|
/**
|
|
* For internal use only.
|
|
*
|
|
* Used during the "boot process" and when installing the context free overrides.
|
|
*/
|
|
CONTEXT_FREE,
|
|
}
|
|
|
|
/** Handling IntentSenders causes issues */
|
|
private final boolean doIntentSender = true;
|
|
|
|
|
|
/**
|
|
* Contains information on how to call a starter-function.
|
|
*/
|
|
public static class StartInfo {
|
|
private final Set<IntentType> targetAccuracy;
|
|
/** used to dispatch to the correct MiniModel if intent-target could not be retreived */
|
|
private final Set<AndroidComponent> componentType;
|
|
/** relevant for the IntentContextSelector */
|
|
private final int[] relevantParameters;
|
|
private final Set<StarterFlags> flags;
|
|
private final TypeReference declaringClass;
|
|
|
|
StartInfo (final TypeReference declaringClass, final Set<IntentType> targetAccuracy, final Set<AndroidComponent> componentType,
|
|
final int[] relevantParameters) {
|
|
this(declaringClass, targetAccuracy, componentType, relevantParameters, EnumSet.noneOf(StarterFlags.class));
|
|
}
|
|
|
|
StartInfo (final TypeReference declaringClass, final Set<IntentType> targetAccuracy, final Set<AndroidComponent> componentType,
|
|
final int[] relevantParameters, final Set<StarterFlags> flags) {
|
|
this.declaringClass = declaringClass;
|
|
this.targetAccuracy = targetAccuracy;
|
|
this.componentType = componentType;
|
|
this.relevantParameters = relevantParameters;
|
|
this.flags = flags;
|
|
}
|
|
|
|
public static StartInfo makeContextFree(final AndroidComponent component) {
|
|
final Set<AndroidComponent> compo = (component == null)?Collections.EMPTY_SET:EnumSet.of(component);
|
|
return new IntentStarters.StartInfo(null, EnumSet.of(IntentType.UNKNOWN_TARGET), compo, new int[0],
|
|
EnumSet.of(StarterFlags.CONTEXT_FREE));
|
|
}
|
|
|
|
/**
|
|
* Set the CONTEXT_FREE Flag.
|
|
*/
|
|
public void setContextFree() {
|
|
this.flags.add(StarterFlags.CONTEXT_FREE);
|
|
}
|
|
|
|
/**
|
|
* The parameters the ContextSelecor shall remember.
|
|
*/
|
|
public int[] getRelevant() {
|
|
return relevantParameters;
|
|
}
|
|
|
|
public TypeReference getDeclaringClass() {
|
|
return this.declaringClass;
|
|
}
|
|
|
|
/**
|
|
* These influence how the model is built.
|
|
*
|
|
* @see com.ibm.wala.dalvik.ipa.callgraph.propagation.cfa.IntentStarters.StarterFlags
|
|
*/
|
|
public Set<StarterFlags> getFlags() {
|
|
return this.flags;
|
|
}
|
|
|
|
/**
|
|
* Target-Types that may started by this.
|
|
*
|
|
* Although a set of multiple Components may be returned in most cases it is only one
|
|
* type.
|
|
*/
|
|
public Set<AndroidComponent> getComponentsPossible() {
|
|
return this.componentType;
|
|
}
|
|
|
|
public boolean isSystemService() {
|
|
return this.targetAccuracy.contains(IntentType.SYSTEM_SERVICE); // XXX Nah.. not so nice :(
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
return "<StartInfo flags=" + flags + " to possible " + componentType + " with allowed Accuracies of " + targetAccuracy + "/>";
|
|
}
|
|
}
|
|
|
|
private final HashMap<Selector, StartInfo> starters = HashMapFactory.make();
|
|
|
|
public boolean isStarter(MethodReference mRef) {
|
|
return starters.containsKey(mRef.getSelector());
|
|
}
|
|
|
|
public StartInfo getInfo(MethodReference mRef) {
|
|
return starters.get(mRef.getSelector());
|
|
}
|
|
|
|
public StartInfo getInfo(Selector mSel) {
|
|
return starters.get(mSel);
|
|
}
|
|
|
|
|
|
public Set<Selector> getKnownMethods() {
|
|
return starters.keySet();
|
|
}
|
|
|
|
public IntentStarters(IClassHierarchy cha) {
|
|
final ClassLoaderReference searchLoader = ClassLoaderReference.Primordial;
|
|
final TypeReference tContextWrapper = TypeReference.find(searchLoader, "Landroid/content/ContextWrapper");
|
|
final TypeReference tContext = TypeReference.find(searchLoader, "Landroid/content/Context");
|
|
final TypeReference tActivity = TypeReference.find(searchLoader, "Landroid/app/Activity");
|
|
|
|
// Stubs may be to old for:
|
|
final boolean doFragments = (cha.lookupClass(AndroidTypes.Fragment) != null);
|
|
final boolean doUsers = (cha.lookupClass(AndroidTypes.UserHandle) != null);
|
|
|
|
if (! doFragments) {
|
|
System.out.println("WARNING: IntentStarters skipping starters with Fragments - Stubs to old!");
|
|
}
|
|
if (! doUsers) {
|
|
System.out.println("WARNING: IntentStarters skipping starters with UserHandles - Stubs to old!");
|
|
}
|
|
|
|
|
|
// This does not belong here:
|
|
/*
|
|
starters.put(Selector.make("getSystemService(Ljava/lang/String;)Ljava/lang/Object;"),
|
|
new StartInfo(tContext, EnumSet.of(IntentType.EXTERNAL_TARGET), EnumSet.of(AndroidComponent.SERVICE), new int[] {1}));
|
|
starters.put(Selector.make("getSystemService(Ljava/lang/String;)Ljava/lang/Object;"),
|
|
new StartInfo(tActivity, EnumSet.of(IntentType.EXTERNAL_TARGET), EnumSet.of(AndroidComponent.SERVICE), new int[] {1}));
|
|
*/
|
|
|
|
|
|
// android.content.ContextWrapper.bindService(Intent service, ServiceConnection conn, int flags)
|
|
starters.put(/*MethodReference.findOrCreate(tContextWrapper,*/ Selector.make("bindService(Landroid/content/Intent;Landroid/content/ServiceConnection;I)Z"),
|
|
new StartInfo(tContextWrapper, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.SERVICE), new int[] {1}));
|
|
// Delegates directly to android.content.Context.bindService
|
|
// android.content.ContextWrapper.sendBroadcast(Intent intent)
|
|
starters.put( /* MethodReference.findOrCreate(tContextWrapper, */ Selector.make("sendBroadcast(Landroid/content/Intent;)V"),
|
|
new StartInfo(tContextWrapper, EnumSet.of(IntentType.BROADCAST), EnumSet.of(AndroidComponent.BROADCAST_RECEIVER), new int[] {1}));
|
|
// Delegates directly to android.content.Context.
|
|
// android.content.ContextWrapper.sendBroadcast(Intent intent, String receiverPermission)
|
|
starters.put( /* MethodReference.findOrCreate(tContextWrapper, */ Selector.make("sendBroadcast(Landroid/content/Intent;Ljava/lang/String;)V"),
|
|
new StartInfo(tContextWrapper, EnumSet.of(IntentType.BROADCAST), EnumSet.of(AndroidComponent.BROADCAST_RECEIVER), new int[] {1}));
|
|
// Delegates directly to android.content.Context.
|
|
if (doUsers) {
|
|
// android.content.ContextWrapper.sendBroadcastAsUser(Intent intent, UserHandle user)
|
|
starters.put( /* MethodReference.findOrCreate(tContextWrapper, */ Selector.make("sendBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)V"),
|
|
new StartInfo(tContextWrapper, EnumSet.of(IntentType.BROADCAST), EnumSet.of(AndroidComponent.BROADCAST_RECEIVER), new int[] {1}));
|
|
// Delegates directly to android.content.Context.
|
|
// android.content.ContextWrapper.sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission)
|
|
starters.put( /* MethodReference.findOrCreate(tContextWrapper, */ Selector.make("sendBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Ljava/lang/String;)V"),
|
|
new StartInfo(tContextWrapper, EnumSet.of(IntentType.BROADCAST), EnumSet.of(AndroidComponent.BROADCAST_RECEIVER), new int[] {1}));
|
|
// Delegates directly to android.content.Context.
|
|
}
|
|
// android.content.ContextWrapper.sendOrderedBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver,
|
|
// Handler scheduler, int initialCode, String initialData, Bundle initialExtras)
|
|
starters.put( /* MethodReference.findOrCreate(tContextWrapper, */ Selector.make(
|
|
"sendOrderedBroadcast(Landroid/content/Intent;Ljava/lang/String;Landroid/content/BroadcastReceiver;Landroid/os/Handler;I" +
|
|
"Ljava/lang/String;Landroid/os/Bundle;)V"),
|
|
new StartInfo(tContextWrapper, EnumSet.of(IntentType.BROADCAST), EnumSet.of(AndroidComponent.BROADCAST_RECEIVER), new int[] {1}));
|
|
// Delegates directly to android.content.Context.
|
|
// android.content.ContextWrapper.sendOrderedBroadcast(Intent intent, String receiverPermission)
|
|
starters.put( /* MethodReference.findOrCreate(tContextWrapper, */ Selector.make("sendOrderedBroadcast(Landroid/content/Intent;Ljava/lang/String;)V"),
|
|
new StartInfo(tContextWrapper, EnumSet.of(IntentType.BROADCAST), EnumSet.of(AndroidComponent.BROADCAST_RECEIVER), new int[] {1}));
|
|
// Delegates directly to android.content.Context.
|
|
if (doUsers) {
|
|
// android.content.ContextWrapper.sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission,
|
|
// BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)
|
|
starters.put( /* MethodReference.findOrCreate(tContextWrapper, */ Selector.make(
|
|
"sendOrderedBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Ljava/lang/String;Landroid/content/BroadcastReceiver;" +
|
|
"Landroid/os/Handler;ILjava/lang/String;Landroid/os/Bundle;)V"),
|
|
new StartInfo(tContextWrapper, EnumSet.of(IntentType.BROADCAST), EnumSet.of(AndroidComponent.BROADCAST_RECEIVER), new int[] {1}));
|
|
// Delegates directly to android.content.Context.
|
|
}
|
|
// android.content.ContextWrapper.sendStickyBroadcast(Intent intent)
|
|
starters.put( /* MethodReference.findOrCreate(tContextWrapper, */ Selector.make("sendStickyBroadcast(Landroid/content/Intent;)V"),
|
|
new StartInfo(tContextWrapper, EnumSet.of(IntentType.BROADCAST), EnumSet.of(AndroidComponent.BROADCAST_RECEIVER), new int[] {1}));
|
|
// Delegates directly to android.content.Context.
|
|
if (doUsers) {
|
|
// android.content.ContextWrapper.sendStickyBroadcastAsUser(Intent intent, UserHandle user)
|
|
starters.put( /* MethodReference.findOrCreate(tContextWrapper, */ Selector.make("sendStickyBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)V"),
|
|
new StartInfo(tContextWrapper, EnumSet.of(IntentType.BROADCAST), EnumSet.of(AndroidComponent.BROADCAST_RECEIVER), new int[] {1}));
|
|
// Delegates directly to android.content.Context.
|
|
}
|
|
// android.content.ContextWrapper.sendStickyOrderedBroadcast(Intent intent, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
|
|
// String initialData, Bundle initialExtras)
|
|
starters.put( /* MethodReference.findOrCreate(tContextWrapper, */ Selector.make(
|
|
"sendStickyOrderedBroadcast(Landroid/content/Intent;Ljava/lang/String;Landroid/content/BroadcastReceiver;Landroid/os/Handler;" +
|
|
"ILjava/lang/String;Landroid/os/Bundle;)V"),
|
|
new StartInfo(tContextWrapper, EnumSet.of(IntentType.BROADCAST), EnumSet.of(AndroidComponent.BROADCAST_RECEIVER), new int[] {1}));
|
|
// Delegates directly to android.content.Context.
|
|
if (doUsers) {
|
|
// android.content.ContextWrapper.sendStickyOrderedBroadcastAsUser(Intent intent, UserHandle user, BroadcastReceiver resultReceiver,
|
|
// Handler scheduler, int initialCode, String initialData, Bundle initialExtras)
|
|
starters.put( /* MethodReference.findOrCreate(tContextWrapper, */ Selector.make(
|
|
"sendStickyOrderedBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Landroid/content/BroadcastReceiver;" +
|
|
"Landroid/os/Handler;ILjava/lang/String;Landroid/os/Bundle;)V"),
|
|
new StartInfo(tContextWrapper, EnumSet.of(IntentType.BROADCAST), EnumSet.of(AndroidComponent.BROADCAST_RECEIVER), new int[] {1}));
|
|
// Delegates directly to android.content.Context.
|
|
}
|
|
// android.content.ContextWrapper.startActivities(Intent[] intents)
|
|
starters.put( /* MethodReference.findOrCreate(tContextWrapper, */ Selector.make("startActivities([Landroid/content/Intent;)V"),
|
|
new StartInfo(tContextWrapper, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1}));
|
|
// Delegates directly to android.content.Context.
|
|
// android.content.ContextWrapper.startActivities(Intent[] intents, Bundle options)
|
|
starters.put( /* MethodReference.findOrCreate(tContextWrapper, */ Selector.make("startActivities([Landroid/content/Intent;Landroid/os/Bundle;)V"),
|
|
new StartInfo(tContextWrapper, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1}));
|
|
// Delegates directly to android.content.Context.
|
|
// android.content.ContextWrapper.startActivity(Intent intent)
|
|
starters.put( /* MethodReference.findOrCreate(tContextWrapper, */ Selector.make("startActivity(Landroid/content/Intent;)V"),
|
|
new StartInfo(tContextWrapper, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1}));
|
|
// Delegates directly to android.content.Context.
|
|
// android.content.ContextWrapper.startActivity(Intent intents, Bundle options)
|
|
starters.put( /* MethodReference.findOrCreate(tContextWrapper, */ Selector.make("startActivity(Landroid/content/Intent;Landroid/os/Bundle;)V"),
|
|
new StartInfo(tContextWrapper, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1}));
|
|
// Delegates directly to android.content.Context.
|
|
if (doIntentSender) {
|
|
// android.content.ContextWrapper.startIntentSender(IntentSender intent, Intent fillInIntent, int flagsMask, int flagsValues,
|
|
// int extraFlags, Bundle options)
|
|
starters.put( /* MethodReference.findOrCreate(tContextWrapper, */ Selector.make( // TODO
|
|
"startIntentSender(Landroid/content/IntentSender;Landroid/content/Intent;IIILandroid/os/Bundle;)V"),
|
|
new StartInfo(tContextWrapper, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1, 2},
|
|
EnumSet.of(StarterFlags.QUENCH_PERMISSIONS)));
|
|
// Delegates directly to android.content.Context.
|
|
// android.content.ContextWrapper.startIntentSender(IntentSender intent, Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
|
|
starters.put( /* MethodReference.findOrCreate(tContextWrapper, */ Selector.make( // TODO
|
|
"startIntentSender(Landroid/content/IntentSender;Landroid/content/Intent;III)V"),
|
|
new StartInfo(tContextWrapper, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1, 2},
|
|
EnumSet.of(StarterFlags.QUENCH_PERMISSIONS)));
|
|
// Delegates directly to android.content.Context.
|
|
}
|
|
// android.content.ContextWrapper.startService(Intent service)
|
|
starters.put( /* MethodReference.findOrCreate(tContextWrapper, */ Selector.make("startService(Landroid/content/Intent;)Landroid/content/ComponentName;"),
|
|
new StartInfo(tContextWrapper, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.SERVICE), new int[] {1}));
|
|
// Delegates directly to android.content.Context.
|
|
|
|
|
|
// android.content.Context.bindService(Intent service, ServiceConnection conn, int flags)
|
|
starters.put( /* MethodReference.findOrCreate(tContext, */ Selector.make("bindService(Landroid/content/Intent;Landroid/content/ServiceConnection;I)Z"),
|
|
new StartInfo(tContext, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.SERVICE), new int[] {1}));
|
|
// android.content.Context.sendBroadcast(Intent intent)
|
|
starters.put( /* MethodReference.findOrCreate(tContext, */ Selector.make("sendBroadcast(Landroid/content/Intent;)V"),
|
|
new StartInfo(tContext, EnumSet.of(IntentType.BROADCAST), EnumSet.of(AndroidComponent.BROADCAST_RECEIVER), new int[] {1}));
|
|
// android.content.Context.sendBroadcast(Intent intent, String receiverPermission)
|
|
starters.put( /* MethodReference.findOrCreate(tContext, */ Selector.make("sendBroadcast(Landroid/content/Intent;Ljava/lang/String;)V"),
|
|
new StartInfo(tContext, EnumSet.of(IntentType.BROADCAST), EnumSet.of(AndroidComponent.BROADCAST_RECEIVER), new int[] {1}));
|
|
if (doUsers) {
|
|
// android.content.Context.sendBroadcastAsUser(Intent intent, UserHandle user)
|
|
starters.put( /* MethodReference.findOrCreate(tContext, */ Selector.make("sendBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)V"),
|
|
new StartInfo(tContext, EnumSet.of(IntentType.BROADCAST), EnumSet.of(AndroidComponent.BROADCAST_RECEIVER), new int[] {1}));
|
|
// android.content.Context.sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission)
|
|
starters.put( /* MethodReference.findOrCreate(tContext, */ Selector.make("sendBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Ljava/lang/String;)V"),
|
|
new StartInfo(tContext, EnumSet.of(IntentType.BROADCAST), EnumSet.of(AndroidComponent.BROADCAST_RECEIVER), new int[] {1}));
|
|
}
|
|
// android.content.Context.sendOrderedBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver,
|
|
// Handler scheduler, int initialCode, String initialData, Bundle initialExtras)
|
|
starters.put( /* MethodReference.findOrCreate(tContext, */ Selector.make(
|
|
"sendOrderedBroadcast(Landroid/content/Intent;Ljava/lang/String;Landroid/content/BroadcastReceiver;Landroid/os/Handler;I" +
|
|
"Ljava/lang/String;Landroid/os/Bundle;)V"),
|
|
new StartInfo(tContext, EnumSet.of(IntentType.BROADCAST), EnumSet.of(AndroidComponent.BROADCAST_RECEIVER), new int[] {1}));
|
|
// android.content.Context.sendOrderedBroadcast(Intent intent, String receiverPermission)
|
|
starters.put( /* MethodReference.findOrCreate(tContext, */ Selector.make("sendOrderedBroadcast(Landroid/content/Intent;Ljava/lang/String;)V"),
|
|
new StartInfo(tContext, EnumSet.of(IntentType.BROADCAST), EnumSet.of(AndroidComponent.BROADCAST_RECEIVER), new int[] {1}));
|
|
if (doUsers) {
|
|
// android.content.Context.sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission,
|
|
// BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)
|
|
starters.put( /* MethodReference.findOrCreate(tContext, */ Selector.make(
|
|
"sendOrderedBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Ljava/lang/String;Landroid/content/BroadcastReceiver;" +
|
|
"Landroid/os/Handler;ILjava/lang/String;Landroid/os/Bundle;)V"),
|
|
new StartInfo(tContext, EnumSet.of(IntentType.BROADCAST), EnumSet.of(AndroidComponent.BROADCAST_RECEIVER), new int[] {1}));
|
|
// android.content.Context.sendStickyBroadcast(Intent intent)
|
|
starters.put( /* MethodReference.findOrCreate(tContext, */ Selector.make("sendStickyBroadcast(Landroid/content/Intent;)V"),
|
|
new StartInfo(tContext, EnumSet.of(IntentType.BROADCAST), EnumSet.of(AndroidComponent.BROADCAST_RECEIVER), new int[] {1}));
|
|
// android.content.Context.sendStickyBroadcastAsUser(Intent intent, UserHandle user)
|
|
starters.put( /* MethodReference.findOrCreate(tContext, */ Selector.make("sendStickyBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)V"),
|
|
new StartInfo(tContext, EnumSet.of(IntentType.BROADCAST), EnumSet.of(AndroidComponent.BROADCAST_RECEIVER), new int[] {1}));
|
|
}
|
|
// android.content.Context.sendStickyOrderedBroadcast(Intent intent, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
|
|
// String initialData, Bundle initialExtras)
|
|
starters.put( /* MethodReference.findOrCreate(tContext, */ Selector.make(
|
|
"sendStickyOrderedBroadcast(Landroid/content/Intent;Ljava/lang/String;Landroid/content/BroadcastReceiver;Landroid/os/Handler;" +
|
|
"ILjava/lang/String;Landroid/os/Bundle;)V"),
|
|
new StartInfo(tContext, EnumSet.of(IntentType.BROADCAST), EnumSet.of(AndroidComponent.BROADCAST_RECEIVER), new int[] {1}));
|
|
if (doUsers) {
|
|
// android.content.Context.sendStickyOrderedBroadcastAsUser(Intent intent, UserHandle user, BroadcastReceiver resultReceiver,
|
|
// Handler scheduler, int initialCode, String initialData, Bundle initialExtras)
|
|
starters.put( /* MethodReference.findOrCreate(tContext, */ Selector.make(
|
|
"sendStickyOrderedBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Landroid/content/BroadcastReceiver;" +
|
|
"Landroid/os/Handler;ILjava/lang/String;Landroid/os/Bundle;)V"),
|
|
new StartInfo(tContext, EnumSet.of(IntentType.BROADCAST), EnumSet.of(AndroidComponent.BROADCAST_RECEIVER), new int[] {1}));
|
|
}
|
|
// android.content.Context.startActivities(Intent[] intents)
|
|
starters.put( /* MethodReference.findOrCreate(tContext, */ Selector.make("startActivities([Landroid/content/Intent;)V"),
|
|
new StartInfo(tContext, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1}));
|
|
// android.content.Context.startActivities(Intent[] intents, Bundle options)
|
|
starters.put( /* MethodReference.findOrCreate(tContext, */ Selector.make("startActivities([Landroid/content/Intent;Landroid/os/Bundle;)V"),
|
|
new StartInfo(tContext, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1}));
|
|
// android.content.Context.startActivity(Intent intent)
|
|
starters.put( /* MethodReference.findOrCreate(tContext, */ Selector.make("startActivity(Landroid/content/Intent;)V"),
|
|
new StartInfo(tContext, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1}));
|
|
// android.content.Context.startActivity(Intent intents, Bundle options)
|
|
starters.put( /* MethodReference.findOrCreate(tContext, */ Selector.make("startActivity(Landroid/content/Intent;Landroid/os/Bundle;)V"),
|
|
new StartInfo(tContext, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1}));
|
|
if (doIntentSender) {
|
|
// android.content.Context.startIntentSender(IntentSender intent, Intent fillInIntent, int flagsMask, int flagsValues,
|
|
// int extraFlags, Bundle options)
|
|
starters.put( /* MethodReference.findOrCreate(tContext, */ Selector.make( // TODO
|
|
"startIntentSender(Landroid/content/IntentSender;Landroid/content/Intent;IIILandroid/os/Bundle;)V"),
|
|
new StartInfo(tContext, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1, 2},
|
|
EnumSet.of(StarterFlags.QUENCH_PERMISSIONS)));
|
|
// android.content.Context.startIntentSender(IntentSender intent, Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
|
|
starters.put( /* MethodReference.findOrCreate(tContext, */ Selector.make( // TODO
|
|
"startIntentSender(Landroid/content/IntentSender;Landroid/content/Intent;III)V"),
|
|
new StartInfo(tContext, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1, 2},
|
|
EnumSet.of(StarterFlags.QUENCH_PERMISSIONS)));
|
|
}
|
|
// android.content.Context.startService(Intent service)
|
|
starters.put( /* MethodReference.findOrCreate(tContext, */ Selector.make("startService(Landroid/content/Intent;)Landroid/content/ComponentName;"),
|
|
new StartInfo(tContext, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.SERVICE), new int[] {1}));
|
|
|
|
|
|
// android.app.Activity.startActivities(Intent[] intents)
|
|
starters.put( /* MethodReference.findOrCreate(tActivity, */ Selector.make("startActivities([Landroid/content/Intent;)V"),
|
|
new StartInfo(tActivity, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1}));
|
|
// android.app.Activity.startActivities(Intent[] intents, Bundle options)
|
|
starters.put( /* MethodReference.findOrCreate(tActivity, */ Selector.make("startActivities([Landroid/content/Intent;Landroid/os/Bundle;)V"),
|
|
new StartInfo(tActivity, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1}));
|
|
// android.app.Activity.startActivity(Intent intent)
|
|
starters.put( /* MethodReference.findOrCreate(tActivity, */ Selector.make("startActivity(Landroid/content/Intent;)V"),
|
|
new StartInfo(tActivity, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1}));
|
|
// android.app.Activity.startActivity(Intent intents, Bundle options)
|
|
starters.put( /* MethodReference.findOrCreate(tActivity, */ Selector.make("startActivity(Landroid/content/Intent;Landroid/os/Bundle;)V"),
|
|
new StartInfo(tActivity, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1}));
|
|
// android.app.Activity.startActivityForResult(Intent intent, int requestCode)
|
|
starters.put( /* MethodReference.findOrCreate(tActivity, */ Selector.make("startActivityForResult(Landroid/content/Intent;I)V"),
|
|
new StartInfo(tActivity, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1},
|
|
EnumSet.of(StarterFlags.CALL_ON_ACTIVITY_RESULT)));
|
|
// android.app.Activity.startActivityForResult(Intent intent, int requestCode, Bundle options)
|
|
starters.put( /* MethodReference.findOrCreate(tActivity, */ Selector.make("startActivityForResult(Landroid/content/Intent;ILandroid/os/Bundle;)V"),
|
|
new StartInfo(tActivity, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1},
|
|
EnumSet.of(StarterFlags.CALL_ON_ACTIVITY_RESULT)));
|
|
// android.app.Activity.startActivityFromChild(Activity child, Intent intent, int requestCode)
|
|
starters.put( /* MethodReference.findOrCreate(tActivity, */ Selector.make("startActivityFromChild(Landroid/app/Activity;Landroid/content/Intent;I)V"),
|
|
new StartInfo(tActivity, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1}));
|
|
// android.app.Activity.startActivityFromChild(Activity child, Intent intent, int requestCode, Bundle options)
|
|
starters.put( /* MethodReference.findOrCreate(tActivity, */ Selector.make("startActivityFromChild(Landroid/app/Activity;Landroid/content/Intent;ILandroid/os/Bundle;)V"),
|
|
new StartInfo(tActivity, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1}));
|
|
if (doFragments) {
|
|
// android.app.Activity.startActivityFromFragment(Fragment fragment, Intent intent, int requestCode)
|
|
starters.put( /* MethodReference.findOrCreate(tActivity, */ Selector.make("startActivityFromFragment(Landroid/app/Fragment;Landroid/content/Intent;I)V"),
|
|
new StartInfo(tActivity, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1}));
|
|
// android.app.Activity.startActivityFromFragment(Fragment fragment, Intent intent, int requestCode, Bundle options)
|
|
starters.put( /* MethodReference.findOrCreate(tActivity, */ Selector.make("startActivityFromFragment(Landroid/app/Fragment;Landroid/content/Intent;ILandroid/os/Bundle;)V"),
|
|
new StartInfo(tActivity, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1}));
|
|
}
|
|
// android.app.Activity.startActivityIfNeeded(Intent intent, int requestCode)
|
|
starters.put( /* MethodReference.findOrCreate(tActivity, */ Selector.make("startActivityIfNeeded(Landroid/content/Intent;I)Z"),
|
|
new StartInfo(tActivity, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1}));
|
|
// android.app.Activity.startActivityIfNeeded(Intent intent, int requestCode, Bundle options)
|
|
starters.put( /* MethodReference.findOrCreate(tActivity, */ Selector.make("startActivityIfNeeded(Landroid/content/Intent;ILandroid/os/Bundle;)Z"),
|
|
new StartInfo(tActivity, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1}));
|
|
if (doIntentSender) {
|
|
// android.app.Activity.startIntentSender(IntentSender intent, Intent fillInIntent, int flagsMask, int flagsValues,
|
|
// int extraFlags, Bundle options)
|
|
starters.put( /* MethodReference.findOrCreate(tActivity, */ Selector.make( // TODO
|
|
"startIntentSender(Landroid/content/IntentSender;Landroid/content/Intent;IIILandroid/os/Bundle;)V"),
|
|
new StartInfo(tActivity, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1, 2},
|
|
EnumSet.of(StarterFlags.QUENCH_PERMISSIONS)));
|
|
// android.app.Activity.startIntentSender(IntentSender intent, Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
|
|
starters.put( /* MethodReference.findOrCreate(tActivity, */ Selector.make( // TODO
|
|
"startIntentSender(Landroid/content/IntentSender;Landroid/content/Intent;III)V"),
|
|
new StartInfo(tActivity, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1, 2},
|
|
EnumSet.of(StarterFlags.QUENCH_PERMISSIONS)));
|
|
// android.app.Activity.startIntentSenderForResult(IntentSender intent, int requestCode, Intent fillInIntent,
|
|
// int flagsMask, int flagsValues, int extraFlags, Bundle options)
|
|
starters.put( /* MethodReference.findOrCreate(tActivity, */ Selector.make( // TODO
|
|
"startIntentSenderForResult(Landroid/content/IntentSender;ILandroid/content/Intent;IIILandroid/os/Bundle;)V"),
|
|
new StartInfo(tActivity, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1, 2},
|
|
EnumSet.of(StarterFlags.CALL_ON_ACTIVITY_RESULT, StarterFlags.QUENCH_PERMISSIONS)));
|
|
// android.app.Activity.startIntentSenderForResult(IntentSender intent, int requestCode, Intent fillInIntent,
|
|
// int flagsMask, int flagsValues, int extraFlags)
|
|
starters.put( /* MethodReference.findOrCreate(tActivity, */ Selector.make( // TODO
|
|
"startIntentSenderForResult(Landroid/content/IntentSender;ILandroid/content/Intent;III)V"),
|
|
new StartInfo(tActivity, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1, 2},
|
|
EnumSet.of(StarterFlags.CALL_ON_ACTIVITY_RESULT, StarterFlags.QUENCH_PERMISSIONS)));
|
|
// android.app.Activity.startIntentSenderFromChild(Activity child, IntentSender intent, int requestCode,
|
|
// Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
|
|
starters.put( /* MethodReference.findOrCreate(tActivity, */ Selector.make( // TODO
|
|
"startIntentSenderFromChild(Landroid/app/Activity;Landroid/content/IntentSender;ILandroid/content/Intent;III)V"),
|
|
new StartInfo(tActivity, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1, 2},
|
|
EnumSet.of(StarterFlags.QUENCH_PERMISSIONS)));
|
|
// android.app.Activity.startIntentSenderFromChild(Activity child, IntentSender intent, int requestCode,
|
|
// Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags, Bundle options)
|
|
starters.put( /* MethodReference.findOrCreate(tActivity, */ Selector.make( // TODO
|
|
"startIntentSenderFromChild(Landroid/app/Activity;Landroid/content/IntentSender;ILandroid/content/Intent;IIILandroid/os/Bundle;)V"),
|
|
new StartInfo(tActivity, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1, 2},
|
|
EnumSet.of(StarterFlags.QUENCH_PERMISSIONS)));
|
|
}
|
|
// android.app.Activity.startNextMatchingActivity(Intent intent)
|
|
starters.put( /* MethodReference.findOrCreate(tActivity, */ Selector.make("startNextMatchingActivity(Landroid/content/Intent;)Z"),
|
|
new StartInfo(tActivity, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1}));
|
|
// android.app.Activity.startActivity(Intent intents, Bundle options)
|
|
starters.put( /* MethodReference.findOrCreate(tActivity, */ Selector.make("startNextMatchingActivity(Landroid/content/Intent;Landroid/os/Bundle;)Z"),
|
|
new StartInfo(tActivity, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1}));
|
|
|
|
if (doFragments) {
|
|
final TypeReference tFragmentActivity = TypeReference.find(searchLoader, "Landroid/support/v4/app/FragmentActivity");
|
|
// android.support.v4.app.FragmentActivity.startActivityForResult(Intent intent, int requestCode)
|
|
starters.put( /* MethodReference.findOrCreate(tActivity, */ Selector.make("startActivityForResult(Landroid/content/Intent;I)Z"),
|
|
new StartInfo(tFragmentActivity, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1},
|
|
EnumSet.of(StarterFlags.CALL_ON_ACTIVITY_RESULT)));
|
|
// android.support.v4.app.startActivityFromFragment(Fragment fragment, Intent intent, int requestCode)
|
|
starters.put( /* MethodReference.findOrCreate(tActivity, */ Selector.make("startActivityFromFragment(Landroid/app/Fragment;Landroid/content/Intent;I)Z"),
|
|
new StartInfo(tFragmentActivity, EnumSet.of(IntentType.UNKNOWN_TARGET), EnumSet.of(AndroidComponent.ACTIVITY), new int[] {1}));
|
|
}
|
|
|
|
}
|
|
}
|