am 2a96a389: am cf3580b0: Merge "Fix build." into lmp-dev
* commit '2a96a3890975a991cbd91e9444325b0ee879caae':
Fix build.
diff --git a/api/current.txt b/api/current.txt
index abf7ea2..6ea7109 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -7533,6 +7533,7 @@
field public static final java.lang.String ACTION_CHOOSER = "android.intent.action.CHOOSER";
field public static final java.lang.String ACTION_CLOSE_SYSTEM_DIALOGS = "android.intent.action.CLOSE_SYSTEM_DIALOGS";
field public static final java.lang.String ACTION_CONFIGURATION_CHANGED = "android.intent.action.CONFIGURATION_CHANGED";
+ field public static final java.lang.String ACTION_CONFIRM_DEVICE_CREDENTIAL = "android.intent.action.CONFIRM_DEVICE_CREDENTIAL";
field public static final java.lang.String ACTION_CREATE_DOCUMENT = "android.intent.action.CREATE_DOCUMENT";
field public static final java.lang.String ACTION_CREATE_SHORTCUT = "android.intent.action.CREATE_SHORTCUT";
field public static final java.lang.String ACTION_DATE_CHANGED = "android.intent.action.DATE_CHANGED";
@@ -7675,6 +7676,7 @@
field public static final java.lang.String EXTRA_CHANGED_PACKAGE_LIST = "android.intent.extra.changed_package_list";
field public static final java.lang.String EXTRA_CHANGED_UID_LIST = "android.intent.extra.changed_uid_list";
field public static final java.lang.String EXTRA_DATA_REMOVED = "android.intent.extra.DATA_REMOVED";
+ field public static final java.lang.String EXTRA_DETAILS = "android.intent.extra.DETAILS";
field public static final java.lang.String EXTRA_DOCK_STATE = "android.intent.extra.DOCK_STATE";
field public static final int EXTRA_DOCK_STATE_CAR = 2; // 0x2
field public static final int EXTRA_DOCK_STATE_DESK = 1; // 0x1
@@ -25092,11 +25094,13 @@
field public static final java.lang.String ACTION_SOUND_SETTINGS = "android.settings.SOUND_SETTINGS";
field public static final java.lang.String ACTION_SYNC_SETTINGS = "android.settings.SYNC_SETTINGS";
field public static final java.lang.String ACTION_USER_DICTIONARY_SETTINGS = "android.settings.USER_DICTIONARY_SETTINGS";
+ field public static final java.lang.String ACTION_VOICE_CONTROL_AIRPLANE_MODE = "android.settings.VOICE_CONTROL_AIRPLANE_MODE";
field public static final java.lang.String ACTION_WIFI_IP_SETTINGS = "android.settings.WIFI_IP_SETTINGS";
field public static final java.lang.String ACTION_WIFI_SETTINGS = "android.settings.WIFI_SETTINGS";
field public static final java.lang.String ACTION_WIRELESS_SETTINGS = "android.settings.WIRELESS_SETTINGS";
field public static final java.lang.String AUTHORITY = "settings";
field public static final java.lang.String EXTRA_ACCOUNT_TYPES = "account_types";
+ field public static final java.lang.String EXTRA_AIRPLANE_MODE_ENABLED = "airplane_mode_enabled";
field public static final java.lang.String EXTRA_AUTHORITIES = "authorities";
field public static final java.lang.String EXTRA_INPUT_METHOD_ID = "input_method_id";
}
@@ -31162,6 +31166,36 @@
field public static final int WEEKDAY_WEDNESDAY = 4; // 0x4
}
+ public static abstract class TtsSpan.Builder {
+ ctor public TtsSpan.Builder(java.lang.String);
+ method public android.text.style.TtsSpan build();
+ method public C setIntArgument(java.lang.String, int);
+ method public C setLongArgument(java.lang.String, long);
+ method public C setStringArgument(java.lang.String, java.lang.String);
+ }
+
+ public static class TtsSpan.CardinalBuilder extends android.text.style.TtsSpan.SemioticClassBuilder {
+ ctor public TtsSpan.CardinalBuilder();
+ ctor public TtsSpan.CardinalBuilder(long);
+ ctor public TtsSpan.CardinalBuilder(java.lang.String);
+ method public android.text.style.TtsSpan.CardinalBuilder setNumber(long);
+ method public android.text.style.TtsSpan.CardinalBuilder setNumber(java.lang.String);
+ }
+
+ public static class TtsSpan.SemioticClassBuilder extends android.text.style.TtsSpan.Builder {
+ ctor public TtsSpan.SemioticClassBuilder(java.lang.String);
+ method public C setAnimacy(java.lang.String);
+ method public C setCase(java.lang.String);
+ method public C setGender(java.lang.String);
+ method public C setMultiplicity(java.lang.String);
+ }
+
+ public static class TtsSpan.TextBuilder extends android.text.style.TtsSpan.SemioticClassBuilder {
+ ctor public TtsSpan.TextBuilder();
+ ctor public TtsSpan.TextBuilder(java.lang.String);
+ method public android.text.style.TtsSpan.TextBuilder setText(java.lang.String);
+ }
+
public class TypefaceSpan extends android.text.style.MetricAffectingSpan implements android.text.ParcelableSpan {
ctor public TypefaceSpan(java.lang.String);
ctor public TypefaceSpan(android.os.Parcel);
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 5bf8a97..bc14c1e 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -1413,6 +1413,21 @@
public static final String ACTION_UNINSTALL_PACKAGE = "android.intent.action.UNINSTALL_PACKAGE";
/**
+ * Activity Action: Prompt the user to confirm credentials (pin, pattern or password)
+ * for the current user of the device. Launch this activity using
+ * {@link android.app.Activity#startActivityForResult(Intent, int)} and check if the
+ * result is {@link android.app.Activity#RESULT_OK} for a successful response to the
+ * challenge.<p/>
+ * This intent is handled by the system at a high priority and applications cannot intercept
+ * it.<p/>
+ * You can use {@link android.app.KeyguardManager#isKeyguardSecure()} to determine if the user will be
+ * prompted.
+ */
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+ public static final String ACTION_CONFIRM_DEVICE_CREDENTIAL = "android.intent.action.CONFIRM_DEVICE_CREDENTIAL";
+
+
+ /**
* Specify whether the package should be uninstalled for all users.
* @hide because these should not be part of normal application flow.
*/
@@ -3161,11 +3176,17 @@
/**
* A CharSequence dialog title to provide to the user when used with a
- * {@link #ACTION_CHOOSER}.
+ * {@link #ACTION_CHOOSER} or {@link #ACTION_CONFIRM_DEVICE_CREDENTIAL}.
*/
public static final String EXTRA_TITLE = "android.intent.extra.TITLE";
/**
+ * A CharSequence description to provide to the user when used with
+ * {@link #ACTION_CONFIRM_DEVICE_CREDENTIAL}.
+ */
+ public static final String EXTRA_DETAILS = "android.intent.extra.DETAILS";
+
+ /**
* A Parcelable[] of {@link Intent} or
* {@link android.content.pm.LabeledIntent} objects as set with
* {@link #putExtra(String, Parcelable[])} of additional activities to place
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index bc069ca..f352f43 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -131,6 +131,31 @@
"android.settings.AIRPLANE_MODE_SETTINGS";
/**
+ * Activity Action: Modify Airplane mode settings using the users voice.
+ * <p>
+ * In some cases, a matching Activity may not exist, so ensure you safeguard against this.
+ * <p>
+ * This intent MUST be started using
+ * {@link android.service.voice.VoiceInteractionSession#startVoiceActivity
+ * startVoiceActivity}.
+ * <p>
+ * To tell which state airplane mode should be set to, add the
+ * {@link #EXTRA_AIRPLANE_MODE_ENABLED} extra to this Intent with the state specified.
+ * If there is no extra in this Intent, no changes will be made.
+ * <p>
+ * The activity should verify that
+ * {@link android.app.Activity#isVoiceInteraction isVoiceInteraction} returns true before
+ * modifying the setting.
+ * <p>
+ * Input: Nothing.
+ * <p>
+ * Output: Nothing.
+ */
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+ public static final String ACTION_VOICE_CONTROL_AIRPLANE_MODE =
+ "android.settings.VOICE_CONTROL_AIRPLANE_MODE";
+
+ /**
* Activity Action: Show settings for accessibility modules.
* <p>
* In some cases, a matching Activity may not exist, so ensure you
@@ -207,7 +232,6 @@
/**
* Activity Action: Show settings to allow configuration of Wi-Fi.
-
* <p>
* In some cases, a matching Activity may not exist, so ensure you
* safeguard against this.
@@ -780,6 +804,33 @@
public static final String ACTION_ZEN_MODE_SETTINGS = "android.settings.ZEN_MODE_SETTINGS";
/**
+ * Activity Action: Modify zen mode settings.
+ * <p>
+ * In some cases, a matching Activity may not exist, so ensure you safeguard against this.
+ * <p>
+ * This intent MUST be started using
+ * {@link android.service.voice.VoiceInteractionSession#startVoiceActivity
+ * startVoiceActivity}.
+ * <p>
+ * To tell which state zen mode should be set to, add the
+ * {@link #EXTRA_ZEN_MODE_INTERRUPTION_STATE} extra to this Intent with the state specified.
+ * If there is no extra in this Intent, no changes will be made.
+ * <p>
+ * The Activity should verify that
+ * {@link android.app.Activity#isVoiceInteraction isVoiceInteraction}.
+ * returns true before modifying the setting.
+ * <p>
+ * Input: Nothing.
+ * <p>
+ * Output: Nothing.
+ *
+ * @hide
+ */
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+ public static final String ACTION_VOICE_CONTROL_ZEN_MODE =
+ "android.settings.VOICE_CONTROL_ZEN_MODE";
+
+ /**
* Activity Action: Show the regulatory information screen for the device.
* <p>
* In some cases, a matching Activity may not exist, so ensure you safeguard
@@ -891,6 +942,27 @@
public static final String EXTRA_INPUT_METHOD_ID = "input_method_id";
+ /**
+ * Activity Extra: Enable or disable Airplane Mode.
+ * <p>
+ * This can be passed as an extra field to the {@link #ACTION_VOICE_CONTROL_AIRPLANE_MODE}
+ * intent as a boolean.
+ */
+ public static final String EXTRA_AIRPLANE_MODE_ENABLED = "airplane_mode_enabled";
+
+ /**
+ * Activity Extra: Modify the zen mode interruption state.
+ * <p>
+ * This can be passed as an extra field to the {@link #ACTION_VOICE_CONTROL_ZEN_MODE}
+ * intent as an integer. The value should be one of
+ * {@link android.provider.Settings.Global#ZEN_MODE_OFF},
+ * {@link android.provider.Settings.Global#ZEN_MODE_IMPORTANT_INTERRUPTIONS},
+ * {@link android.provider.Settings.Global#ZEN_MODE_NO_INTERRUPTIONS}.
+ *
+ * @hide
+ */
+ public static final String EXTRA_ZEN_MODE_INTERRUPTION_STATE = "zen_mode_interruption_state";
+
private static final String JID_RESOURCE_PREFIX = "android";
public static final String AUTHORITY = "settings";
diff --git a/core/java/android/text/style/TtsSpan.java b/core/java/android/text/style/TtsSpan.java
index 04b2da5..3ab3b31 100644
--- a/core/java/android/text/style/TtsSpan.java
+++ b/core/java/android/text/style/TtsSpan.java
@@ -22,10 +22,13 @@
import android.text.TextUtils;
/**
- * A span that supplies additional meta-data intended for text-to-speech rendering
- * of the associated text. If the text is being processed by a text-to-speech
- * engine, the engine may use the data in this span in addition to or instead of
- * its associated text.
+ * A span that supplies additional meta-data for the associated text intended
+ * for text-to-speech engines. If the text is being processed by a
+ * text-to-speech engine, the engine may use the data in this span in addition
+ * to or instead of its associated text.
+ *
+ * The inner classes are there for convenience and provide builders for each
+ * TtsSpan type.
*/
public class TtsSpan implements ParcelableSpan {
private final String mType;
@@ -432,10 +435,18 @@
mArgs = src.readPersistableBundle();
}
+ /**
+ * Returns the type.
+ * @return The type of this instance.
+ */
public String getType() {
return mType;
}
+ /**
+ * Returns a bundle of the arguments set.
+ * @return The bundle of the arguments set.
+ */
public PersistableBundle getArgs() {
return mArgs;
}
@@ -455,4 +466,217 @@
public int getSpanTypeId() {
return TextUtils.TTS_SPAN;
}
+
+ /**
+ * A simple builder for TtsSpans.
+ * This builder can be used directly, but the more specific subclasses of
+ * this builder like {@link TtsSpan.TextBuilder} and
+ * {@link TtsSpan.CardinalBuilder} are likely more useful.
+ *
+ * This class uses generics so methods from this class can return instances of
+ * its child classes, resulting in a fluent API (CRTP pattern).
+ */
+ public static abstract class Builder<C extends Builder<C>> {
+ // Holds the type of this class.
+ private final String mType;
+
+ // Holds the arguments of this class. It only stores objects of type
+ // String, Integer and Long.
+ private PersistableBundle mArgs = new PersistableBundle();
+
+ public Builder(String type) {
+ mType = type;
+ }
+
+ /**
+ * Returns a TtsSpan built from the parameters set by the setter
+ * methods.
+ * @return A TtsSpan built with parameters of this builder.
+ */
+ public TtsSpan build() {
+ return new TtsSpan(mType, mArgs);
+ }
+
+ /**
+ * Sets an argument to a string value.
+ * @param arg The argument name.
+ * @param value The value the argument should be set to.
+ * @return This instance.
+ */
+ @SuppressWarnings("unchecked")
+ public C setStringArgument(String arg, String value) {
+ mArgs.putString(arg, value);
+ return (C) this;
+ }
+
+ /**
+ * Sets an argument to an int value.
+ * @param arg The argument name.
+ * @param value The value the argument should be set to.
+ */
+ @SuppressWarnings("unchecked")
+ public C setIntArgument(String arg, int value) {
+ mArgs.putInt(arg, value);
+ return (C) this;
+ }
+
+ /**
+ * Sets an argument to a long value.
+ * @param arg The argument name.
+ * @param value The value the argument should be set to.
+ */
+ @SuppressWarnings("unchecked")
+ public C setLongArgument(String arg, long value) {
+ mArgs.putLong(arg, value);
+ return (C) this;
+ }
+ }
+
+ /**
+ * A builder for TtsSpans, has setters for morphosyntactic features.
+ * This builder can be used directly, but the more specific subclasses of
+ * this builder like {@link TtsSpan.TextBuilder} and
+ * {@link TtsSpan.CardinalBuilder} are likely more useful.
+ */
+ public static class SemioticClassBuilder<C extends SemioticClassBuilder<C>>
+ extends Builder<C> {
+
+ public SemioticClassBuilder(String type) {
+ super(type);
+ }
+
+ /**
+ * Sets the gender information for this instance.
+ * @param gender Can any of {@link TtsSpan#GENDER_NEUTRAL},
+ * {@link TtsSpan#GENDER_MALE} and {@link TtsSpan#GENDER_FEMALE}.
+ * @return This instance.
+ */
+ public C setGender(String gender) {
+ return setStringArgument(TtsSpan.ARG_GENDER, gender);
+ }
+
+ /**
+ * Sets the animacy information for this instance.
+ * @param animacy Can be any of {@link TtsSpan#ANIMACY_ANIMATE} and
+ * {@link TtsSpan#ANIMACY_INANIMATE}.
+ * @return This instance.
+ */
+ public C setAnimacy(String animacy) {
+ return setStringArgument(TtsSpan.ARG_ANIMACY, animacy);
+ }
+
+ /**
+ * Sets the multiplicity information for this instance.
+ * @param multiplicity Can be any of
+ * {@link TtsSpan#MULTIPLICITY_SINGLE},
+ * {@link TtsSpan#MULTIPLICITY_DUAL} and
+ * {@link TtsSpan#MULTIPLICITY_PLURAL}.
+ * @return This instance.
+ */
+ public C setMultiplicity(String multiplicity) {
+ return setStringArgument(TtsSpan.ARG_MULTIPLICITY, multiplicity);
+ }
+
+ /**
+ * Sets the grammatical case information for this instance.
+ * @param grammaticalCase Can be any of {@link TtsSpan#CASE_NOMINATIVE},
+ * {@link TtsSpan#CASE_ACCUSATIVE}, {@link TtsSpan#CASE_DATIVE},
+ * {@link TtsSpan#CASE_ABLATIVE}, {@link TtsSpan#CASE_GENITIVE},
+ * {@link TtsSpan#CASE_VOCATIVE}, {@link TtsSpan#CASE_LOCATIVE} and
+ * {@link TtsSpan#CASE_INSTRUMENTAL}.
+ * @return This instance.
+ */
+ public C setCase(String grammaticalCase) {
+ return setStringArgument(TtsSpan.ARG_CASE, grammaticalCase);
+ }
+ }
+
+ /**
+ * A builder for TtsSpans of type {@link TtsSpan #TYPE_TEXT}.
+ */
+ public static class TextBuilder extends SemioticClassBuilder<TextBuilder> {
+
+ /**
+ * Creates a TtsSpan of type {@link TtsSpan#TYPE_TEXT}.
+ */
+ public TextBuilder() {
+ super(TtsSpan.TYPE_TEXT);
+ }
+
+ /**
+ * Creates a TtsSpan of type {@link TtsSpan#TYPE_TEXT} and sets the
+ * {@link TtsSpan#ARG_TEXT} argument.
+ * @param text The text to be synthesized.
+ * @see #setText(String)
+ */
+ public TextBuilder(String text) {
+ this();
+ setText(text);
+ }
+
+ /**
+ * Sets the {@link TtsSpan#ARG_TEXT} argument, the text to be
+ * synthesized.
+ * @param text The string that will be synthesized.
+ * @return This instance.
+ */
+ public TextBuilder setText(String text) {
+ return setStringArgument(TtsSpan.ARG_TEXT, text);
+ }
+ }
+
+ /**
+ * A builder for TtsSpans of type {@link TtsSpan #TYPE_CARDINAL}.
+ */
+ public static class CardinalBuilder extends SemioticClassBuilder<CardinalBuilder> {
+
+ /**
+ * Creates a TtsSpan of type {@link TtsSpan#TYPE_CARDINAL}.
+ */
+ public CardinalBuilder() {
+ super(TtsSpan.TYPE_CARDINAL);
+ }
+
+ /**
+ * Creates a TtsSpan of type {@link TtsSpan#TYPE_CARDINAL} and sets the
+ * {@link TtsSpan#ARG_NUMBER} argument.
+ * @param number The number to synthesize.
+ * @see #setNumber(long)
+ */
+ public CardinalBuilder(long number) {
+ this();
+ setNumber(number);
+ }
+
+ /**
+ * Creates a TtsSpan of type {@link TtsSpan#TYPE_CARDINAL} and sets the
+ * {@link TtsSpan#ARG_NUMBER} argument.
+ * @param number The number to synthesize.
+ * @see #setNumber(String)
+ */
+ public CardinalBuilder(String number) {
+ this();
+ setNumber(number);
+ }
+
+ /**
+ * Convenience method that converts the number to a String and set it to
+ * the value for {@link TtsSpan#ARG_NUMBER}.
+ * @param number The number that will be synthesized.
+ * @return This instance.
+ */
+ public CardinalBuilder setNumber(long number) {
+ return setNumber(String.valueOf(number));
+ }
+
+ /**
+ * Sets the {@link TtsSpan#ARG_NUMBER} argument.
+ * @param number A non-empty string of digits with an optional
+ * leading + or -.
+ * @return This instance.
+ */
+ public CardinalBuilder setNumber(String number) {
+ return setStringArgument(TtsSpan.ARG_NUMBER, number);
+ }
+ }
}
diff --git a/core/java/com/android/internal/app/LocalePicker.java b/core/java/com/android/internal/app/LocalePicker.java
index 06fe3bf..9b2321a 100644
--- a/core/java/com/android/internal/app/LocalePicker.java
+++ b/core/java/com/android/internal/app/LocalePicker.java
@@ -37,7 +37,6 @@
import android.widget.TextView;
import java.text.Collator;
-import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
@@ -107,22 +106,21 @@
return constructAdapter(context, layoutId, fieldId, false /* disable pseudolocales */);
}
- public static ArrayAdapter<LocaleInfo> constructAdapter(Context context,
- final int layoutId, final int fieldId, final boolean isInDeveloperMode) {
+ public static List<LocaleInfo> getAllAssetLocales(Context context, boolean isInDeveloperMode) {
final Resources resources = context.getResources();
- String[] locales = Resources.getSystem().getAssets().getLocales();
+ final String[] locales = Resources.getSystem().getAssets().getLocales();
List<String> localeList = new ArrayList<String>(locales.length);
Collections.addAll(localeList, locales);
if (isInDeveloperMode) {
if (!localeList.contains("zz_ZZ")) {
localeList.add("zz_ZZ");
}
- /** - TODO: Enable when zz_ZY Pseudolocale is complete
- * if (!localeList.contains("zz_ZY")) {
- * localeList.add("zz_ZY");
- * }
- */
+ /** - TODO: Enable when zz_ZY Pseudolocale is complete
+ * if (!localeList.contains("zz_ZY")) {
+ * localeList.add("zz_ZY");
+ * }
+ */
}
Collections.sort(localeList);
@@ -180,6 +178,13 @@
}
Collections.sort(localeInfos);
+ return localeInfos;
+ }
+
+ public static ArrayAdapter<LocaleInfo> constructAdapter(Context context,
+ final int layoutId, final int fieldId, final boolean isInDeveloperMode) {
+ final List<LocaleInfo> localeInfos = getAllAssetLocales(context, isInDeveloperMode);
+
final LayoutInflater inflater =
(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
return new ArrayAdapter<LocaleInfo>(context, layoutId, fieldId, localeInfos) {
diff --git a/core/jni/android/graphics/Graphics.cpp b/core/jni/android/graphics/Graphics.cpp
index 74be577..320c259 100644
--- a/core/jni/android/graphics/Graphics.cpp
+++ b/core/jni/android/graphics/Graphics.cpp
@@ -386,7 +386,6 @@
SkASSERT(env->IsInstanceOf(paint, gPaint_class));
jlong typefaceHandle = env->GetLongField(paint, gPaint_nativeTypefaceID);
android::TypefaceImpl* p = reinterpret_cast<android::TypefaceImpl*>(typefaceHandle);
- SkASSERT(p);
return p;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 8564409..ec38793 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -2723,11 +2723,9 @@
String action = intent.getAction();
if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
int flags = CommandQueue.FLAG_EXCLUDE_NONE;
- if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
- String reason = intent.getStringExtra("reason");
- if (reason != null && reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
- flags |= CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL;
- }
+ String reason = intent.getStringExtra("reason");
+ if (reason != null && reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
+ flags |= CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL;
}
animateCollapsePanels(flags);
}
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 32f2624..c0f4b83 100755
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -1052,6 +1052,14 @@
next.idle = false;
next.results = null;
next.newIntents = null;
+
+ if (next.isHomeActivity() && next.isNotResolverActivity()) {
+ ProcessRecord app = next.task.mActivities.get(0).app;
+ if (app != null && app != mService.mHomeProcess) {
+ mService.mHomeProcess = app;
+ }
+ }
+
if (next.nowVisible) {
// We won't get a call to reportActivityVisibleLocked() so dismiss lockscreen now.
mStackSupervisor.dismissKeyguard();
@@ -2067,6 +2075,8 @@
final int rootActivityNdx = task.findEffectiveRootIndex();
for (int i = numActivities - 1; i > rootActivityNdx; --i ) {
ActivityRecord target = activities.get(i);
+ if (target.frontOfTask)
+ break;
final int flags = target.info.flags;
final boolean finishOnTaskLaunch =
@@ -2223,6 +2233,8 @@
// Do not operate on or below the effective root Activity.
for (int i = numActivities - 1; i > rootActivityNdx; --i) {
ActivityRecord target = activities.get(i);
+ if (target.frontOfTask)
+ break;
final int flags = target.info.flags;
boolean finishOnTaskLaunch = (flags & ActivityInfo.FLAG_FINISH_ON_TASK_LAUNCH) != 0;
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index a3fd1df..e16894e 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -3171,25 +3171,34 @@
file.delete();
file = getUserPackagesStateBackupFile(userId);
file.delete();
- removeCrossProfileIntentFiltersToUserLPr(userId);
+ removeCrossProfileIntentFiltersLPw(userId);
removeCrossProfilePackagesLPw(userId);
}
- void removeCrossProfileIntentFiltersToUserLPr(int targetUserId) {
- for (int i = 0; i < mCrossProfileIntentResolvers.size(); i++) {
- int sourceUserId = mCrossProfileIntentResolvers.keyAt(i);
- CrossProfileIntentResolver cpir = mCrossProfileIntentResolvers.get(sourceUserId);
- boolean needsWriting = false;
- HashSet<CrossProfileIntentFilter> cpifs =
- new HashSet<CrossProfileIntentFilter>(cpir.filterSet());
- for (CrossProfileIntentFilter cpif : cpifs) {
- if (cpif.getTargetUserId() == targetUserId) {
- needsWriting = true;
- cpir.removeFilter(cpif);
- }
+ void removeCrossProfileIntentFiltersLPw(int userId) {
+ synchronized (mCrossProfileIntentResolvers) {
+ // userId is the source user
+ if (mCrossProfileIntentResolvers.get(userId) != null) {
+ mCrossProfileIntentResolvers.remove(userId);
+ writePackageRestrictionsLPr(userId);
}
- if (needsWriting) {
- writePackageRestrictionsLPr(sourceUserId);
+ // userId is the target user
+ int count = mCrossProfileIntentResolvers.size();
+ for (int i = 0; i < count; i++) {
+ int sourceUserId = mCrossProfileIntentResolvers.keyAt(i);
+ CrossProfileIntentResolver cpir = mCrossProfileIntentResolvers.get(sourceUserId);
+ boolean needsWriting = false;
+ HashSet<CrossProfileIntentFilter> cpifs =
+ new HashSet<CrossProfileIntentFilter>(cpir.filterSet());
+ for (CrossProfileIntentFilter cpif : cpifs) {
+ if (cpif.getTargetUserId() == userId) {
+ needsWriting = true;
+ cpir.removeFilter(cpif);
+ }
+ }
+ if (needsWriting) {
+ writePackageRestrictionsLPr(sourceUserId);
+ }
}
}
}