Merge "Fix broken trust agent reloading v2"
diff --git a/api/current.txt b/api/current.txt
index 54c9d90..0807d0f 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -7762,6 +7762,8 @@
public class LauncherApps {
method public synchronized void addOnAppsChangedListener(android.content.pm.LauncherApps.OnAppsChangedListener);
method public java.util.List<android.content.pm.LauncherActivityInfo> getActivityList(java.lang.String, android.os.UserHandle);
+ method public boolean isActivityEnabledForProfile(android.content.ComponentName, android.os.UserHandle);
+ method public boolean isPackageEnabledForProfile(java.lang.String, android.os.UserHandle);
method public synchronized void removeOnAppsChangedListener(android.content.pm.LauncherApps.OnAppsChangedListener);
method public android.content.pm.LauncherActivityInfo resolveActivity(android.content.Intent, android.os.UserHandle);
method public void startActivityForProfile(android.content.ComponentName, android.graphics.Rect, android.os.Bundle, android.os.UserHandle);
diff --git a/cmds/app_process/app_main.cpp b/cmds/app_process/app_main.cpp
index 391c197..74ccbc2 100644
--- a/cmds/app_process/app_main.cpp
+++ b/cmds/app_process/app_main.cpp
@@ -145,7 +145,7 @@
static const char kInstructionSet[] = "x86_64";
#elif defined(__arm__)
static const char kInstructionSet[] = "arm";
-#elif defined(__x86__)
+#elif defined(__i386__)
static const char kInstructionSet[] = "x86";
#elif defined (__mips__)
static const char kInstructionSet[] = "mips";
diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp
index 1780e03..3dc024ed 100644
--- a/cmds/bootanimation/BootAnimation.cpp
+++ b/cmds/bootanimation/BootAnimation.cpp
@@ -156,12 +156,12 @@
return NO_ERROR;
}
-status_t BootAnimation::initTexture(void* buffer, size_t len)
+status_t BootAnimation::initTexture(const Animation::Frame& frame)
{
//StopWatch watch("blah");
SkBitmap bitmap;
- SkMemoryStream stream(buffer, len);
+ SkMemoryStream stream(frame.map->getDataPtr(), frame.map->getDataLength());
SkImageDecoder* codec = SkImageDecoder::Factory(&stream);
if (codec) {
codec->setDitherImage(false);
@@ -171,6 +171,11 @@
delete codec;
}
+ // FileMap memory is never released until application exit.
+ // Release it now as the texture is already loaded and the memory used for
+ // the packed resource can be released.
+ frame.map->release();
+
// ensure we can call getPixels(). No need to call unlock, since the
// bitmap will go out of scope when we return from this method.
bitmap.lockPixels();
@@ -409,6 +414,7 @@
String8 desString((char const*)descMap->getDataPtr(),
descMap->getDataLength());
+ descMap->release();
char const* s = desString.string();
Animation animation;
@@ -533,9 +539,7 @@
glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}
- initTexture(
- frame.map->getDataPtr(),
- frame.map->getDataLength());
+ initTexture(frame);
}
if (!clearReg.isEmpty()) {
diff --git a/cmds/bootanimation/BootAnimation.h b/cmds/bootanimation/BootAnimation.h
index 22963c2..ba1c507 100644
--- a/cmds/bootanimation/BootAnimation.h
+++ b/cmds/bootanimation/BootAnimation.h
@@ -79,7 +79,7 @@
};
status_t initTexture(Texture* texture, AssetManager& asset, const char* name);
- status_t initTexture(void* buffer, size_t len);
+ status_t initTexture(const Animation::Frame& frame);
bool android();
bool movie();
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 018e949..9239faf 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -1627,13 +1627,6 @@
public int lastTrimLevel;
/**
- * Constant for {@link #importance}: this is a persistent process.
- * Only used when reporting to process observers.
- * @hide
- */
- public static final int IMPORTANCE_PERSISTENT = 50;
-
- /**
* Constant for {@link #importance}: this process is running the
* foreground UI.
*/
@@ -1748,9 +1741,16 @@
*/
public int importanceReasonImportance;
+ /**
+ * Current process state, as per PROCESS_STATE_* constants.
+ * @hide
+ */
+ public int processState;
+
public RunningAppProcessInfo() {
importance = IMPORTANCE_FOREGROUND;
importanceReasonCode = REASON_UNKNOWN;
+ processState = PROCESS_STATE_IMPORTANT_FOREGROUND;
}
public RunningAppProcessInfo(String pProcessName, int pPid, String pArr[]) {
@@ -1776,6 +1776,7 @@
dest.writeInt(importanceReasonPid);
ComponentName.writeToParcel(importanceReasonComponent, dest);
dest.writeInt(importanceReasonImportance);
+ dest.writeInt(processState);
}
public void readFromParcel(Parcel source) {
@@ -1791,6 +1792,7 @@
importanceReasonPid = source.readInt();
importanceReasonComponent = ComponentName.readFromParcel(source);
importanceReasonImportance = source.readInt();
+ processState = source.readInt();
}
public static final Creator<RunningAppProcessInfo> CREATOR =
diff --git a/core/java/android/app/ActivityTransitionCoordinator.java b/core/java/android/app/ActivityTransitionCoordinator.java
index f96c3e3..3c1455b 100644
--- a/core/java/android/app/ActivityTransitionCoordinator.java
+++ b/core/java/android/app/ActivityTransitionCoordinator.java
@@ -206,6 +206,7 @@
private ResultReceiver mRemoteResultReceiver;
private boolean mNotifiedSharedElementTransitionComplete;
private boolean mNotifiedExitTransitionComplete;
+ private boolean mSharedElementTransitionStarted;
private FixedEpicenterCallback mEpicenterCallback = new FixedEpicenterCallback();
@@ -250,7 +251,11 @@
onPrepareRestore();
break;
case MSG_EXIT_TRANSITION_COMPLETE:
- onRemoteSceneExitComplete();
+ if (!mSharedElementTransitionStarted) {
+ send(resultCode, resultData);
+ } else {
+ onRemoteSceneExitComplete();
+ }
break;
case MSG_TAKE_SHARED_ELEMENTS:
ArrayList<String> sharedElementNames
@@ -456,9 +461,13 @@
mTargetSharedNames.clear();
if (sharedElements == null) {
ArrayMap<String, View> map = new ArrayMap<String, View>();
- setViewVisibility(mEnteringViews, View.VISIBLE);
+ if (getViewsTransition() != null) {
+ setViewVisibility(mEnteringViews, View.VISIBLE);
+ }
getDecor().findSharedElements(map);
- setViewVisibility(mEnteringViews, View.INVISIBLE);
+ if (getViewsTransition() != null) {
+ setViewVisibility(mEnteringViews, View.INVISIBLE);
+ }
for (int i = 0; i < map.size(); i++) {
View view = map.valueAt(i);
String name = map.keyAt(i);
@@ -582,6 +591,7 @@
getDecor().getViewTreeObserver().removeOnPreDrawListener(this);
mListener.onCaptureSharedElementEnd(mTargetSharedNames, mSharedElements,
acceptedOverlayViews);
+ mSharedElementTransitionStarted = true;
return true;
}
}
diff --git a/core/java/android/app/EnterTransitionCoordinator.java b/core/java/android/app/EnterTransitionCoordinator.java
index 0798529..c26e68a 100644
--- a/core/java/android/app/EnterTransitionCoordinator.java
+++ b/core/java/android/app/EnterTransitionCoordinator.java
@@ -135,11 +135,6 @@
}
@Override
- protected void onRemoteSceneExitComplete() {
- super.onRemoteSceneExitComplete();
- }
-
- @Override
protected void onTakeSharedElements(ArrayList<String> sharedElementNames, Bundle state) {
mEnteringSharedElementNames = new ArrayList<String>();
mEnteringSharedElementNames.addAll(sharedElementNames);
@@ -149,6 +144,7 @@
@Override
protected void sharedElementTransitionComplete(Bundle bundle) {
notifySharedElementTransitionComplete(bundle);
+ exitAfterSharedElementTransition();
}
@Override
@@ -280,7 +276,7 @@
}
private void exitAfterSharedElementTransition() {
- if (mSharedElementTransitionComplete && mExitTransitionComplete) {
+ if (mSharedElementTransitionComplete && mExitTransitionComplete && mBackgroundFadedOut) {
mActivity.finish();
if (mSupportsTransition) {
mActivity.overridePendingTransition(0, 0);
diff --git a/core/java/android/app/IProcessObserver.aidl b/core/java/android/app/IProcessObserver.aidl
index e587912..ecf2c73 100644
--- a/core/java/android/app/IProcessObserver.aidl
+++ b/core/java/android/app/IProcessObserver.aidl
@@ -20,7 +20,7 @@
oneway interface IProcessObserver {
void onForegroundActivitiesChanged(int pid, int uid, boolean foregroundActivities);
- void onImportanceChanged(int pid, int uid, int importance);
+ void onProcessStateChanged(int pid, int uid, int procState);
void onProcessDied(int pid, int uid);
}
diff --git a/core/java/android/content/pm/ILauncherApps.aidl b/core/java/android/content/pm/ILauncherApps.aidl
index 796b113..0acf043 100644
--- a/core/java/android/content/pm/ILauncherApps.aidl
+++ b/core/java/android/content/pm/ILauncherApps.aidl
@@ -35,4 +35,6 @@
ResolveInfo resolveActivity(in Intent intent, in UserHandle user);
void startActivityAsUser(in ComponentName component, in Rect sourceBounds,
in Bundle opts, in UserHandle user);
+ boolean isPackageEnabled(String packageName, in UserHandle user);
+ boolean isActivityEnabled(in ComponentName component, in UserHandle user);
}
diff --git a/core/java/android/content/pm/LauncherApps.java b/core/java/android/content/pm/LauncherApps.java
index 5187181..8025b60 100644
--- a/core/java/android/content/pm/LauncherApps.java
+++ b/core/java/android/content/pm/LauncherApps.java
@@ -187,6 +187,39 @@
}
/**
+ * Checks if the package is installed and enabled for a profile.
+ *
+ * @param packageName The package to check.
+ * @param user The UserHandle of the profile.
+ *
+ * @return true if the package exists and is enabled.
+ */
+ public boolean isPackageEnabledForProfile(String packageName, UserHandle user) {
+ try {
+ return mService.isPackageEnabled(packageName, user);
+ } catch (RemoteException re) {
+ return false;
+ }
+ }
+
+ /**
+ * Checks if the activity exists and it enabled for a profile.
+ *
+ * @param component The activity to check.
+ * @param user The UserHandle of the profile.
+ *
+ * @return true if the activity exists and is enabled.
+ */
+ public boolean isActivityEnabledForProfile(ComponentName component, UserHandle user) {
+ try {
+ return mService.isActivityEnabled(component, user);
+ } catch (RemoteException re) {
+ return false;
+ }
+ }
+
+
+ /**
* Adds a listener for changes to packages in current and managed profiles.
*
* @param listener The listener to add.
diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp
index d04b1f8..a710c03 100644
--- a/media/jni/android_media_MediaCodec.cpp
+++ b/media/jni/android_media_MediaCodec.cpp
@@ -255,7 +255,7 @@
env, env->FindClass("android/media/MediaCodec$BufferInfo"));
jmethodID method = env->GetMethodID(clazz.get(), "set", "(IIJI)V");
- env->CallVoidMethod(bufferInfo, method, offset, size, timeUs, flags);
+ env->CallVoidMethod(bufferInfo, method, (jint)offset, (jint)size, timeUs, flags);
return OK;
}
diff --git a/packages/InputDevices/res/raw/keyboard_layout_czech.kcm b/packages/InputDevices/res/raw/keyboard_layout_czech.kcm
index f710a8e..dc614db 100644
--- a/packages/InputDevices/res/raw/keyboard_layout_czech.kcm
+++ b/packages/InputDevices/res/raw/keyboard_layout_czech.kcm
@@ -13,7 +13,7 @@
# limitations under the License.
#
-# Czech keyboard layout.
+# Czech (EU - qwerty) keyboard layout.
#
type OVERLAY
@@ -26,6 +26,8 @@
label: ';'
base: ';'
shift: '\u00b0'
+ ralt: '\u0060'
+ shift+ralt: '\u007e'
}
key 1 {
@@ -38,6 +40,7 @@
key 2 {
label: '2'
base: '\u011b'
+ capslock: '\u011a'
shift: '2'
ralt: '@'
}
@@ -45,6 +48,7 @@
key 3 {
label: '3'
base: '\u0161'
+ capslock: '\u0160'
shift: '3'
ralt: '#'
}
@@ -52,6 +56,7 @@
key 4 {
label: '4'
base: '\u010d'
+ capslock: '\u010c'
shift: '4'
ralt: '$'
}
@@ -59,6 +64,7 @@
key 5 {
label: '5'
base: '\u0159'
+ capslock: '\u0158'
shift: '5'
ralt: '%'
}
@@ -66,6 +72,7 @@
key 6 {
label: '6'
base: '\u017e'
+ capslock: '\u017d'
shift: '6'
ralt: '^'
}
@@ -73,6 +80,7 @@
key 7 {
label: '7'
base: '\u00fd'
+ capslock: '\u00dd'
shift: '7'
ralt: '&'
}
@@ -80,6 +88,7 @@
key 8 {
label: '8'
base: '\u00e1'
+ capslock: '\u00c1'
shift: '8'
ralt: '*'
}
@@ -87,6 +96,7 @@
key 9 {
label: '9'
base: '\u00ed'
+ capslock: '\u00cd'
shift: '9'
ralt: '('
}
@@ -94,6 +104,7 @@
key 0 {
label: '0'
base: '\u00e9'
+ capslock: '\u00c9'
shift: '0'
ralt: ')'
}
@@ -180,6 +191,7 @@
key LEFT_BRACKET {
label: '\u00fa'
base: '\u00fa'
+ capslock: '\u00da'
shift: '/'
ralt: '['
ralt+shift: '{'
@@ -252,6 +264,7 @@
key SEMICOLON {
label: '\u016f'
base: '\u016f'
+ capslock: '\u016e'
shift: '"'
ralt: ';'
ralt+shift: ':'
@@ -261,8 +274,8 @@
label: '\u00a7'
base: '\u00a7'
shift: '!'
- ralt: '\''
- ralt+shift: '"'
+ ralt: '\u00a4'
+ ralt+shift: '\u005e'
}
key BACKSLASH {
@@ -279,6 +292,8 @@
label: '\\'
base: '\\'
shift: '|'
+ ralt: '\u00df'
+ shift+ralt: '\u02dd'
}
key Z {
@@ -330,6 +345,7 @@
base: ','
shift: '?'
ralt: '<'
+ shift+ralt: '\u00d7'
}
key PERIOD {
@@ -337,6 +353,7 @@
base: '.'
shift: ':'
ralt: '>'
+ shift+ralt: '\u00f7'
}
key SLASH {
diff --git a/packages/InputDevices/res/raw/keyboard_layout_english_us_intl.kcm b/packages/InputDevices/res/raw/keyboard_layout_english_us_intl.kcm
index 0fabf02..66c1c98 100644
--- a/packages/InputDevices/res/raw/keyboard_layout_english_us_intl.kcm
+++ b/packages/InputDevices/res/raw/keyboard_layout_english_us_intl.kcm
@@ -122,7 +122,7 @@
base: 'q'
shift, capslock: 'Q'
ralt: '\u00e4'
- shift+ralt: '\u00c4'
+ shift+ralt, capslock+ralt: '\u00c4'
}
key W {
@@ -130,7 +130,7 @@
base: 'w'
shift, capslock: 'W'
ralt: '\u00e5'
- shift+ralt: '\u00c5'
+ shift+ralt, capslock+ralt: '\u00c5'
}
key E {
@@ -138,7 +138,7 @@
base: 'e'
shift, capslock: 'E'
ralt: '\u00e9'
- shift+ralt: '\u00c9'
+ shift+ralt, capslock+ralt: '\u00c9'
}
key R {
@@ -153,7 +153,7 @@
base: 't'
shift, capslock: 'T'
ralt: '\u00fe'
- shift+ralt: '\u00de'
+ shift+ralt, capslock+ralt: '\u00de'
}
key Y {
@@ -161,7 +161,7 @@
base: 'y'
shift, capslock: 'Y'
ralt: '\u00fc'
- shift+ralt: '\u00dc'
+ shift+ralt, capslock+ralt: '\u00dc'
}
key U {
@@ -169,7 +169,7 @@
base: 'u'
shift, capslock: 'U'
ralt: '\u00fa'
- shift+ralt: '\u00da'
+ shift+ralt, capslock+ralt: '\u00da'
}
key I {
@@ -177,7 +177,7 @@
base: 'i'
shift, capslock: 'I'
ralt: '\u00ed'
- shift+ralt: '\u00cd'
+ shift+ralt, capslock+ralt: '\u00cd'
}
key O {
@@ -185,7 +185,7 @@
base: 'o'
shift, capslock: 'O'
ralt: '\u00f3'
- shift+ralt: '\u00d3'
+ shift+ralt, capslock+ralt: '\u00d3'
}
key P {
@@ -193,7 +193,7 @@
base: 'p'
shift, capslock: 'P'
ralt: '\u00f6'
- shift+ralt: '\u00d6'
+ shift+ralt, capslock+ralt: '\u00d6'
}
key LEFT_BRACKET {
@@ -225,7 +225,7 @@
base: 'a'
shift, capslock: 'A'
ralt: '\u00e1'
- shift+ralt: '\u00c1'
+ shift+ralt, ralt+capslock: '\u00c1'
}
key S {
@@ -241,7 +241,7 @@
base: 'd'
shift, capslock: 'D'
ralt: '\u00f0'
- shift+ralt: '\u00d0'
+ shift+ralt, capslock+ralt: '\u00d0'
}
key F {
@@ -279,7 +279,7 @@
base: 'l'
shift, capslock: 'L'
ralt: '\u00f8'
- shift+ralt: '\u00d8'
+ shift+ralt, capslock+ralt: '\u00d8'
}
key SEMICOLON {
@@ -313,7 +313,7 @@
base: 'z'
shift, capslock: 'Z'
ralt: '\u00e6'
- shift+ralt: '\u00c6'
+ shift+ralt, capslock+ralt: '\u00c6'
}
key X {
@@ -347,7 +347,7 @@
base: 'n'
shift, capslock: 'N'
ralt: '\u00f1'
- shift+ralt: '\u00d1'
+ shift+ralt, capslock+ralt: '\u00d1'
}
key M {
@@ -362,7 +362,7 @@
base: ','
shift: '<'
ralt: '\u00e7'
- shift+ralt: '\u00c7'
+ shift+ralt, capslock+ralt: '\u00c7'
}
key PERIOD {
diff --git a/packages/InputDevices/res/raw/keyboard_layout_slovak.kcm b/packages/InputDevices/res/raw/keyboard_layout_slovak.kcm
index 70c1fa4..2eb0f63 100644
--- a/packages/InputDevices/res/raw/keyboard_layout_slovak.kcm
+++ b/packages/InputDevices/res/raw/keyboard_layout_slovak.kcm
@@ -13,7 +13,7 @@
# limitations under the License.
#
-# Slovak keyboard layout.
+# Slovak (EU - qwerty) keyboard layout.
#
type OVERLAY
@@ -26,94 +26,90 @@
label: ';'
base: ';'
shift: '\u00b0'
- ralt: '`'
- ralt+shift: '~'
}
key 1 {
label: '1'
base: '+'
shift: '1'
- ralt: '!'
+ ralt: '~'
}
key 2 {
label: '2'
base: '\u013e'
shift: '2'
- ralt: '@'
+ ralt: '\u02c7'
}
key 3 {
label: '3'
base: '\u0161'
shift: '3'
- ralt: '#'
+ ralt: '\u0302'
}
key 4 {
label: '4'
base: '\u010d'
shift: '4'
- ralt: '$'
+ ralt: '\u02d8'
}
key 5 {
label: '5'
base: '\u0165'
shift: '5'
- ralt: '%'
+ ralt: '\u00b0'
}
key 6 {
label: '6'
base: '\u017e'
shift: '6'
- ralt: '^'
+ ralt: '\u02db'
}
key 7 {
label: '7'
base: '\u00fd'
shift: '7'
- ralt: '&'
+ ralt: '\u0300'
}
key 8 {
label: '8'
base: '\u00e1'
shift: '8'
- ralt: '*'
+ ralt: '\u02d9'
}
key 9 {
label: '9'
base: '\u00ed'
shift: '9'
- ralt: '('
+ ralt: '\u0301'
}
key 0 {
label: '0'
base: '\u00e9'
shift: '0'
- ralt: ')'
+ ralt: '\u02dd'
}
key MINUS {
label: '='
base: '='
shift: '%'
- ralt: '-'
- ralt+shift: '_'
+ ralt: '\u0308'
}
key EQUALS {
label: '\u00b4'
base: '\u0301'
shift: '\u030c'
- ralt: '='
- ralt+shift: '+'
+ ralt: '\u00b8'
}
### ROW 2
@@ -179,22 +175,21 @@
label: 'P'
base: 'p'
shift, capslock: 'P'
+ ralt: '\''
}
key LEFT_BRACKET {
label: '\u00fa'
base: '\u00fa'
shift: '/'
- ralt: '['
- ralt+shift: '{'
+ ralt: '\u00f7'
}
key RIGHT_BRACKET {
label: '\u00e4'
base: '\u00e4'
shift: '('
- ralt: ']'
- ralt+shift: '}'
+ ralt: '\u00d7'
}
### ROW 3
@@ -209,24 +204,28 @@
label: 'S'
base: 's'
shift, capslock: 'S'
+ ralt: '\u0111'
}
key D {
label: 'D'
base: 'd'
shift, capslock: 'D'
+ ralt: '\u0110'
}
key F {
label: 'F'
base: 'f'
shift, capslock: 'F'
+ ralt: '['
}
key G {
label: 'G'
base: 'g'
shift, capslock: 'G'
+ ralt: ']'
}
key H {
@@ -245,64 +244,65 @@
label: 'K'
base: 'k'
shift, capslock: 'K'
+ ralt: '\u0142'
}
key L {
label: 'L'
base: 'l'
shift, capslock: 'L'
+ ralt: '\u0141'
}
key SEMICOLON {
label: '\u00f4'
base: '\u00f4'
shift: '"'
- ralt: ';'
- ralt+shift: ':'
+ ralt: '$'
}
key APOSTROPHE {
label: '\u00a7'
base: '\u00a7'
shift: '!'
- ralt: '\''
- ralt+shift: '"'
+ ralt: '\u00df'
}
key BACKSLASH {
label: '\u0148'
base: '\u0148'
shift: ')'
- ralt: '\\'
- ralt+shift: '|'
+ ralt: '\u00a4'
}
### ROW 4
key PLUS {
- label: '\\'
- base: '\\'
- shift: '|'
- ralt: '&'
- ralt+shift: '*'
+ label: '&'
+ base: '&'
+ shift: '*'
+ ralt: '<'
}
key Z {
label: 'Z'
base: 'z'
shift, capslock: 'Z'
+ ralt: '>'
}
key X {
label: 'X'
base: 'x'
shift, capslock: 'X'
+ ralt: '#'
}
key C {
label: 'C'
base: 'c'
shift, capslock: 'C'
+ ralt: '&'
}
key V {
@@ -316,12 +316,14 @@
label: 'B'
base: 'b'
shift, capslock: 'B'
+ ralt: '{'
}
key N {
label: 'N'
base: 'n'
shift, capslock: 'N'
+ ralt: '}'
}
key M {
@@ -348,6 +350,5 @@
label: '-'
base: '-'
shift: '_'
- ralt: '/'
- ralt+shift: '?'
+ ralt: '*'
}
diff --git a/packages/InputDevices/res/raw/keyboard_layout_swiss_french.kcm b/packages/InputDevices/res/raw/keyboard_layout_swiss_french.kcm
index a75d154..9e20462 100644
--- a/packages/InputDevices/res/raw/keyboard_layout_swiss_french.kcm
+++ b/packages/InputDevices/res/raw/keyboard_layout_swiss_french.kcm
@@ -56,12 +56,14 @@
label: '4'
base: '4'
shift: '\u00e7'
+ ralt: '\u00b0'
}
key 5 {
label: '5'
base: '5'
shift: '%'
+ ralt: '\u00a7'
}
key 6 {
diff --git a/packages/InputDevices/res/raw/keyboard_layout_swiss_german.kcm b/packages/InputDevices/res/raw/keyboard_layout_swiss_german.kcm
index ae93f4b..7fbd1a9 100644
--- a/packages/InputDevices/res/raw/keyboard_layout_swiss_german.kcm
+++ b/packages/InputDevices/res/raw/keyboard_layout_swiss_german.kcm
@@ -56,12 +56,14 @@
label: '4'
base: '4'
shift: '\u00e7'
+ ralt: '\u00b0'
}
key 5 {
label: '5'
base: '5'
shift: '%'
+ ralt: '\u00a7'
}
key 6 {
@@ -178,6 +180,8 @@
label: '\u00fc'
base: '\u00fc'
shift: '\u00e8'
+ capslock: '\u00dc'
+ capslock+shift: '\u00c8'
ralt: '['
}
@@ -248,12 +252,16 @@
label: '\u00f6'
base: '\u00f6'
shift: '\u00e9'
+ capslock: '\u00d6'
+ capslock+shift: '\u00c9'
}
key APOSTROPHE {
label: '\u00e4'
base: '\u00e4'
shift: '\u00e0'
+ capslock: '\u00c4'
+ capslock+shift: '\u00c0'
ralt: '{'
}
diff --git a/packages/SystemUI/res/layout/notification_adaptive_wrapper.xml b/packages/SystemUI/res/layout/notification_adaptive_wrapper.xml
deleted file mode 100644
index 15d0890..0000000
--- a/packages/SystemUI/res/layout/notification_adaptive_wrapper.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?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.
--->
-<SizeAdaptiveLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:background="@android:color/background_dark"
- android:id="@+id/notification_adaptive_wrapper"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />
diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
index 74483cc..4857adc 100644
--- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
+++ b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
@@ -211,6 +211,7 @@
if (mReceiver != null) {
unregisterReceiver(mReceiver);
}
+ mBackground = null;
}
void updateSurfaceSize(SurfaceHolder surfaceHolder) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java
deleted file mode 100644
index 266cecf..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-package com.android.systemui.statusbar.policy;
-
-import android.animation.LayoutTransition;
-import android.animation.ValueAnimator;
-import android.content.Context;
-import android.content.res.Configuration;
-import android.graphics.Rect;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewConfiguration;
-import android.view.ViewGroup;
-import android.widget.LinearLayout;
-
-import com.android.systemui.ExpandHelper;
-import com.android.systemui.R;
-import com.android.systemui.SwipeHelper;
-import com.android.systemui.statusbar.ExpandableNotificationRow;
-
-import java.util.HashMap;
-
-public class NotificationRowLayout
- extends LinearLayout
- implements SwipeHelper.Callback, ExpandHelper.Callback
-{
- private static final String TAG = "NotificationRowLayout";
- private static final boolean DEBUG = false;
- private static final boolean SLOW_ANIMATIONS = DEBUG;
-
- private static final int APPEAR_ANIM_LEN = SLOW_ANIMATIONS ? 5000 : 250;
- private static final int DISAPPEAR_ANIM_LEN = APPEAR_ANIM_LEN;
-
- boolean mAnimateBounds = true;
-
- Rect mTmpRect = new Rect();
-
- HashMap<View, ValueAnimator> mAppearingViews = new HashMap<View, ValueAnimator>();
- HashMap<View, ValueAnimator> mDisappearingViews = new HashMap<View, ValueAnimator>();
-
- private SwipeHelper mSwipeHelper;
-
- private OnSizeChangedListener mOnSizeChangedListener;
-
- // Flag set during notification removal animation to avoid causing too much work until
- // animation is done
- boolean mRemoveViews = true;
-
- private LayoutTransition mRealLayoutTransition;
-
- public NotificationRowLayout(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public NotificationRowLayout(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
-
- mRealLayoutTransition = new LayoutTransition();
- mRealLayoutTransition.setAnimateParentHierarchy(true);
- setLayoutTransitionsEnabled(true);
-
- setOrientation(LinearLayout.VERTICAL);
-
- if (DEBUG) {
- setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() {
- @Override
- public void onChildViewAdded(View parent, View child) {
- Log.d(TAG, "view added: " + child + "; new count: " + getChildCount());
- }
- @Override
- public void onChildViewRemoved(View parent, View child) {
- Log.d(TAG, "view removed: " + child + "; new count: " + (getChildCount() - 1));
- }
- });
-
- setBackgroundColor(0x80FF8000);
- }
-
- float densityScale = getResources().getDisplayMetrics().density;
- float pagingTouchSlop = ViewConfiguration.get(getContext()).getScaledPagingTouchSlop();
- mSwipeHelper = new SwipeHelper(SwipeHelper.X, this, densityScale, pagingTouchSlop);
- }
-
- public void setLongPressListener(View.OnLongClickListener listener) {
- mSwipeHelper.setLongPressListener(listener);
- }
-
- public void setOnSizeChangedListener(OnSizeChangedListener l) {
- mOnSizeChangedListener = l;
- }
-
- @Override
- public void onWindowFocusChanged(boolean hasWindowFocus) {
- super.onWindowFocusChanged(hasWindowFocus);
- if (!hasWindowFocus) {
- mSwipeHelper.removeLongPressCallback();
- }
- }
-
- public void setAnimateBounds(boolean anim) {
- mAnimateBounds = anim;
- }
-
- private void logLayoutTransition() {
- Log.v(TAG, "layout " +
- (mRealLayoutTransition.isChangingLayout() ? "is " : "is not ") +
- "in transition and animations " +
- (mRealLayoutTransition.isRunning() ? "are " : "are not ") +
- "running.");
- }
-
- @Override
- public boolean onInterceptTouchEvent(MotionEvent ev) {
- if (DEBUG) Log.v(TAG, "onInterceptTouchEvent()");
- if (DEBUG) logLayoutTransition();
-
- return mSwipeHelper.onInterceptTouchEvent(ev) ||
- super.onInterceptTouchEvent(ev);
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent ev) {
- if (DEBUG) Log.v(TAG, "onTouchEvent()");
- if (DEBUG) logLayoutTransition();
-
- return mSwipeHelper.onTouchEvent(ev) ||
- super.onTouchEvent(ev);
- }
-
- public boolean canChildBeDismissed(View v) {
- final View veto = v.findViewById(R.id.veto);
- return (veto != null && veto.getVisibility() != View.GONE);
- }
-
- public boolean canChildBeExpanded(View v) {
- return v instanceof ExpandableNotificationRow
- && ((ExpandableNotificationRow) v).isExpandable();
- }
-
- public void setUserExpandedChild(View v, boolean userExpanded) {
- if (v instanceof ExpandableNotificationRow) {
- ((ExpandableNotificationRow) v).setUserExpanded(userExpanded);
- }
- }
-
- public void setUserLockedChild(View v, boolean userLocked) {
- if (v instanceof ExpandableNotificationRow) {
- ((ExpandableNotificationRow) v).setUserLocked(userLocked);
- }
- }
-
- public void onChildDismissed(View v) {
- if (DEBUG) Log.v(TAG, "onChildDismissed: " + v + " mRemoveViews=" + mRemoveViews);
- final View veto = v.findViewById(R.id.veto);
- if (veto != null && veto.getVisibility() != View.GONE && mRemoveViews) {
- veto.performClick();
- }
- }
-
- public void onBeginDrag(View v) {
- // We need to prevent the surrounding ScrollView from intercepting us now;
- // the scroll position will be locked while we swipe
- requestDisallowInterceptTouchEvent(true);
- }
-
- public void onDragCancelled(View v) {
- }
-
- public View getChildAtPosition(MotionEvent ev) {
- return getChildAtPosition(ev.getX(), ev.getY());
- }
-
- public View getChildAtRawPosition(float touchX, float touchY) {
- int[] location = new int[2];
- getLocationOnScreen(location);
- return getChildAtPosition((float) (touchX - location[0]), (float) (touchY - location[1]));
- }
-
- public View getChildAtPosition(float touchX, float touchY) {
- // find the view under the pointer, accounting for GONE views
- final int count = getChildCount();
- int y = 0;
- int childIdx = 0;
- View slidingChild;
- for (; childIdx < count; childIdx++) {
- slidingChild = getChildAt(childIdx);
- if (slidingChild.getVisibility() == GONE) {
- continue;
- }
- y += slidingChild.getMeasuredHeight();
- if (touchY < y) return slidingChild;
- }
- return null;
- }
-
- public View getChildContentView(View v) {
- return v;
- }
-
- @Override
- protected void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
- float densityScale = getResources().getDisplayMetrics().density;
- mSwipeHelper.setDensityScale(densityScale);
- float pagingTouchSlop = ViewConfiguration.get(getContext()).getScaledPagingTouchSlop();
- mSwipeHelper.setPagingTouchSlop(pagingTouchSlop);
- }
-
-
- /**
- * Sets a flag to tell us whether to actually remove views. Removal is delayed by setting this
- * to false during some animations to smooth out performance. Callers should restore the
- * flag to true after the animation is done, and then they should make sure that the views
- * get removed properly.
- */
- public void setViewRemoval(boolean removeViews) {
- if (DEBUG) Log.v(TAG, "setViewRemoval: " + removeViews);
- mRemoveViews = removeViews;
- }
-
- // Suppress layout transitions for a little while.
- public void setLayoutTransitionsEnabled(boolean b) {
- if (b) {
- setLayoutTransition(mRealLayoutTransition);
- } else {
- if (mRealLayoutTransition.isRunning()) {
- mRealLayoutTransition.cancel();
- }
- setLayoutTransition(null);
- }
- }
-
- public void dismissRowAnimated(View child) {
- dismissRowAnimated(child, 0);
- }
-
- public void dismissRowAnimated(View child, int vel) {
- mSwipeHelper.dismissChild(child, vel);
- }
-
- @Override
- public void onFinishInflate() {
- super.onFinishInflate();
- if (DEBUG) setWillNotDraw(false);
- }
-
- @Override
- public void onDraw(android.graphics.Canvas c) {
- super.onDraw(c);
- if (DEBUG) logLayoutTransition();
- if (DEBUG) {
- //Log.d(TAG, "onDraw: canvas height: " + c.getHeight() + "px; measured height: "
- // + getMeasuredHeight() + "px");
- c.save();
- c.clipRect(6, 6, c.getWidth() - 6, getMeasuredHeight() - 6,
- android.graphics.Region.Op.DIFFERENCE);
- c.drawColor(0xFFFF8000);
- c.restore();
- }
- }
-
- @Override
- protected void onSizeChanged(int w, int h, int oldw, int oldh) {
- if (mOnSizeChangedListener != null) {
- mOnSizeChangedListener.onSizeChanged(this, w, h, oldw, oldh);
- }
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/OnSizeChangedListener.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/OnSizeChangedListener.java
deleted file mode 100644
index 0377123..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/OnSizeChangedListener.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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.
- */
-
-package com.android.systemui.statusbar.policy;
-
-import android.view.View;
-
-public interface OnSizeChangedListener {
- void onSizeChanged(View view, int w, int h, int oldw, int oldh);
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java
index 9c6238f..24daa4f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java
@@ -66,8 +66,8 @@
}
initializeAddedViewStates(mAnimationEvents, finalState);
int childCount = mHostLayout.getChildCount();
+ boolean isFirstAnimatingView = true;
for (int i = 0; i < childCount; i++) {
- final boolean isFirstView = i == 0;
final ExpandableView child = (ExpandableView) mHostLayout.getChildAt(i);
StackScrollState.ViewState viewState = finalState.getViewStateForView(child);
if (viewState == null) {
@@ -80,7 +80,7 @@
child.setVisibility(View.VISIBLE);
}
- startPropertyAnimation(newDuration, isFirstView, child, viewState, alpha);
+ startPropertyAnimation(newDuration, isFirstAnimatingView, child, viewState, alpha);
// TODO: animate clipBounds
child.setClipBounds(null);
@@ -88,11 +88,12 @@
if (viewState.height != currentHeigth) {
startHeightAnimation(newDuration, child, viewState, currentHeigth);
}
+ isFirstAnimatingView = false;
}
mAnimationIsRunning = true;
}
- private void startPropertyAnimation(long newDuration, final boolean isFirstView,
+ private void startPropertyAnimation(long newDuration, final boolean hasFinishAction,
final ExpandableView child, StackScrollState.ViewState viewState, final float alpha) {
child.animate().setInterpolator(mFastOutSlowInInterpolator)
.alpha(alpha)
@@ -103,7 +104,7 @@
@Override
public void run() {
mAnimationIsRunning = false;
- if (isFirstView) {
+ if (hasFinishAction) {
mHandledEvents.clear();
mHostLayout.onChildAnimationFinished();
}
@@ -128,16 +129,26 @@
heightAnimator.start();
}
+ /**
+ * Initialize the viewStates for the added children
+ *
+ * @param animationEvents the animation events who contain the added children
+ * @param finalState the final state to animate to
+ */
private void initializeAddedViewStates(
- ArrayList<NotificationStackScrollLayout.ChildHierarchyChangeEvent> mAnimationEvents,
+ ArrayList<NotificationStackScrollLayout.ChildHierarchyChangeEvent> animationEvents,
StackScrollState finalState) {
- for (NotificationStackScrollLayout.ChildHierarchyChangeEvent event: mAnimationEvents) {
+ for (NotificationStackScrollLayout.ChildHierarchyChangeEvent event: animationEvents) {
View changingView = event.changingView;
if (event.animationType == NotificationStackScrollLayout.ChildHierarchyChangeEvent
.ANIMATION_TYPE_ADD && !mHandledEvents.contains(event)) {
// This item is added, initialize it's properties.
StackScrollState.ViewState viewState = finalState.getViewStateForView(changingView);
+ if (viewState == null) {
+ // The position for this child was never generated, let's continue.
+ continue;
+ }
changingView.setAlpha(0);
changingView.setTranslationY(viewState.yTranslation);
changingView.setTranslationZ(viewState.zTranslation);
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 0c91907..9eaddbd 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -1017,11 +1017,11 @@
static class ProcessChangeItem {
static final int CHANGE_ACTIVITIES = 1<<0;
- static final int CHANGE_IMPORTANCE= 1<<1;
+ static final int CHANGE_PROCESS_STATE = 1<<1;
int changes;
int uid;
int pid;
- int importance;
+ int processState;
boolean foregroundActivities;
}
@@ -3200,11 +3200,10 @@
observer.onForegroundActivitiesChanged(item.pid, item.uid,
item.foregroundActivities);
}
- if ((item.changes&ProcessChangeItem.CHANGE_IMPORTANCE) != 0) {
- if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "IMPORTANCE CHANGED pid="
- + item.pid + " uid=" + item.uid + ": " + item.importance);
- observer.onImportanceChanged(item.pid, item.uid,
- item.importance);
+ if ((item.changes&ProcessChangeItem.CHANGE_PROCESS_STATE) != 0) {
+ if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "PROCSTATE CHANGED pid="
+ + item.pid + " uid=" + item.uid + ": " + item.processState);
+ observer.onProcessStateChanged(item.pid, item.uid, item.processState);
}
}
} catch (RemoteException e) {
@@ -10635,6 +10634,7 @@
int adj = app.curAdj;
outInfo.importance = oomAdjToImportance(adj, outInfo);
outInfo.importanceReasonCode = app.adjTypeCode;
+ outInfo.processState = app.curProcState;
}
public List<ActivityManager.RunningAppProcessInfo> getRunningAppProcesses() {
@@ -14690,7 +14690,7 @@
app.keeping = true;
app.curSchedGroup = Process.THREAD_GROUP_DEFAULT;
app.curProcState = ActivityManager.PROCESS_STATE_PERSISTENT;
- // System process can do UI, and when they do we want to have
+ // System processes can do UI, and when they do we want to have
// them trim their memory after the user leaves the UI. To
// facilitate this, here we need to determine whether or not it
// is currently showing UI.
@@ -15308,86 +15308,7 @@
adj = app.modifyRawOomAdj(adj);
app.curProcState = procState;
-
- int importance = app.memImportance;
- if (importance == 0 || adj != app.curAdj || schedGroup != app.curSchedGroup) {
- app.curAdj = adj;
- app.curSchedGroup = schedGroup;
- if (!interesting) {
- // For this reporting, if there is not something explicitly
- // interesting in this process then we will push it to the
- // background importance.
- importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND;
- } else if (adj >= ProcessList.CACHED_APP_MIN_ADJ) {
- importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND;
- } else if (adj >= ProcessList.SERVICE_B_ADJ) {
- importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE;
- } else if (adj >= ProcessList.HOME_APP_ADJ) {
- importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND;
- } else if (adj >= ProcessList.SERVICE_ADJ) {
- importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE;
- } else if (adj >= ProcessList.HEAVY_WEIGHT_APP_ADJ) {
- importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_CANT_SAVE_STATE;
- } else if (adj >= ProcessList.PERCEPTIBLE_APP_ADJ) {
- importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_PERCEPTIBLE;
- } else if (adj >= ProcessList.VISIBLE_APP_ADJ) {
- importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE;
- } else if (adj >= ProcessList.FOREGROUND_APP_ADJ) {
- importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND;
- } else {
- importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_PERSISTENT;
- }
- }
-
- int changes = importance != app.memImportance ? ProcessChangeItem.CHANGE_IMPORTANCE : 0;
- if (foregroundActivities != app.foregroundActivities) {
- changes |= ProcessChangeItem.CHANGE_ACTIVITIES;
- }
- if (changes != 0) {
- if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "Changes in " + app + ": " + changes);
- app.memImportance = importance;
- app.foregroundActivities = foregroundActivities;
- int i = mPendingProcessChanges.size()-1;
- ProcessChangeItem item = null;
- while (i >= 0) {
- item = mPendingProcessChanges.get(i);
- if (item.pid == app.pid) {
- if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "Re-using existing item: " + item);
- break;
- }
- i--;
- }
- if (i < 0) {
- // No existing item in pending changes; need a new one.
- final int NA = mAvailProcessChanges.size();
- if (NA > 0) {
- item = mAvailProcessChanges.remove(NA-1);
- if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "Retreiving available item: " + item);
- } else {
- item = new ProcessChangeItem();
- if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "Allocating new item: " + item);
- }
- item.changes = 0;
- item.pid = app.pid;
- item.uid = app.info.uid;
- if (mPendingProcessChanges.size() == 0) {
- if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG,
- "*** Enqueueing dispatch processes changed!");
- mHandler.obtainMessage(DISPATCH_PROCESSES_CHANGED).sendToTarget();
- }
- mPendingProcessChanges.add(item);
- }
- item.changes |= changes;
- item.importance = importance;
- item.foregroundActivities = foregroundActivities;
- if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "Item "
- + Integer.toHexString(System.identityHashCode(item))
- + " " + app.toShortString() + ": changes=" + item.changes
- + " importance=" + item.importance
- + " foreground=" + item.foregroundActivities
- + " type=" + app.adjType + " source=" + app.adjSource
- + " target=" + app.adjTarget);
- }
+ app.foregroundActivities = foregroundActivities;
return app.curRawAdj;
}
@@ -15660,7 +15581,7 @@
}
private final boolean applyOomAdjLocked(ProcessRecord app, boolean wasKeeping,
- ProcessRecord TOP_APP, boolean doingAll, boolean reportingProcessState, long now) {
+ ProcessRecord TOP_APP, boolean doingAll, long now) {
boolean success = true;
if (app.curRawAdj != app.setRawAdj) {
@@ -15679,6 +15600,8 @@
app.setRawAdj = app.curRawAdj;
}
+ int changes = 0;
+
if (app.curAdj != app.setAdj) {
ProcessList.setOomAdj(app.pid, app.curAdj);
if (DEBUG_SWITCH || DEBUG_OOM_ADJ) Slog.v(
@@ -15720,9 +15643,14 @@
app.curSchedGroup <= Process.THREAD_GROUP_BG_NONINTERACTIVE);
}
}
+ if (app.repForegroundActivities != app.foregroundActivities) {
+ app.repForegroundActivities = app.foregroundActivities;
+ changes |= ProcessChangeItem.CHANGE_ACTIVITIES;
+ }
if (app.repProcState != app.curProcState) {
app.repProcState = app.curProcState;
- if (!reportingProcessState && app.thread != null) {
+ changes |= ProcessChangeItem.CHANGE_PROCESS_STATE;
+ if (app.thread != null) {
try {
if (false) {
//RuntimeException h = new RuntimeException("here");
@@ -15767,6 +15695,51 @@
app.procStateChanged = true;
}
}
+
+ if (changes != 0) {
+ if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "Changes in " + app + ": " + changes);
+ int i = mPendingProcessChanges.size()-1;
+ ProcessChangeItem item = null;
+ while (i >= 0) {
+ item = mPendingProcessChanges.get(i);
+ if (item.pid == app.pid) {
+ if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "Re-using existing item: " + item);
+ break;
+ }
+ i--;
+ }
+ if (i < 0) {
+ // No existing item in pending changes; need a new one.
+ final int NA = mAvailProcessChanges.size();
+ if (NA > 0) {
+ item = mAvailProcessChanges.remove(NA-1);
+ if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "Retreiving available item: " + item);
+ } else {
+ item = new ProcessChangeItem();
+ if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "Allocating new item: " + item);
+ }
+ item.changes = 0;
+ item.pid = app.pid;
+ item.uid = app.info.uid;
+ if (mPendingProcessChanges.size() == 0) {
+ if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG,
+ "*** Enqueueing dispatch processes changed!");
+ mHandler.obtainMessage(DISPATCH_PROCESSES_CHANGED).sendToTarget();
+ }
+ mPendingProcessChanges.add(item);
+ }
+ item.changes |= changes;
+ item.processState = app.repProcState;
+ item.foregroundActivities = app.repForegroundActivities;
+ if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "Item "
+ + Integer.toHexString(System.identityHashCode(item))
+ + " " + app.toShortString() + ": changes=" + item.changes
+ + " procState=" + item.processState
+ + " foreground=" + item.foregroundActivities
+ + " type=" + app.adjType + " source=" + app.adjSource
+ + " target=" + app.adjTarget);
+ }
+
return success;
}
@@ -15777,7 +15750,7 @@
}
private final boolean updateOomAdjLocked(ProcessRecord app, int cachedAdj,
- ProcessRecord TOP_APP, boolean doingAll, boolean reportingProcessState, long now) {
+ ProcessRecord TOP_APP, boolean doingAll, long now) {
if (app.thread == null) {
return false;
}
@@ -15786,8 +15759,7 @@
computeOomAdjLocked(app, cachedAdj, TOP_APP, doingAll, now);
- return applyOomAdjLocked(app, wasKeeping, TOP_APP, doingAll,
- reportingProcessState, now);
+ return applyOomAdjLocked(app, wasKeeping, TOP_APP, doingAll, now);
}
final void updateProcessForegroundLocked(ProcessRecord proc, boolean isForeground,
@@ -15853,10 +15825,6 @@
}
final boolean updateOomAdjLocked(ProcessRecord app) {
- return updateOomAdjLocked(app, false);
- }
-
- final boolean updateOomAdjLocked(ProcessRecord app, boolean doingProcessState) {
final ActivityRecord TOP_ACT = resumedAppLocked();
final ProcessRecord TOP_APP = TOP_ACT != null ? TOP_ACT.app : null;
final boolean wasCached = app.cached;
@@ -15869,7 +15837,7 @@
// need to do a complete oom adj.
final int cachedAdj = app.curRawAdj >= ProcessList.CACHED_APP_MIN_ADJ
? app.curRawAdj : ProcessList.UNKNOWN_ADJ;
- boolean success = updateOomAdjLocked(app, cachedAdj, TOP_APP, false, doingProcessState,
+ boolean success = updateOomAdjLocked(app, cachedAdj, TOP_APP, false,
SystemClock.uptimeMillis());
if (wasCached != app.cached || app.curRawAdj == ProcessList.UNKNOWN_ADJ) {
// Changed to/from cached state, so apps after it in the LRU
@@ -16002,7 +15970,7 @@
}
}
- applyOomAdjLocked(app, wasKeeping, TOP_APP, true, false, now);
+ applyOomAdjLocked(app, wasKeeping, TOP_APP, true, now);
// Count the number of process types.
switch (app.curProcState) {
diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java
index b15fa5d..9d6481a 100644
--- a/services/core/java/com/android/server/am/BroadcastQueue.java
+++ b/services/core/java/com/android/server/am/BroadcastQueue.java
@@ -503,7 +503,7 @@
// are already core system stuff so don't matter for this.
r.curApp = filter.receiverList.app;
filter.receiverList.app.curReceiver = r;
- mService.updateOomAdjLocked(r.curApp, true);
+ mService.updateOomAdjLocked(r.curApp);
}
}
try {
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index d04a6b2..8d7d300 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -77,7 +77,6 @@
int curSchedGroup; // Currently desired scheduling class
int setSchedGroup; // Last set to background scheduling class
int trimMemoryLevel; // Last selected memory trimming level
- int memImportance; // Importance constant computed from curAdj
int curProcState = -1; // Currently computed process state: ActivityManager.PROCESS_STATE_*
int repProcState = -1; // Last reported process state
int setProcState = -1; // Last set process state in process tracker
@@ -91,6 +90,7 @@
boolean hasStartedServices; // Are there any started services running in this process?
boolean foregroundServices; // Running any services that are foreground?
boolean foregroundActivities; // Running any activities that are foreground?
+ boolean repForegroundActivities; // Last reported foreground activities.
boolean systemNoUi; // This is a system process, but not currently showing UI.
boolean hasShownUi; // Has UI been shown in this process since it was started?
boolean pendingUiClean; // Want to clean up resources from showing UI?
@@ -267,9 +267,10 @@
pw.print(prefix); pw.print("persistent="); pw.print(persistent);
pw.print(" removed="); pw.println(removed);
}
- if (hasClientActivities || foregroundActivities) {
+ if (hasClientActivities || foregroundActivities || repForegroundActivities) {
pw.print(prefix); pw.print("hasClientActivities="); pw.print(hasClientActivities);
- pw.print(" foregroundActivities="); pw.println(foregroundActivities);
+ pw.print(" foregroundActivities="); pw.print(foregroundActivities);
+ pw.print(" (rep="); pw.print(repForegroundActivities); pw.println(")");
}
if (hasStartedServices) {
pw.print(prefix); pw.print("hasStartedServices="); pw.println(hasStartedServices);
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index 855ae23..416a6b1 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -410,7 +410,7 @@
}
@Override
- public void onImportanceChanged(int pid, int uid, int importance) {
+ public void onProcessStateChanged(int pid, int uid, int procState) {
}
@Override
diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java
index 6030d4d..ab63c9c 100644
--- a/services/core/java/com/android/server/pm/LauncherAppsService.java
+++ b/services/core/java/com/android/server/pm/LauncherAppsService.java
@@ -16,14 +16,18 @@
package com.android.server.pm;
+import android.app.AppGlobals;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.pm.ActivityInfo;
import android.content.pm.ILauncherApps;
import android.content.pm.IOnAppsChangedListener;
+import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
+import android.content.pm.PackageInfo;
import android.content.pm.ResolveInfo;
import android.content.pm.UserInfo;
import android.graphics.Rect;
@@ -170,6 +174,34 @@
}
@Override
+ public boolean isPackageEnabled(String packageName, UserHandle user)
+ throws RemoteException {
+ ensureInUserProfiles(user, "Cannot check package for unrelated profile " + user);
+ long ident = Binder.clearCallingIdentity();
+ try {
+ IPackageManager pm = AppGlobals.getPackageManager();
+ PackageInfo info = pm.getPackageInfo(packageName, 0, user.getIdentifier());
+ return info != null && info.applicationInfo.enabled;
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ @Override
+ public boolean isActivityEnabled(ComponentName component, UserHandle user)
+ throws RemoteException {
+ ensureInUserProfiles(user, "Cannot check component for unrelated profile " + user);
+ long ident = Binder.clearCallingIdentity();
+ try {
+ IPackageManager pm = AppGlobals.getPackageManager();
+ ActivityInfo info = pm.getActivityInfo(component, 0, user.getIdentifier());
+ return info != null && info.isEnabled();
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ @Override
public void startActivityAsUser(ComponentName component, Rect sourceBounds,
Bundle opts, UserHandle user) throws RemoteException {
ensureInUserProfiles(user, "Cannot start activity for unrelated profile " + user);