Merge "Add notification docs to DocumentsProvider." into klp-dev
diff --git a/api/current.txt b/api/current.txt
index 054f1cd..94b40279 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -22,6 +22,7 @@
field public static final java.lang.String BIND_APPWIDGET = "android.permission.BIND_APPWIDGET";
field public static final java.lang.String BIND_DEVICE_ADMIN = "android.permission.BIND_DEVICE_ADMIN";
field public static final java.lang.String BIND_INPUT_METHOD = "android.permission.BIND_INPUT_METHOD";
+ field public static final java.lang.String BIND_NFC_SERVICE = "android.permission.BIND_NFC_SERVICE";
field public static final java.lang.String BIND_NOTIFICATION_LISTENER_SERVICE = "android.permission.BIND_NOTIFICATION_LISTENER_SERVICE";
field public static final java.lang.String BIND_PRINT_SERVICE = "android.permission.BIND_PRINT_SERVICE";
field public static final java.lang.String BIND_REMOTEVIEWS = "android.permission.BIND_REMOTEVIEWS";
diff --git a/core/java/android/transition/Transition.java b/core/java/android/transition/Transition.java
index dcf668b..f76e190 100644
--- a/core/java/android/transition/Transition.java
+++ b/core/java/android/transition/Transition.java
@@ -994,15 +994,7 @@
* false otherwise
*/
void captureValues(ViewGroup sceneRoot, boolean start) {
- if (start) {
- mStartValues.viewValues.clear();
- mStartValues.idValues.clear();
- mStartValues.itemIdValues.clear();
- } else {
- mEndValues.viewValues.clear();
- mEndValues.idValues.clear();
- mEndValues.itemIdValues.clear();
- }
+ clearValues(start);
if (mTargetIds.size() > 0 || mTargets.size() > 0) {
if (mTargetIds.size() > 0) {
for (int i = 0; i < mTargetIds.size(); ++i) {
@@ -1055,6 +1047,23 @@
}
/**
+ * Clear valuesMaps for specified start/end state
+ *
+ * @param start true if the start values should be cleared, false otherwise
+ */
+ void clearValues(boolean start) {
+ if (start) {
+ mStartValues.viewValues.clear();
+ mStartValues.idValues.clear();
+ mStartValues.itemIdValues.clear();
+ } else {
+ mEndValues.viewValues.clear();
+ mEndValues.idValues.clear();
+ mEndValues.itemIdValues.clear();
+ }
+ }
+
+ /**
* Recursive method which captures values for an entire view hierarchy,
* starting at some root view. Transitions without targetIDs will use this
* method to capture values for all possible views.
diff --git a/core/java/android/transition/TransitionManager.java b/core/java/android/transition/TransitionManager.java
index 404709c..9b1494d 100644
--- a/core/java/android/transition/TransitionManager.java
+++ b/core/java/android/transition/TransitionManager.java
@@ -19,6 +19,7 @@
import android.content.Context;
import android.util.ArrayMap;
import android.util.Log;
+import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
@@ -205,48 +206,91 @@
private static void sceneChangeRunTransition(final ViewGroup sceneRoot,
final Transition transition) {
- if (transition != null) {
- final ViewTreeObserver observer = sceneRoot.getViewTreeObserver();
- final ViewTreeObserver.OnPreDrawListener listener =
- new ViewTreeObserver.OnPreDrawListener() {
- public boolean onPreDraw() {
- sceneRoot.getViewTreeObserver().removeOnPreDrawListener(this);
- sPendingTransitions.remove(sceneRoot);
- // Add to running list, handle end to remove it
- final ArrayMap<ViewGroup, ArrayList<Transition>> runningTransitions =
- getRunningTransitions();
- ArrayList<Transition> currentTransitions = runningTransitions.get(sceneRoot);
- ArrayList<Transition> previousRunningTransitions = null;
- if (currentTransitions == null) {
- currentTransitions = new ArrayList<Transition>();
- runningTransitions.put(sceneRoot, currentTransitions);
- } else if (currentTransitions.size() > 0) {
- previousRunningTransitions = new ArrayList<Transition>(currentTransitions);
- }
- currentTransitions.add(transition);
- transition.addListener(new Transition.TransitionListenerAdapter() {
- @Override
- public void onTransitionEnd(Transition transition) {
- ArrayList<Transition> currentTransitions =
- runningTransitions.get(sceneRoot);
- currentTransitions.remove(transition);
- }
- });
- transition.captureValues(sceneRoot, false);
- if (previousRunningTransitions != null) {
- for (Transition runningTransition : previousRunningTransitions) {
- runningTransition.resume();
- }
- }
- transition.playTransition(sceneRoot);
-
- return true;
- }
- };
- observer.addOnPreDrawListener(listener);
+ if (transition != null && sceneRoot != null) {
+ MultiListener listener = new MultiListener(transition, sceneRoot);
+ sceneRoot.addOnAttachStateChangeListener(listener);
+ sceneRoot.getViewTreeObserver().addOnPreDrawListener(listener);
}
}
+ /**
+ * This private utility class is used to listen for both OnPreDraw and
+ * OnAttachStateChange events. OnPreDraw events are the main ones we care
+ * about since that's what triggers the transition to take place.
+ * OnAttachStateChange events are also important in case the view is removed
+ * from the hierarchy before the OnPreDraw event takes place; it's used to
+ * clean up things since the OnPreDraw listener didn't get called in time.
+ */
+ private static class MultiListener implements ViewTreeObserver.OnPreDrawListener,
+ View.OnAttachStateChangeListener {
+
+ Transition mTransition;
+ ViewGroup mSceneRoot;
+
+ MultiListener(Transition transition, ViewGroup sceneRoot) {
+ mTransition = transition;
+ mSceneRoot = sceneRoot;
+ }
+
+ private void removeListeners() {
+ mSceneRoot.getViewTreeObserver().removeOnPreDrawListener(this);
+ mSceneRoot.removeOnAttachStateChangeListener(this);
+ }
+
+ @Override
+ public void onViewAttachedToWindow(View v) {
+ }
+
+ @Override
+ public void onViewDetachedFromWindow(View v) {
+ removeListeners();
+
+ sPendingTransitions.remove(mSceneRoot);
+ ArrayList<Transition> runningTransitions = getRunningTransitions().get(mSceneRoot);
+ if (runningTransitions != null && runningTransitions.size() > 0) {
+ for (Transition runningTransition : runningTransitions) {
+ runningTransition.resume();
+ }
+ }
+ mTransition.clearValues(true);
+ }
+
+ @Override
+ public boolean onPreDraw() {
+ removeListeners();
+ sPendingTransitions.remove(mSceneRoot);
+ // Add to running list, handle end to remove it
+ final ArrayMap<ViewGroup, ArrayList<Transition>> runningTransitions =
+ getRunningTransitions();
+ ArrayList<Transition> currentTransitions = runningTransitions.get(mSceneRoot);
+ ArrayList<Transition> previousRunningTransitions = null;
+ if (currentTransitions == null) {
+ currentTransitions = new ArrayList<Transition>();
+ runningTransitions.put(mSceneRoot, currentTransitions);
+ } else if (currentTransitions.size() > 0) {
+ previousRunningTransitions = new ArrayList<Transition>(currentTransitions);
+ }
+ currentTransitions.add(mTransition);
+ mTransition.addListener(new Transition.TransitionListenerAdapter() {
+ @Override
+ public void onTransitionEnd(Transition transition) {
+ ArrayList<Transition> currentTransitions =
+ runningTransitions.get(mSceneRoot);
+ currentTransitions.remove(transition);
+ }
+ });
+ mTransition.captureValues(mSceneRoot, false);
+ if (previousRunningTransitions != null) {
+ for (Transition runningTransition : previousRunningTransitions) {
+ runningTransition.resume();
+ }
+ }
+ mTransition.playTransition(mSceneRoot);
+
+ return true;
+ }
+ };
+
private static void sceneChangeSetup(ViewGroup sceneRoot, Transition transition) {
// Capture current values
diff --git a/core/java/com/android/internal/app/ProcessStats.java b/core/java/com/android/internal/app/ProcessStats.java
index 222e446..20b8c95 100644
--- a/core/java/com/android/internal/app/ProcessStats.java
+++ b/core/java/com/android/internal/app/ProcessStats.java
@@ -135,10 +135,10 @@
};
static final String[] STATE_NAMES = new String[] {
- "Persistent", "Top ", "Imp Fg ", "Imp Bg ",
- "Backup ", "Heavy Wght", "Service ", "Service Rs",
- "Receiver ", "Home ",
- "Last Act ", "Cch Act ", "Cch CliAct", "Cch Empty "
+ "Persist", "Top ", "ImpFg ", "ImpBg ",
+ "Backup ", "HeavyWt", "Service", "ServRst",
+ "Receivr", "Home ",
+ "LastAct", "CchAct ", "CchCAct", "CchEmty"
};
public static final String[] ADJ_SCREEN_NAMES_CSV = new String[] {
@@ -314,16 +314,16 @@
private static void printScreenLabel(PrintWriter pw, int offset) {
switch (offset) {
case ADJ_NOTHING:
- pw.print(" ");
+ pw.print(" ");
break;
case ADJ_SCREEN_OFF:
- pw.print("Screen Off / ");
+ pw.print("SOff/");
break;
case ADJ_SCREEN_ON:
- pw.print("Screen On / ");
+ pw.print("SOn /");
break;
default:
- pw.print("?????????? / ");
+ pw.print("????/");
break;
}
}
@@ -344,25 +344,31 @@
}
}
- private static void printMemLabel(PrintWriter pw, int offset) {
+ private static void printMemLabel(PrintWriter pw, int offset, char sep) {
switch (offset) {
case ADJ_NOTHING:
- pw.print(" ");
+ pw.print(" ");
+ if (sep != 0) pw.print(' ');
break;
case ADJ_MEM_FACTOR_NORMAL:
- pw.print("Norm / ");
+ pw.print("Norm");
+ if (sep != 0) pw.print(sep);
break;
case ADJ_MEM_FACTOR_MODERATE:
- pw.print("Mod / ");
+ pw.print("Mod ");
+ if (sep != 0) pw.print(sep);
break;
case ADJ_MEM_FACTOR_LOW:
- pw.print("Low / ");
+ pw.print("Low ");
+ if (sep != 0) pw.print(sep);
break;
case ADJ_MEM_FACTOR_CRITICAL:
- pw.print("Crit / ");
+ pw.print("Crit");
+ if (sep != 0) pw.print(sep);
break;
default:
- pw.print("???? / ");
+ pw.print("????");
+ if (sep != 0) pw.print(sep);
break;
}
}
@@ -399,8 +405,9 @@
printScreenLabel(pw, printedScreen != iscreen
? iscreen : STATE_NOTHING);
printedScreen = iscreen;
- printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING);
+ printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING, (char)0);
printedMem = imem;
+ pw.print(": ");
TimeUtils.formatDuration(time, pw); pw.println(running);
}
totalTime += time;
@@ -409,8 +416,7 @@
}
if (totalTime != 0 && pw != null) {
pw.print(prefix);
- printScreenLabel(pw, STATE_NOTHING);
- pw.print("TOTAL: ");
+ pw.print(" TOTAL: ");
TimeUtils.formatDuration(totalTime, pw);
pw.println();
}
@@ -569,7 +575,7 @@
printedScreen = iscreen;
}
if (memStates.length > 1) {
- printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING);
+ printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING, '/');
printedMem = imem;
}
pw.print(STATE_NAMES[procStates[ip]]); pw.print(": ");
@@ -585,9 +591,9 @@
printScreenLabel(pw, STATE_NOTHING);
}
if (memStates.length > 1) {
- printMemLabel(pw, STATE_NOTHING);
+ printMemLabel(pw, STATE_NOTHING, '/');
}
- pw.print("TOTAL : ");
+ pw.print("TOTAL : ");
TimeUtils.formatDuration(totalTime, pw);
pw.println();
}
@@ -621,7 +627,7 @@
printedScreen = iscreen;
}
if (memStates.length > 1) {
- printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING);
+ printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING, '/');
printedMem = imem;
}
pw.print(STATE_NAMES[procStates[ip]]); pw.print(": ");
@@ -798,7 +804,7 @@
new int[] {STATE_SERVICE_RESTARTING}, now, totalTime, true);
dumpProcessSummaryDetails(pw, proc, prefix, " Receiver: ", screenStates, memStates,
new int[] {STATE_RECEIVER}, now, totalTime, true);
- dumpProcessSummaryDetails(pw, proc, prefix, " Home: ", screenStates, memStates,
+ dumpProcessSummaryDetails(pw, proc, prefix, " (Home): ", screenStates, memStates,
new int[] {STATE_HOME}, now, totalTime, true);
dumpProcessSummaryDetails(pw, proc, prefix, " (Last Act): ", screenStates, memStates,
new int[] {STATE_LAST_ACTIVITY}, now, totalTime, true);
@@ -1733,13 +1739,17 @@
pw.print(" pkg="); pw.println(proc.mCommonProcess.mPackage);
}
}
- pw.print(prefix); pw.print("mActive="); pw.println(proc.mActive);
+ if (proc.mActive) {
+ pw.print(prefix); pw.print("mActive="); pw.println(proc.mActive);
+ }
if (proc.mDead) {
pw.print(prefix); pw.print("mDead="); pw.println(proc.mDead);
}
- pw.print(prefix); pw.print("mNumActiveServices="); pw.print(proc.mNumActiveServices);
- pw.print(" mNumStartedServices=");
- pw.println(proc.mNumStartedServices);
+ if (proc.mNumActiveServices != 0 || proc.mNumStartedServices != 0) {
+ pw.print(prefix); pw.print("mNumActiveServices="); pw.print(proc.mNumActiveServices);
+ pw.print(" mNumStartedServices=");
+ pw.println(proc.mNumStartedServices);
+ }
}
public void dumpLocked(PrintWriter pw, String reqPackage, long now, boolean dumpSummary,
@@ -1920,8 +1930,9 @@
printScreenLabel(pw, printedScreen != iscreen
? iscreen : STATE_NOTHING);
printedScreen = iscreen;
- printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING);
+ printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING, (char)0);
printedMem = imem;
+ pw.print(": ");
TimeUtils.formatDuration(time, pw); pw.println(running);
}
totalTime += time;
@@ -1930,8 +1941,7 @@
}
if (totalTime != 0 && pw != null) {
pw.print(prefix);
- printScreenLabel(pw, STATE_NOTHING);
- pw.print("TOTAL: ");
+ pw.print(" TOTAL: ");
TimeUtils.formatDuration(totalTime, pw);
pw.println();
}
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index eba6231..bd52f49 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -1958,8 +1958,7 @@
<!-- Must be required by a {@link android.nfc.cardemulation.HostApduService}
or {@link android.nfc.cardemulation.OffHostApduService} to ensure that only
- the system can bind to it.
- @hide -->
+ the system can bind to it. -->
<permission android:name="android.permission.BIND_NFC_SERVICE"
android:label="@string/permlab_bindNfcService"
android:description="@string/permdesc_bindNfcService"
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 1a9acd3..ae310bf 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -1649,5 +1649,5 @@
<item quantity="other" msgid="4730868920742952817">"Probeer weer oor <xliff:g id="COUNT">%d</xliff:g> sekondes"</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Probeer later weer"</string>
- <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Sleep van bo af na onder om volskerm te verlaat."</string>
+ <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Swiep van bo af na onder om volskerm te verlaat."</string>
</resources>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index e64b6f5..0ae0feb 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -175,7 +175,7 @@
<string name="permgroupdesc_messages" msgid="7821999071003699236">"ኤስ ኤም ኤስህን፣ ኢሜይልህን እና ሌላ መልዕክቶችህን አንብብና ፃፍ።"</string>
<string name="permgrouplab_personalInfo" msgid="3519163141070533474">"የግል መረጃዎ"</string>
<string name="permgroupdesc_personalInfo" msgid="8426453129788861338">"በእውቂያ ካርድህ ላይ ወደተከማቸ የአንተ መረጃ ቀጥተኛ መዳረሻ።"</string>
- <string name="permgrouplab_socialInfo" msgid="5799096623412043791">"ማህበራዊ መረጃህ"</string>
+ <string name="permgrouplab_socialInfo" msgid="5799096623412043791">"ማህበራዊ መረጃዎ"</string>
<string name="permgroupdesc_socialInfo" msgid="7129842457611643493">"ወደ የእውቂያዎችህና የማህበራዊ ግንኙነቶችህ መረጃ ቀጥተኛ መዳረሻ።"</string>
<string name="permgrouplab_location" msgid="635149742436692049">"ስፍራዎ"</string>
<string name="permgroupdesc_location" msgid="5704679763124170100">"ያለህበትን አካባቢ ተቆጣጠር።"</string>
@@ -450,9 +450,9 @@
<string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"ስለ ገቢ እና ወጪ ጥሪዎችን ውሂብ ጨምሮ፣ የጡባዊተኮህን ምዝግብ ማስታወሻ ለመቀየር ለመተግበሪያው ይፈቅዳል። ይሄንን ተንኮል አዘል መተግበሪያዎች የስልክህን ምዝግብ ማስታወሻ ለመሰረዝ ወይም ለመለወጥ ሊጠቀሙበት ይችላሉ።"</string>
<string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"ስለ ገቢ እና ወጪ ጥሪዎችን ውሂብ ጨምሮ፣ የስልክህን ምዝግብ ማስታወሻ ለመቀየር ለመተግበሪያው ይፈቅዳል። ይሄንን ተንኮል አዘል መተግበሪያዎች የስልክህን ምዝግብ ማስታወሻ ለመሰረዝ ወይም ለመለወጥ ሊጠቀሙበት ይችላሉ።"</string>
<string name="permlab_readProfile" msgid="4701889852612716678">"የራስህን የእውቂያ ካርድ አንብብ"</string>
- <string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"መተግበሪያው ልክ እንደ ስምህ እና የእውቂያ መረጃህ ያሉ በመሳሪያህ ላይ የተከማቹ የግል መገለጫ መረጃዎችን እንዲያነብ ይፈቅድለታል። ይህም ማለት መተግበሪያው ለይቶ ሊያውቅህ እና የመገለጫ መረጃህን ለሌሎች ሊልክ ይችላል።"</string>
+ <string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"መተግበሪያው ልክ እንደ ስምዎ እና የእውቂያ መረጃዎ ያሉ በመሳሪያዎ ላይ የተከማቹ የግል መገለጫ መረጃዎችን እንዲያነብ ይፈቅድለታል። ይህም ማለት መተግበሪያው ለይቶ ሊያውቁዎ እና የመገለጫ መረጃዎን ለሌሎች ሊልክ ይችላል።"</string>
<string name="permlab_writeProfile" msgid="907793628777397643">"የራስህን የዕውቂያ ካርድ አስተካክል"</string>
- <string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"መተግበሪያው ልክ እንደ ስምህ እና የእውቂያ መረጃህ ያሉ በመሳሪያህ ላይ የተከማቹ የግል መገለጫ መረጃዎችን እንዲቀይር ወይም እንዲያክልባቸው ይፈቅድለታል። ይህም ማለት መተግበሪያው ለይቶ ሊያውቅህ እና የመገለጫ መረጃህን ለሌሎች ሊልክ ይችላል።"</string>
+ <string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"መተግበሪያው ልክ እንደ ስምዎ እና የእውቂያ መረጃዎ ያሉ በመሳሪያዎ ላይ የተከማቹ የግል መገለጫ መረጃዎችን እንዲቀይር ወይም እንዲያክልባቸው ይፈቅድለታል። ይህም ማለት መተግበሪያው ለይቶ ሊያውቅዎ እና የመገለጫ መረጃዎን ለሌሎች ሊልክ ይችላል።"</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"የአንተን ማህበራዊ የውይይት ክፍሎች አንብብ"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"መተግበሪያው የአንተንና የጓኞችህን ማህበራዊ ዝማኔዎችን እንዲደርስባቸው እና እንዲያመሳስላቸው ይፈቅድለታል። መረጃ ስታጋራ ተጠንቀቅ -- ይህ መተግበሪያው ሚስጥራዊነትን ከግምት ሳያስገባ በማህበራዊ አውታረ መረቦች በአንተ እና በጓደኞችህ መካከል የሚደረጉ ግንኙነቶችን እንዲያነብ ይፈቅድለታል። ማስታወሻ፦ ይህ ፈቃድ ለሁሉም ማህበራዊ አውታር መረቦች ላይ ላይፈጸም ይችላል።"</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"ወደ የአንተ ማህበራዊ የውይይት ክፍሎች ጻፍ"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 8b46e84..6d18688 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -1485,7 +1485,7 @@
<string name="wireless_display_route_description" msgid="9070346425023979651">"Pantalla sense fil"</string>
<string name="media_route_chooser_grouping_done" msgid="7966438307723317169">"Fet"</string>
<string name="media_route_button_content_description" msgid="5758553567065145276">"Sortida de contingut multimèdia"</string>
- <string name="media_route_status_scanning" msgid="7279908761758293783">"S\'està explorant..."</string>
+ <string name="media_route_status_scanning" msgid="7279908761758293783">"S\'està cercant…"</string>
<string name="media_route_status_connecting" msgid="6422571716007825440">"S\'està connectant..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"Disponible"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"No disponible"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 0cf5bc5..63ccd05 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -440,7 +440,7 @@
<string name="permlab_readContacts" msgid="8348481131899886131">"læse dine kontaktpersoner"</string>
<string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"Tillader, at appen kan læse data om de kontaktpersoner, der er gemt på din tablet, f.eks. hvor ofte du har ringet til, sendt e-mail til eller på anden måde kommunikeret med bestemte personer. Med denne tilladelse kan apps gemme dine kontaktdata, og skadelige apps kan dele kontaktdata uden din viden."</string>
<string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"Tillader, at appen kan læse data om de kontaktpersoner, der er gemt på din telefon, f.eks. hvor ofte du har ringet til, sendt e-mail til eller på anden måde kommunikeret med bestemte personer. Med denne tilladelse kan apps gemme dine kontaktdata, og skadelige apps kan dele kontaktdata uden din viden."</string>
- <string name="permlab_writeContacts" msgid="5107492086416793544">"ændre dine kontaktpersoner"</string>
+ <string name="permlab_writeContacts" msgid="5107492086416793544">"at ændre dine kontaktpersoner"</string>
<string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"Tillader, at appen kan ændre data om de kontaktpersoner, der er gemt på din tablet, f.eks. hvor ofte du har ringet til dem, sendt dem en e-mail eller på anden måde kommunikeret med bestemte kontaktpersoner. Med denne tilladelse kan apps slette kontaktoplysninger."</string>
<string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"Tillader, at appen kan ændre data om de kontaktpersoner, der er gemt på din telefon, f.eks. hvor ofte du har ringet til dem, sendt en e-mail til dem eller på anden måde kommunikeret med bestemte kontaktpersoner. Med denne tilladelse kan apps slette kontaktoplysninger."</string>
<string name="permlab_readCallLog" msgid="3478133184624102739">"læs opkaldsliste"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 3130cba..623f521 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -1649,5 +1649,5 @@
<item quantity="other" msgid="4730868920742952817">"Yritä uud. <xliff:g id="COUNT">%d</xliff:g> s kul."</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Yritä myöhemmin uudelleen"</string>
- <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Poistu koko näytön tilasta liu\'uttamalla alas."</string>
+ <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Poistu koko näytön tilasta pyyhkäisemällä alas."</string>
</resources>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 4ae5938..2870ac9 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -1649,5 +1649,5 @@
<item quantity="other" msgid="4730868920742952817">"Próbálja újra <xliff:g id="COUNT">%d</xliff:g> másodperc múlva"</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Próbálkozzon később"</string>
- <string name="immersive_mode_confirmation" msgid="7227416894979047467">"A teljes képernyős nézetből való kilépéshez húzza ujját a tetejétől lefelé."</string>
+ <string name="immersive_mode_confirmation" msgid="7227416894979047467">"A teljes képernyős nézetből való kilépéshez húzza ujját a képernyő tetejétől lefelé."</string>
</resources>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index a587950..ef45d98 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -1649,5 +1649,5 @@
<item quantity="other" msgid="4730868920742952817">"Jaribu tena baada ya sekunde <xliff:g id="COUNT">%d</xliff:g>"</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Jaribu tena baadaye"</string>
- <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Telezesha kidole kwa kasi chini kuanzia juu ili uondoke kwenye skrini kamili."</string>
+ <string name="immersive_mode_confirmation" msgid="7227416894979047467">"Telezesha kidole kwa kasi chini kuanzia juu ili uondoke kwenye skrini zima."</string>
</resources>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index e3ca5b9..95aca0c 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -1649,5 +1649,5 @@
<item quantity="other" msgid="4730868920742952817">"<xliff:g id="COUNT">%d</xliff:g> 秒後再試一次"</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"稍後再試"</string>
- <string name="immersive_mode_confirmation" msgid="7227416894979047467">"從頂端往下快速滑動即可退出全螢幕。"</string>
+ <string name="immersive_mode_confirmation" msgid="7227416894979047467">"由頂端往下快速滑動即可離開全螢幕。"</string>
</resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 3ec8d4c..1066d38 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -1649,5 +1649,5 @@
<item quantity="other" msgid="4730868920742952817">"<xliff:g id="COUNT">%d</xliff:g> 秒後再試一次"</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"稍後再試"</string>
- <string name="immersive_mode_confirmation" msgid="7227416894979047467">"從頂端往下滑動即可結束全螢幕。"</string>
+ <string name="immersive_mode_confirmation" msgid="7227416894979047467">"從頂端往下滑動即可退出全螢幕模式。"</string>
</resources>
diff --git a/core/tests/coretests/apks/version_nosys/Android.mk b/core/tests/coretests/apks/version_nosys/Android.mk
new file mode 100644
index 0000000..bbc8e12
--- /dev/null
+++ b/core/tests/coretests/apks/version_nosys/Android.mk
@@ -0,0 +1,9 @@
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := $(call all-subdir-java-files)
+LOCAL_PACKAGE_NAME := version_1_nosys
+LOCAL_AAPT_FLAGS := --version-code 1 --version-name 1.0
+LOCAL_CERTIFICATE := $(LOCAL_PATH)/../../certs/unit_test
+include $(FrameworkCoreTests_BUILD_PACKAGE)
+
diff --git a/core/tests/coretests/apks/version_nosys/AndroidManifest.xml b/core/tests/coretests/apks/version_nosys/AndroidManifest.xml
new file mode 100644
index 0000000..46aac38
--- /dev/null
+++ b/core/tests/coretests/apks/version_nosys/AndroidManifest.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.frameworks.coretests.version_test">
+
+ <!-- Do not ask for this system permission -->
+<!-- <uses-permission android:name="android.permission.ACCESS_CACHE_FILESYSTEM" />
+-->
+ <!-- Which permission it uses is not important as long as it's a normal
+ permission -->
+ <uses-permission android:name="android.permission.VIBRATE" />
+
+ <application android:hasCode="false"/>
+</manifest>
diff --git a/core/tests/coretests/apks/version_nosys/res/values/strings.xml b/core/tests/coretests/apks/version_nosys/res/values/strings.xml
new file mode 100644
index 0000000..3b8b3b1
--- /dev/null
+++ b/core/tests/coretests/apks/version_nosys/res/values/strings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- Just need this dummy file to have something to build. -->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="dummy">dummy</string>
+</resources>
diff --git a/core/tests/coretests/apks/version_nosys/src/com/android/frameworks/coretests/version_test/NullProvider.java b/core/tests/coretests/apks/version_nosys/src/com/android/frameworks/coretests/version_test/NullProvider.java
new file mode 100644
index 0000000..f5742f0
--- /dev/null
+++ b/core/tests/coretests/apks/version_nosys/src/com/android/frameworks/coretests/version_test/NullProvider.java
@@ -0,0 +1,39 @@
+package com.android.frameworks.coretests.version_test;
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.net.Uri;
+
+public class NullProvider extends ContentProvider {
+ @Override
+ public boolean onCreate() {
+ return true;
+ }
+
+ @Override
+ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
+ String sortOrder) {
+ return null;
+ }
+
+ @Override
+ public Uri insert(Uri uri, ContentValues values) {
+ return null;
+ }
+
+ @Override
+ public int delete(Uri uri, String selection, String[] selectionArgs) {
+ return 0;
+ }
+
+ @Override
+ public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+ return 0;
+ }
+
+ @Override
+ public String getType(Uri uri) {
+ return "text/plain";
+ }
+}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardTransportControlView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardTransportControlView.java
index 2e35439..de26efb 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardTransportControlView.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardTransportControlView.java
@@ -65,7 +65,7 @@
protected static final boolean DEBUG = false;
protected static final String TAG = "TransportControlView";
- private static final boolean ANIMATE_TRANSITIONS = false;
+ private static final boolean ANIMATE_TRANSITIONS = true;
private ViewGroup mMetadataContainer;
private ViewGroup mInfoContainer;
diff --git a/packages/PrintSpooler/res/values-af/strings.xml b/packages/PrintSpooler/res/values-af/strings.xml
index a6ad391..5ea5ed9 100644
--- a/packages/PrintSpooler/res/values-af/strings.xml
+++ b/packages/PrintSpooler/res/values-af/strings.xml
@@ -60,7 +60,7 @@
<string name="no_connection_to_printer" msgid="2159246915977282728">"Geen verbinding met drukker nie"</string>
<string name="reason_unknown" msgid="5507940196503246139">"onbekend"</string>
<string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – nie beskikbaar nie"</string>
- <string name="print_error_default_message" msgid="8568506918983980567">"Kon nie druktaak genereer nie"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Kon nie uitdruktaak genereer nie"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Swart en wit"</item>
<item msgid="2762241247228983754">"Kleur"</item>
diff --git a/packages/PrintSpooler/res/values-lv/strings.xml b/packages/PrintSpooler/res/values-lv/strings.xml
index 62af20b..ec5855f 100644
--- a/packages/PrintSpooler/res/values-lv/strings.xml
+++ b/packages/PrintSpooler/res/values-lv/strings.xml
@@ -60,7 +60,7 @@
<string name="no_connection_to_printer" msgid="2159246915977282728">"Nav savienojuma ar printeri"</string>
<string name="reason_unknown" msgid="5507940196503246139">"nezināms"</string>
<string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> — nav pieejams"</string>
- <string name="print_error_default_message" msgid="8568506918983980567">"Nevar ģenerēt drukas darbu"</string>
+ <string name="print_error_default_message" msgid="8568506918983980567">"Nevarēja ģenerēt drukas darbu"</string>
<string-array name="color_mode_labels">
<item msgid="7602948745415174937">"Melnbalts"</item>
<item msgid="2762241247228983754">"Krāsa"</item>
diff --git a/packages/PrintSpooler/res/values-zh-rHK/strings.xml b/packages/PrintSpooler/res/values-zh-rHK/strings.xml
index 2f16a22..4b5d5c9 100644
--- a/packages/PrintSpooler/res/values-zh-rHK/strings.xml
+++ b/packages/PrintSpooler/res/values-zh-rHK/strings.xml
@@ -25,7 +25,7 @@
<string name="label_color" msgid="1108690305218188969">"顏色"</string>
<string name="label_orientation" msgid="2853142581990496477">"方向"</string>
<string name="label_pages" msgid="6300874667546617333">"頁數 (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string>
- <string name="pages_range_example" msgid="8558694453556945172">"例如:1–5、8、11–13"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"例如:1-5,8,11-13"</string>
<string name="print_preview" msgid="8010217796057763343">"預覽列印"</string>
<string name="install_for_print_preview" msgid="6366303997385509332">"安裝預覽所需的 PDF 檢視器"</string>
<string name="printing_app_crashed" msgid="854477616686566398">"列印應用程式當機了"</string>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 58865ab..e6fcdff 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -382,6 +382,8 @@
<string name="accessibility_quick_settings_airplane">Airplane Mode <xliff:g id="state" example="Off">%s</xliff:g>.</string>
<!-- Content description of the bluetooth tile in quick settings (not shown on the screen). [CHAR LIMIT=NONE] -->
<string name="accessibility_quick_settings_bluetooth">Bluetooth <xliff:g id="state" example="Off">%s</xliff:g>.</string>
+ <!-- Content description of the location tile in quick settings (not shown on the screen). [CHAR LIMIT=NONE] -->
+ <string name="accessibility_quick_settings_location">Location <xliff:g id="state" example="Off">%s</xliff:g>.</string>
<!-- Content description of the alarm tile in quick settings (not shown on the screen). [CHAR LIMIT=NONE] -->
<string name="accessibility_quick_settings_alarm">Alarm set for <xliff:g id="time" example="Wed 3:30 PM">%s</xliff:g>.</string>
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java
index 5423bb6..37504fb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java
@@ -630,8 +630,19 @@
return true; // Consume click
}} );
}
- mModel.addLocationTile(locationTile,
- new QuickSettingsModel.BasicRefreshCallback(locationTile));
+ mModel.addLocationTile(locationTile, new QuickSettingsModel.RefreshCallback() {
+ @Override
+ public void refreshView(QuickSettingsTileView unused, State state) {
+ locationTile.setImageResource(state.iconId);
+ String locationState = mContext.getString(
+ (state.enabled) ? R.string.accessibility_desc_on
+ : R.string.accessibility_desc_off);
+ locationTile.setContentDescription(mContext.getString(
+ R.string.accessibility_quick_settings_location,
+ locationState));
+ locationTile.setText(state.label);
+ }
+ });
parent.addView(locationTile);
}
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
index 1745bc7..44fc1f8 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
@@ -1922,7 +1922,9 @@
private PopupWindow mActionModePopup;
private Runnable mShowActionModePopup;
- // View added at runtime to IME windows to cover the navigation bar
+ // View added at runtime to draw under the status bar area
+ private View mStatusGuard;
+ // View added at runtime to draw under the navigation bar area
private View mNavigationGuard;
public DecorView(Context context, int featureId) {
@@ -2484,7 +2486,64 @@
@Override
protected boolean fitSystemWindows(Rect insets) {
mFrameOffsets.set(insets);
+ updateStatusGuard(insets);
+ updateNavigationGuard(insets);
+ if (getForeground() != null) {
+ drawableChanged();
+ }
+ return super.fitSystemWindows(insets);
+ }
+ private void updateStatusGuard(Rect insets) {
+ boolean showStatusGuard = false;
+ // Show the status guard when the non-overlay contextual action bar is showing
+ if (mActionModeView != null) {
+ if (mActionModeView.getLayoutParams() instanceof MarginLayoutParams) {
+ MarginLayoutParams mlp = (MarginLayoutParams) mActionModeView.getLayoutParams();
+ boolean mlpChanged = false;
+ final boolean nonOverlayShown =
+ (getLocalFeatures() & (1 << FEATURE_ACTION_MODE_OVERLAY)) == 0
+ && mActionModeView.isShown();
+ if (nonOverlayShown) {
+ // set top margin to top insets, show status guard
+ if (mlp.topMargin != insets.top) {
+ mlpChanged = true;
+ mlp.topMargin = insets.top;
+ if (mStatusGuard == null) {
+ mStatusGuard = new View(mContext);
+ mStatusGuard.setBackgroundColor(mContext.getResources()
+ .getColor(R.color.input_method_navigation_guard));
+ addView(mStatusGuard, new LayoutParams(
+ LayoutParams.MATCH_PARENT, mlp.topMargin,
+ Gravity.START | Gravity.TOP));
+ } else {
+ LayoutParams lp = (LayoutParams) mStatusGuard.getLayoutParams();
+ if (lp.height != mlp.topMargin) {
+ lp.height = mlp.topMargin;
+ mStatusGuard.setLayoutParams(lp);
+ }
+ }
+ }
+ insets.top = 0; // consume top insets
+ showStatusGuard = true;
+ } else {
+ // reset top margin
+ if (mlp.topMargin != 0) {
+ mlpChanged = true;
+ mlp.topMargin = 0;
+ }
+ }
+ if (mlpChanged) {
+ mActionModeView.setLayoutParams(mlp);
+ }
+ }
+ }
+ if (mStatusGuard != null) {
+ mStatusGuard.setVisibility(showStatusGuard ? View.VISIBLE : View.GONE);
+ }
+ }
+
+ private void updateNavigationGuard(Rect insets) {
// IMEs lay out below the nav bar, but the content view must not (for back compat)
if (getAttributes().type == WindowManager.LayoutParams.TYPE_INPUT_METHOD) {
// prevent the content view from including the nav bar height
@@ -2510,11 +2569,6 @@
mNavigationGuard.setLayoutParams(lp);
}
}
-
- if (getForeground() != null) {
- drawableChanged();
- }
- return super.fitSystemWindows(insets);
}
private void drawableChanged() {
@@ -2693,6 +2747,7 @@
}
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+ requestFitSystemWindows();
return mWrapped.onPrepareActionMode(mode, menu);
}
@@ -2719,6 +2774,7 @@
}
}
mActionMode = null;
+ requestFitSystemWindows();
}
}
}
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 3ba9098..8b7fd8e 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -7224,7 +7224,13 @@
if (DEBUG_MU)
Slog.v(TAG_MU, "generateApplicationProvidersLocked, cpi.uid = " + cpr.uid);
app.pubProviders.put(cpi.name, cpr);
- app.addPackage(cpi.applicationInfo.packageName, mProcessStats);
+ if (!cpi.multiprocess || !"android".equals(cpi.packageName)) {
+ // Don't add this if it is a platform component that is marked
+ // to run in multiple processes, because this is actually
+ // part of the framework so doesn't make sense to track as a
+ // separate apk in the process.
+ app.addPackage(cpi.applicationInfo.packageName, mProcessStats);
+ }
ensurePackageDexOpt(cpi.applicationInfo.packageName);
}
}
@@ -12777,7 +12783,8 @@
+ ") when registering receiver " + receiver);
}
if (callerApp.info.uid != Process.SYSTEM_UID &&
- !callerApp.pkgList.containsKey(callerPackage)) {
+ !callerApp.pkgList.containsKey(callerPackage) &&
+ !"android".equals(callerPackage)) {
throw new SecurityException("Given caller package " + callerPackage
+ " is not running in process " + callerApp);
}
diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java
index 0397fd5..22daaf3 100644
--- a/services/java/com/android/server/am/ActivityStack.java
+++ b/services/java/com/android/server/am/ActivityStack.java
@@ -2174,6 +2174,19 @@
r.addResultLocked(null, resultWho, requestCode, resultCode, data);
}
+ private void adjustFocusedActivityLocked(ActivityRecord r) {
+ if (mStackSupervisor.isFrontStack(this) && mService.mFocusedActivity == r) {
+ ActivityRecord next = topRunningActivityLocked(null);
+ if (next != r) {
+ final TaskRecord task = r.task;
+ if (r.frontOfTask && task == topTask() && task.mOnTopOfHome) {
+ mStackSupervisor.moveHomeToTop();
+ }
+ }
+ mService.setFocusedActivityLocked(mStackSupervisor.topRunningActivityLocked());
+ }
+ }
+
final void stopActivityLocked(ActivityRecord r) {
if (DEBUG_SWITCH) Slog.d(TAG, "Stopping: " + r);
if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_HISTORY) != 0
@@ -2193,11 +2206,7 @@
}
if (r.app != null && r.app.thread != null) {
- if (mStackSupervisor.isFrontStack(this)) {
- if (mService.mFocusedActivity == r) {
- mService.setFocusedActivityLocked(topRunningActivityLocked(null));
- }
- }
+ adjustFocusedActivityLocked(r);
r.resumeKeyDispatchingLocked();
try {
r.stopped = false;
@@ -2376,11 +2385,8 @@
}
r.pauseKeyDispatchingLocked();
- if (mStackSupervisor.isFrontStack(this)) {
- if (mService.mFocusedActivity == r) {
- mService.setFocusedActivityLocked(mStackSupervisor.topRunningActivityLocked());
- }
- }
+
+ adjustFocusedActivityLocked(r);
finishActivityResultsLocked(r, resultCode, resultData);
diff --git a/services/java/com/android/server/am/ActivityStackSupervisor.java b/services/java/com/android/server/am/ActivityStackSupervisor.java
index 523015d..b510643 100644
--- a/services/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/java/com/android/server/am/ActivityStackSupervisor.java
@@ -1051,7 +1051,14 @@
if (app != null && app.thread != null) {
try {
- app.addPackage(r.info.packageName, mService.mProcessStats);
+ if ((r.info.flags&ActivityInfo.FLAG_MULTIPROCESS) == 0
+ || !"android".equals(r.info.packageName)) {
+ // Don't add this if it is a platform component that is marked
+ // to run in multiple processes, because this is actually
+ // part of the framework so doesn't make sense to track as a
+ // separate apk in the process.
+ app.addPackage(r.info.packageName, mService.mProcessStats);
+ }
realStartActivityLocked(r, app, andResume, checkConfig);
return;
} catch (RemoteException e) {
@@ -1254,15 +1261,16 @@
final TaskRecord task = r.task;
if (r.isApplicationActivity() || (task != null && task.isApplicationTask())) {
if (task != null) {
- if (mFocusedStack != task.stack) {
+ final ActivityStack taskStack = task.stack;
+ if (mFocusedStack != taskStack) {
if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
"adjustStackFocus: Setting focused stack to r=" + r + " task=" + task);
- mFocusedStack = task.stack;
+ mFocusedStack = taskStack.isHomeStack() ? null : taskStack;
} else {
if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
"adjustStackFocus: Focused stack already=" + mFocusedStack);
}
- return mFocusedStack;
+ return taskStack;
}
if (mFocusedStack != null) {
@@ -1282,8 +1290,8 @@
}
// Time to create the first app stack for this user.
- int stackId = mService.createStack(-1, HOME_STACK_ID,
- StackBox.TASK_STACK_GOES_OVER, 1.0f);
+ int stackId =
+ mService.createStack(-1, HOME_STACK_ID, StackBox.TASK_STACK_GOES_OVER, 1.0f);
if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, "adjustStackFocus: New stack r=" + r +
" stackId=" + stackId);
mFocusedStack = getStack(stackId);
@@ -1308,7 +1316,8 @@
if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
"setFocusedStack: Setting focused stack to r=" + r + " task=" + r.task +
" Callers=" + Debug.getCallers(3));
- mFocusedStack = r.task.stack;
+ final ActivityStack taskStack = r.task.stack;
+ mFocusedStack = taskStack.isHomeStack() ? null : taskStack;
if (mStackState != STACK_STATE_HOME_IN_BACK) {
if (DEBUG_STACK) Slog.d(TAG, "setFocusedStack: mStackState old=" +
stackStateToString(mStackState) + " new=" +
@@ -2367,12 +2376,13 @@
}
public void dump(PrintWriter pw, String prefix) {
- pw.print(prefix); pw.print("mDismissKeyguardOnNextActivity:");
+ pw.print(prefix); pw.print("mDismissKeyguardOnNextActivity=");
pw.println(mDismissKeyguardOnNextActivity);
- pw.print(prefix); pw.print("mStackState="); pw.println(stackStateToString(mStackState));
- pw.print(prefix); pw.println("mSleepTimeout: " + mSleepTimeout);
- pw.print(prefix); pw.println("mCurTaskId: " + mCurTaskId);
- pw.print(prefix); pw.println("mUserStackInFront: " + mUserStackInFront);
+ pw.print(prefix); pw.print("mFocusedStack=" + mFocusedStack);
+ pw.print(" mStackState="); pw.println(stackStateToString(mStackState));
+ pw.print(prefix); pw.println("mSleepTimeout=" + mSleepTimeout);
+ pw.print(prefix); pw.println("mCurTaskId=" + mCurTaskId);
+ pw.print(prefix); pw.println("mUserStackInFront=" + mUserStackInFront);
}
ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) {
diff --git a/services/java/com/android/server/am/ProcessStatsService.java b/services/java/com/android/server/am/ProcessStatsService.java
index 50a7b5c..8d16880 100644
--- a/services/java/com/android/server/am/ProcessStatsService.java
+++ b/services/java/com/android/server/am/ProcessStatsService.java
@@ -529,6 +529,33 @@
}
}
+ private void dumpAggregatedStats(PrintWriter pw, long aggregateHours, long now,
+ String reqPackage, boolean isCompact, boolean dumpDetails, boolean dumpFullDetails,
+ boolean dumpAll, boolean activeOnly) {
+ ParcelFileDescriptor pfd = getStatsOverTime(aggregateHours*60*60*1000
+ - (ProcessStats.COMMIT_PERIOD/2));
+ if (pfd == null) {
+ pw.println("Unable to build stats!");
+ return;
+ }
+ ProcessStats stats = new ProcessStats(false);
+ InputStream stream = new ParcelFileDescriptor.AutoCloseInputStream(pfd);
+ stats.read(stream);
+ if (stats.mReadError != null) {
+ pw.print("Failure reading: "); pw.println(stats.mReadError);
+ return;
+ }
+ if (isCompact) {
+ stats.dumpCheckinLocked(pw, reqPackage);
+ } else {
+ if (dumpDetails || dumpFullDetails) {
+ stats.dumpLocked(pw, reqPackage, now, !dumpFullDetails, dumpAll, activeOnly);
+ } else {
+ stats.dumpSummaryLocked(pw, reqPackage, now, activeOnly);
+ }
+ }
+ }
+
static private void dumpHelp(PrintWriter pw) {
pw.println("Process stats (procstats) dump options:");
pw.println(" [--checkin|-c|--csv] [--csv-screen] [--csv-proc] [--csv-mem]");
@@ -789,28 +816,8 @@
}
return;
} else if (aggregateHours != 0) {
- ParcelFileDescriptor pfd = getStatsOverTime(aggregateHours*60*60*1000
- - (ProcessStats.COMMIT_PERIOD/2));
- if (pfd == null) {
- pw.println("Unable to build stats!");
- return;
- }
- ProcessStats stats = new ProcessStats(false);
- InputStream stream = new ParcelFileDescriptor.AutoCloseInputStream(pfd);
- stats.read(stream);
- if (stats.mReadError != null) {
- pw.print("Failure reading: "); pw.println(stats.mReadError);
- return;
- }
- if (isCompact) {
- stats.dumpCheckinLocked(pw, reqPackage);
- } else {
- if (dumpDetails || dumpFullDetails) {
- stats.dumpLocked(pw, reqPackage, now, !dumpFullDetails, dumpAll, activeOnly);
- } else {
- stats.dumpSummaryLocked(pw, reqPackage, now, activeOnly);
- }
- }
+ dumpAggregatedStats(pw, aggregateHours, now, reqPackage, isCompact,
+ dumpDetails, dumpFullDetails, dumpAll, activeOnly);
return;
}
@@ -875,6 +882,19 @@
}
}
if (!isCheckin) {
+ if (dumpAll) {
+ if (sepNeeded) {
+ pw.println();
+ pw.println("AGGREGATED OVER LAST 24 HOURS:");
+ }
+ dumpAggregatedStats(pw, 24, now, reqPackage, isCompact,
+ dumpDetails, dumpFullDetails, dumpAll, activeOnly);
+ pw.println();
+ pw.println("AGGREGATED OVER LAST 3 HOURS:");
+ dumpAggregatedStats(pw, 3, now, reqPackage, isCompact,
+ dumpDetails, dumpFullDetails, dumpAll, activeOnly);
+ sepNeeded = true;
+ }
synchronized (mAm) {
if (isCompact) {
mProcessStats.dumpCheckinLocked(pw, reqPackage);
diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java
index 95dc373..e075862 100755
--- a/services/java/com/android/server/pm/PackageManagerService.java
+++ b/services/java/com/android/server/pm/PackageManagerService.java
@@ -3585,7 +3585,13 @@
+ ps.name + " changing from " + updatedPkg.codePathString
+ " to " + scanFile);
updatedPkg.codePath = scanFile;
- updatedPkg.codePathString = scanFile.toString();
+ updatedPkg.codePathString = scanFile.toString();
+ // This is the point at which we know that the system-disk APK
+ // for this package has moved during a reboot (e.g. due to an OTA),
+ // so we need to reevaluate it for privilege policy.
+ if (locationIsPrivileged(scanFile)) {
+ updatedPkg.pkgFlags |= ApplicationInfo.FLAG_PRIVILEGED;
+ }
}
updatedPkg.pkg = pkg;
mLastScanError = PackageManager.INSTALL_FAILED_DUPLICATE_PACKAGE;
diff --git a/services/java/com/android/server/pm/Settings.java b/services/java/com/android/server/pm/Settings.java
index 3b4393a..b0cfd7e 100644
--- a/services/java/com/android/server/pm/Settings.java
+++ b/services/java/com/android/server/pm/Settings.java
@@ -426,12 +426,12 @@
+ "; replacing with new");
p = null;
} else {
- if ((pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0) {
- // If what we are scanning is a system package, then
- // make it so, regardless of whether it was previously
- // installed only in the data partition.
- p.pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
- }
+ // If what we are scanning is a system (and possibly privileged) package,
+ // then make it so, regardless of whether it was previously installed only
+ // in the data partition.
+ final int sysPrivFlags = pkgFlags
+ & (ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_PRIVILEGED);
+ p.pkgFlags |= sysPrivFlags;
}
}
if (p == null) {
diff --git a/services/java/com/android/server/wm/WindowAnimator.java b/services/java/com/android/server/wm/WindowAnimator.java
index ca87b4f..cd46bb8 100644
--- a/services/java/com/android/server/wm/WindowAnimator.java
+++ b/services/java/com/android/server/wm/WindowAnimator.java
@@ -121,12 +121,6 @@
mDisplayContentsAnimators.delete(displayId);
}
- AppWindowAnimator getWallpaperAppAnimator() {
- return mService.mWallpaperTarget == null
- ? null : mService.mWallpaperTarget.mAppToken == null
- ? null : mService.mWallpaperTarget.mAppToken.mAppAnimator;
- }
-
void hideWallpapersLocked(final WindowState w) {
final WindowState wallpaperTarget = mService.mWallpaperTarget;
final WindowState lowerWallpaperTarget = mService.mLowerWallpaperTarget;
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index 55d2e5d..abc2b2b 100644
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -530,6 +530,7 @@
static final long WALLPAPER_TIMEOUT = 150;
// Time we wait after a timeout before trying to wait again.
static final long WALLPAPER_TIMEOUT_RECOVERY = 10000;
+ boolean mAnimateWallpaperWithTarget;
AppWindowToken mFocusedApp = null;
@@ -7636,22 +7637,27 @@
if (displayId != Display.DEFAULT_DISPLAY) {
throw new IllegalArgumentException("Can only set the default display");
}
- synchronized(mWindowMap) {
- // Set some sort of reasonable bounds on the size of the display that we
- // will try to emulate.
- final int MIN_WIDTH = 200;
- final int MIN_HEIGHT = 200;
- final int MAX_SCALE = 2;
- final DisplayContent displayContent = getDisplayContentLocked(displayId);
- if (displayContent != null) {
- width = Math.min(Math.max(width, MIN_WIDTH),
- displayContent.mInitialDisplayWidth * MAX_SCALE);
- height = Math.min(Math.max(height, MIN_HEIGHT),
- displayContent.mInitialDisplayHeight * MAX_SCALE);
- setForcedDisplaySizeLocked(displayContent, width, height);
- Settings.Global.putString(mContext.getContentResolver(),
- Settings.Global.DISPLAY_SIZE_FORCED, width + "," + height);
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ synchronized(mWindowMap) {
+ // Set some sort of reasonable bounds on the size of the display that we
+ // will try to emulate.
+ final int MIN_WIDTH = 200;
+ final int MIN_HEIGHT = 200;
+ final int MAX_SCALE = 2;
+ final DisplayContent displayContent = getDisplayContentLocked(displayId);
+ if (displayContent != null) {
+ width = Math.min(Math.max(width, MIN_WIDTH),
+ displayContent.mInitialDisplayWidth * MAX_SCALE);
+ height = Math.min(Math.max(height, MIN_HEIGHT),
+ displayContent.mInitialDisplayHeight * MAX_SCALE);
+ setForcedDisplaySizeLocked(displayContent, width, height);
+ Settings.Global.putString(mContext.getContentResolver(),
+ Settings.Global.DISPLAY_SIZE_FORCED, width + "," + height);
+ }
}
+ } finally {
+ Binder.restoreCallingIdentity(ident);
}
}
@@ -7722,14 +7728,19 @@
if (displayId != Display.DEFAULT_DISPLAY) {
throw new IllegalArgumentException("Can only set the default display");
}
- synchronized(mWindowMap) {
- final DisplayContent displayContent = getDisplayContentLocked(displayId);
- if (displayContent != null) {
- setForcedDisplaySizeLocked(displayContent, displayContent.mInitialDisplayWidth,
- displayContent.mInitialDisplayHeight);
- Settings.Global.putString(mContext.getContentResolver(),
- Settings.Global.DISPLAY_SIZE_FORCED, "");
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ synchronized(mWindowMap) {
+ final DisplayContent displayContent = getDisplayContentLocked(displayId);
+ if (displayContent != null) {
+ setForcedDisplaySizeLocked(displayContent, displayContent.mInitialDisplayWidth,
+ displayContent.mInitialDisplayHeight);
+ Settings.Global.putString(mContext.getContentResolver(),
+ Settings.Global.DISPLAY_SIZE_FORCED, "");
+ }
}
+ } finally {
+ Binder.restoreCallingIdentity(ident);
}
}
@@ -7770,13 +7781,18 @@
if (displayId != Display.DEFAULT_DISPLAY) {
throw new IllegalArgumentException("Can only set the default display");
}
- synchronized(mWindowMap) {
- final DisplayContent displayContent = getDisplayContentLocked(displayId);
- if (displayContent != null) {
- setForcedDisplayDensityLocked(displayContent, density);
- Settings.Global.putString(mContext.getContentResolver(),
- Settings.Global.DISPLAY_DENSITY_FORCED, Integer.toString(density));
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ synchronized(mWindowMap) {
+ final DisplayContent displayContent = getDisplayContentLocked(displayId);
+ if (displayContent != null) {
+ setForcedDisplayDensityLocked(displayContent, density);
+ Settings.Global.putString(mContext.getContentResolver(),
+ Settings.Global.DISPLAY_DENSITY_FORCED, Integer.toString(density));
+ }
}
+ } finally {
+ Binder.restoreCallingIdentity(ident);
}
}
@@ -7801,13 +7817,19 @@
if (displayId != Display.DEFAULT_DISPLAY) {
throw new IllegalArgumentException("Can only set the default display");
}
- synchronized(mWindowMap) {
- final DisplayContent displayContent = getDisplayContentLocked(displayId);
- if (displayContent != null) {
- setForcedDisplayDensityLocked(displayContent, displayContent.mInitialDisplayDensity);
- Settings.Global.putString(mContext.getContentResolver(),
- Settings.Global.DISPLAY_DENSITY_FORCED, "");
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ synchronized(mWindowMap) {
+ final DisplayContent displayContent = getDisplayContentLocked(displayId);
+ if (displayContent != null) {
+ setForcedDisplayDensityLocked(displayContent,
+ displayContent.mInitialDisplayDensity);
+ Settings.Global.putString(mContext.getContentResolver(),
+ Settings.Global.DISPLAY_DENSITY_FORCED, "");
+ }
}
+ } finally {
+ Binder.restoreCallingIdentity(ident);
}
}
@@ -7855,11 +7877,16 @@
throw new SecurityException("Must hold permission " +
android.Manifest.permission.WRITE_SECURE_SETTINGS);
}
- synchronized(mWindowMap) {
- DisplayContent displayContent = getDisplayContentLocked(displayId);
- if (displayContent != null) {
- setOverscanLocked(displayContent, left, top, right, bottom);
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ synchronized(mWindowMap) {
+ DisplayContent displayContent = getDisplayContentLocked(displayId);
+ if (displayContent != null) {
+ setOverscanLocked(displayContent, left, top, right, bottom);
+ }
}
+ } finally {
+ Binder.restoreCallingIdentity(ident);
}
}
@@ -8490,6 +8517,7 @@
}
}
+ mAnimateWallpaperWithTarget = false;
if (closingAppHasWallpaper && openingAppHasWallpaper) {
if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Wallpaper animation!");
switch (transit) {
@@ -8517,6 +8545,8 @@
transit = AppTransition.TRANSIT_WALLPAPER_OPEN;
if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
"New transit into wallpaper: " + transit);
+ } else {
+ mAnimateWallpaperWithTarget = true;
}
// If all closing windows are obscured, then there is
diff --git a/services/java/com/android/server/wm/WindowStateAnimator.java b/services/java/com/android/server/wm/WindowStateAnimator.java
index e2fae89..af00d83 100644
--- a/services/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/java/com/android/server/wm/WindowStateAnimator.java
@@ -845,9 +845,9 @@
// Wallpapers are animated based on the "real" window they
// are currently targeting.
- if (mIsWallpaper && mService.mLowerWallpaperTarget == null
- && mService.mWallpaperTarget != null) {
- final WindowStateAnimator wallpaperAnimator = mService.mWallpaperTarget.mWinAnimator;
+ final WindowState wallpaperTarget = mService.mWallpaperTarget;
+ if (mIsWallpaper && wallpaperTarget != null && mService.mAnimateWallpaperWithTarget) {
+ final WindowStateAnimator wallpaperAnimator = wallpaperTarget.mWinAnimator;
if (wallpaperAnimator.mHasLocalTransformation &&
wallpaperAnimator.mAnimation != null &&
!wallpaperAnimator.mAnimation.getDetachWallpaper()) {
@@ -856,8 +856,9 @@
Slog.v(TAG, "WP target attached xform: " + attachedTransformation);
}
}
- final AppWindowAnimator wpAppAnimator = mAnimator.getWallpaperAppAnimator();
- if (wpAppAnimator != null && wpAppAnimator.hasTransformation
+ final AppWindowAnimator wpAppAnimator = wallpaperTarget.mAppToken == null ?
+ null : wallpaperTarget.mAppToken.mAppAnimator;
+ if (wpAppAnimator != null && wpAppAnimator.hasTransformation
&& wpAppAnimator.animation != null
&& !wpAppAnimator.animation.getDetachWallpaper()) {
appTransformation = wpAppAnimator.transformation;