blob: aa85cc9d7d8e50a54b0239c8c5fcee08c9118b08 [file] [log] [blame]
package org.robolectric.manifest;
import android.content.pm.ActivityInfo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ActivityData {
private static final String ALLOW_TASK_REPARENTING = "allowTaskReparenting";
private static final String ALWAYS_RETAIN_TASK_STATE = "alwaysRetainTaskState";
private static final String CLEAR_TASK_ON_LAUNCH = "clearTaskOnLaunch";
private static final String CONFIG_CHANGES = "configChanges";
private static final String ENABLED = "enabled";
private static final String EXCLUDE_FROM_RECENTS = "excludeFromRecents";
private static final String EXPORTED = "exported";
private static final String FINISH_ON_TASK_LAUNCH = "finishOnTaskLaunch";
private static final String HARDWARE_ACCELERATED = "hardwareAccelerated";
private static final String ICON = "icon";
private static final String LABEL = "label";
private static final String LAUNCH_MODE = "launchMode";
private static final String MULTIPROCESS = "multiprocess";
private static final String NAME = "name";
private static final String NO_HISTORY = "noHistory";
private static final String PARENT_ACTIVITY_NAME = "parentActivityName";
private static final String PERMISSION = "permission";
private static final String PROCESS = "process";
private static final String SCREEN_ORIENTATION = "screenOrientation";
private static final String STATE_NOT_NEEDED = "stateNotNeeded";
private static final String TARGET_ACTIVITY = "targetActivity";
private static final String TASK_AFFINITY = "taskAffinity";
private static final String THEME = "theme";
private static final String UI_OPTIONS = "uiOptions";
private static final String WINDOW_SOFT_INPUT_MODE = "windowSoftInputMode";
private final List<IntentFilterData> intentFilters;
private final HashMap<String, String> attrs;
// Non-null only for activity-alias'es.
private final ActivityData targetActivity;
/**
* XML Namespace used for android.
*/
private final String xmlns;
private final MetaData metaData;
public ActivityData(Map<String, String> attrMap, List<IntentFilterData> intentFilters) {
this("android", attrMap, intentFilters);
}
public ActivityData(String xmlns, Map<String, String> attrMap, List<IntentFilterData> intentFilters) {
this(xmlns, attrMap, intentFilters, null, null);
}
public ActivityData(String xmlns, Map<String, String> attrMap, List<IntentFilterData> intentFilters,
ActivityData targetActivity, MetaData metaData) {
this.xmlns = xmlns;
attrs = new HashMap<>();
attrs.putAll(attrMap);
this.intentFilters = new ArrayList<>(intentFilters);
this.targetActivity = targetActivity;
this.metaData = metaData;
}
public boolean isAllowTaskReparenting() {
return getBooleanAttr(withXMLNS(ALLOW_TASK_REPARENTING), false);
}
public boolean isAlwaysRetainTaskState() {
return getBooleanAttr(withXMLNS(ALWAYS_RETAIN_TASK_STATE), false);
}
public boolean isClearTaskOnLaungh() {
return getBooleanAttr(withXMLNS(CLEAR_TASK_ON_LAUNCH), false);
}
/**
* @return Bit mask with the {@link android.content.pm.PackageManager} configuration changes flags.
*/
public int getConfigChanges() {
final String v = attrs.get(withXMLNS(CONFIG_CHANGES));
final String[] options = {"mcc", "mnc", "locale",
"touchscreen", "keyboard", "keyboardHidden",
"navigation", "screenLayout", "fontScale",
"uiMode", "orientation", "screenSize",
"smallestScreenSize"};
final int[] flags = {
ActivityInfo.CONFIG_MCC, ActivityInfo.CONFIG_MNC, ActivityInfo.CONFIG_LOCALE,
ActivityInfo.CONFIG_TOUCHSCREEN, ActivityInfo.CONFIG_KEYBOARD, ActivityInfo.CONFIG_KEYBOARD_HIDDEN,
ActivityInfo.CONFIG_NAVIGATION, ActivityInfo.CONFIG_SCREEN_LAYOUT, ActivityInfo.CONFIG_FONT_SCALE,
ActivityInfo.CONFIG_UI_MODE, ActivityInfo.CONFIG_ORIENTATION, ActivityInfo.CONFIG_SCREEN_SIZE,
ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE
};
return decodeOptions(v, options, flags);
}
public boolean isEnabled() {
return getBooleanAttr(withXMLNS(ENABLED), true);
}
public boolean isExcludedFromRecents() {
return getBooleanAttr(withXMLNS(EXCLUDE_FROM_RECENTS), false);
}
public boolean isExported() {
boolean defaultValue = false;
return getBooleanAttr(withXMLNS(EXPORTED), defaultValue);
}
public boolean isFinishOnTaskLaunch() {
return getBooleanAttr(withXMLNS(FINISH_ON_TASK_LAUNCH), false);
}
public boolean isHardwareAccelerated() {
return getBooleanAttr(withXMLNS(HARDWARE_ACCELERATED), false);
}
/* TODO: public boolean getIcon() {} */
public String getLabel() {
return attrs.get(withXMLNS(LABEL));
}
public String getLaunchMode() {
return attrs.get(withXMLNS(LAUNCH_MODE));
}
public boolean isMultiprocess() {
return getBooleanAttr(withXMLNS(MULTIPROCESS), false);
}
public String getName() {
return attrs.get(withXMLNS(NAME));
}
public boolean isNoHistory() {
return getBooleanAttr(withXMLNS(NO_HISTORY), false);
}
public String getParentActivityName() {
return attrs.get(withXMLNS(PARENT_ACTIVITY_NAME));
}
public String getPermission() {
return attrs.get(withXMLNS(PERMISSION));
}
public String getProcess() {
return attrs.get(withXMLNS(PROCESS));
}
public String getScreenOrientation() {
return attrs.get(withXMLNS(SCREEN_ORIENTATION));
}
public boolean isStateNotNeeded() {
return getBooleanAttr(withXMLNS(STATE_NOT_NEEDED), false);
}
public String getTargetActivityName() {
return attrs.get(withXMLNS(TARGET_ACTIVITY));
}
public String getTaskAffinity() {
return attrs.get(withXMLNS(TASK_AFFINITY));
}
/**
* Convenience accessor for value of android:THEME attribute.
*
* @return The theme attribute.
*/
public String getThemeRef() {
return attrs.get(withXMLNS(THEME));
}
public String getUIOptions() {
return attrs.get(withXMLNS(UI_OPTIONS));
}
public String getWindowSoftInputMode() {
return attrs.get(withXMLNS(WINDOW_SOFT_INPUT_MODE));
}
private boolean getBooleanAttr(String n, boolean defaultValue) {
return (attrs.containsKey(n) ? Boolean.parseBoolean(attrs.get(n)): defaultValue);
}
private String withXMLNS(String attr) {
return withXMLNS(xmlns, attr);
}
/**
* Convert a string like 'mcc|keyboard|touchscreen' into the
* correct integer.
* @param v String to decode
* @param possibleFlags Valid labels
* @param flagValues flags to or together for the result. Must be the same length as possibleFlags
* @return bitwise or of all the found flags
*/
private int decodeOptions(String v, String[] possibleFlags, int[] flagValues) {
int res = 0;
//quick sanity check.
if (v == null || "".equals(v)) {
return res;
}
String[] pieces = v.split("\\|");
for(String s : pieces) {
s = s.trim();
for(int i = 0; i < possibleFlags.length; i++) {
if (s.equals(possibleFlags[i])) {
res |= flagValues[i];
break;
}
}
}
return res;
}
/**
* Get the map for all attributes defined for the activity XML.
* @return map of attributes names to values from the manifest. Not null.
*/
public Map<String, String> getAllAttributes() {
return attrs;
}
/**
* Get the intent filters defined for activity.
* @return A list of intent filters. Not null.
*/
public List<IntentFilterData> getIntentFilters() {
return intentFilters;
}
public MetaData getMetaData() {
return metaData;
}
public ActivityData getTargetActivity() {
return targetActivity;
}
private static String withXMLNS(String xmlns, String attr) {
return String.format("%s:%s", xmlns, attr);
}
public static String getNameAttr(String xmlns) {
return withXMLNS(xmlns, NAME);
}
public static String getTargetAttr(String xmlns) {
return withXMLNS("android", TARGET_ACTIVITY);
}
}