Merge "TIF: clean up pending createSession requests when a package is removed." into lmp-dev
diff --git a/api/current.txt b/api/current.txt
index 351a2d8..8236f38 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -24676,6 +24676,7 @@
public static final class ContactsContract.PinnedPositions {
ctor public ContactsContract.PinnedPositions();
+ method public static void pin(android.content.ContentResolver, long, int);
method public static void undemote(android.content.ContentResolver, long);
field public static final int DEMOTED = -1; // 0xffffffff
field public static final int UNPINNED = 0; // 0x0
@@ -24755,7 +24756,6 @@
field public static final java.lang.String CONTACT_ID = "contact_id";
field public static final java.lang.String DATA_SET = "data_set";
field public static final java.lang.String DELETED = "deleted";
- field public static final java.lang.String NAME_VERIFIED = "name_verified";
field public static final java.lang.String RAW_CONTACT_IS_READ_ONLY = "raw_contact_is_read_only";
field public static final java.lang.String RAW_CONTACT_IS_USER_PROFILE = "raw_contact_is_user_profile";
}
diff --git a/core/java/android/app/backup/WallpaperBackupHelper.java b/core/java/android/app/backup/WallpaperBackupHelper.java
index 9e8ab2c..0567500 100644
--- a/core/java/android/app/backup/WallpaperBackupHelper.java
+++ b/core/java/android/app/backup/WallpaperBackupHelper.java
@@ -141,13 +141,13 @@
if (widthRatio > 0 && widthRatio < 1.33
&& heightRatio > 0 && heightRatio < 1.33) {
// sufficiently close to our resolution; go ahead and use it
- if (DEBUG) Slog.d(TAG, "wallpaper dimension match; using");
+ Slog.d(TAG, "Applying restored wallpaper image.");
f.renameTo(new File(WALLPAPER_IMAGE));
// TODO: spin a service to copy the restored image to sd/usb storage,
// since it does not exist anywhere other than the private wallpaper
// file.
} else {
- if (DEBUG) Slog.d(TAG, "dimensions too far off: wr=" + widthRatio
+ Slog.i(TAG, "Dimensions too far off; using default wallpaper. wr=" + widthRatio
+ " hr=" + heightRatio);
f.delete();
}
diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java
index 4f35b16..513e47e 100644
--- a/core/java/android/provider/ContactsContract.java
+++ b/core/java/android/provider/ContactsContract.java
@@ -2272,6 +2272,8 @@
* The default value is "0"
* </p>
* <p>Type: INTEGER</p>
+ *
+ * @hide
*/
public static final String NAME_VERIFIED = "name_verified";
@@ -8066,6 +8068,21 @@
}
/**
+ * Pins a contact at a provided position, or unpins a contact.
+ *
+ * @param contentResolver to perform the pinning operation on.
+ * @param pinnedPosition the position to pin the contact at. To unpin a contact, use
+ * {@link PinnedPositions#UNPINNED}.
+ */
+ public static void pin(
+ ContentResolver contentResolver, long contactId, int pinnedPosition) {
+ final Uri uri = Uri.withAppendedPath(Contacts.CONTENT_URI, String.valueOf(contactId));
+ final ContentValues values = new ContentValues();
+ values.put(Contacts.PINNED, pinnedPosition);
+ contentResolver.update(uri, values, null, null);
+ }
+
+ /**
* Default value for the pinned position of an unpinned contact.
*/
public static final int UNPINNED = 0;
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 672ad84..7c5233c 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -2208,7 +2208,7 @@
<permission android:name="android.permission.MODIFY_PARENTAL_CONTROLS"
android:label="@string/permlab_modifyParentalControls"
android:description="@string/permdesc_modifyParentalControls"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature|system" />
<!-- Must be required by device administration receiver, to ensure that only the
system can interact with it. -->
diff --git a/core/res/res/layout/preference_material.xml b/core/res/res/layout/preference_material.xml
index 3919f5f..778e70a 100644
--- a/core/res/res/layout/preference_material.xml
+++ b/core/res/res/layout/preference_material.xml
@@ -20,58 +20,62 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:minHeight="?android:attr/listPreferredItemHeightSmall"
+ android:minHeight="?attr/listPreferredItemHeightSmall"
android:gravity="center_vertical"
android:paddingStart="?attr/listPreferredItemPaddingStart"
android:paddingEnd="?attr/listPreferredItemPaddingEnd"
- android:background="?android:attr/activatedBackgroundIndicator">
+ android:background="?attr/activatedBackgroundIndicator">
<LinearLayout
- android:id="@+android:id/icon_frame"
+ android:id="@+id/icon_frame"
android:layout_width="wrap_content"
android:layout_height="match_parent"
- android:minWidth="58dip"
+ android:layout_marginStart="-4dp"
+ android:minWidth="60dp"
android:gravity="start|center_vertical"
- android:orientation="horizontal">
+ android:orientation="horizontal"
+ android:paddingEnd="12dp"
+ android:paddingTop="4dp"
+ android:paddingBottom="4dp">
<ImageView
- android:id="@+android:id/icon"
+ android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:scaleType="centerInside"
- android:layout_marginEnd="8dip" />
+ android:maxWidth="48dp"
+ android:maxHeight="48dp" />
</LinearLayout>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
- android:paddingTop="16dip"
- android:paddingBottom="16dip">
+ android:paddingTop="16dp"
+ android:paddingBottom="16dp">
- <TextView android:id="@+android:id/title"
+ <TextView android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
- android:textAppearance="?android:attr/textAppearanceListItem"
+ android:textAppearance="?attr/textAppearanceListItem"
android:ellipsize="marquee" />
- <TextView android:id="@+android:id/summary"
+ <TextView android:id="@+id/summary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_below="@android:id/title"
- android:layout_alignStart="@android:id/title"
- android:textAppearance="?android:attr/textAppearanceListItemSecondary"
- android:textColor="?android:attr/textColorSecondary"
+ android:layout_below="@id/title"
+ android:layout_alignStart="@id/title"
+ android:textAppearance="?attr/textAppearanceListItemSecondary"
+ android:textColor="?attr/textColorSecondary"
android:maxLines="10" />
</RelativeLayout>
<!-- Preference should place its actual preference widget here. -->
- <LinearLayout android:id="@+android:id/widget_frame"
+ <LinearLayout android:id="@+id/widget_frame"
android:layout_width="wrap_content"
android:layout_height="match_parent"
- android:minWidth="58dip"
android:gravity="end|center_vertical"
+ android:paddingStart="16dp"
android:orientation="vertical" />
</LinearLayout>
diff --git a/libs/hwui/Layer.cpp b/libs/hwui/Layer.cpp
index 8639ae1..e6bc4db 100644
--- a/libs/hwui/Layer.cpp
+++ b/libs/hwui/Layer.cpp
@@ -54,9 +54,11 @@
convexMask = NULL;
caches.resourceCache.incrementRefcount(this);
rendererLightPosDirty = true;
+ renderState.registerLayer(this);
}
Layer::~Layer() {
+ renderState.unregisterLayer(this);
SkSafeUnref(colorFilter);
removeFbo();
deleteTexture();
diff --git a/libs/hwui/RenderState.cpp b/libs/hwui/RenderState.cpp
index 97f379d..50b8f39 100644
--- a/libs/hwui/RenderState.cpp
+++ b/libs/hwui/RenderState.cpp
@@ -34,6 +34,10 @@
mCaches->init();
}
+void RenderState::onGLContextDestroyed() {
+ LOG_ALWAYS_FATAL_IF(!mActiveLayers.empty(), "layers have survived gl context destruction");
+}
+
void RenderState::setViewport(GLsizei width, GLsizei height) {
mViewportWidth = width;
mViewportHeight = height;
diff --git a/libs/hwui/RenderState.h b/libs/hwui/RenderState.h
index f7116e2..cd71c73 100644
--- a/libs/hwui/RenderState.h
+++ b/libs/hwui/RenderState.h
@@ -16,6 +16,7 @@
#ifndef RENDERSTATE_H
#define RENDERSTATE_H
+#include <set>
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
@@ -37,6 +38,7 @@
PREVENT_COPY_AND_ASSIGN(RenderState);
public:
void onGLContextCreated();
+ void onGLContextDestroyed();
void setViewport(GLsizei width, GLsizei height);
void getViewport(GLsizei* outWidth, GLsizei* outHeight);
@@ -48,6 +50,13 @@
void debugOverdraw(bool enable, bool clear);
+ void registerLayer(const Layer* layer) {
+ mActiveLayers.insert(layer);
+ }
+ void unregisterLayer(const Layer* layer) {
+ mActiveLayers.erase(layer);
+ }
+
private:
friend class renderthread::RenderThread;
@@ -58,6 +67,7 @@
~RenderState();
Caches* mCaches;
+ std::set<const Layer*> mActiveLayers;
GLsizei mViewportWidth;
GLsizei mViewportHeight;
diff --git a/libs/hwui/renderthread/EglManager.cpp b/libs/hwui/renderthread/EglManager.cpp
index 05ca34d..37f8e60 100644
--- a/libs/hwui/renderthread/EglManager.cpp
+++ b/libs/hwui/renderthread/EglManager.cpp
@@ -214,6 +214,7 @@
Caches::getInstance().terminate();
}
+ mRenderThread.renderState().onGLContextDestroyed();
eglDestroyContext(mEglDisplay, mEglContext);
eglDestroySurface(mEglDisplay, mPBufferSurface);
eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
diff --git a/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java b/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java
index 9351078..d1aa33b 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java
@@ -258,7 +258,8 @@
Log.i(LOG_TAG, "[CALLED] finish()");
}
if (mState != STATE_STARTED && mState != STATE_UPDATED
- && mState != STATE_FAILED && mState != STATE_CANCELING) {
+ && mState != STATE_FAILED && mState != STATE_CANCELING
+ && mState != STATE_CANCELED) {
throw new IllegalStateException("Cannot finish in state:"
+ stateToString(mState));
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiAccessPointController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiAccessPointController.java
index 09e7472..b800fbf 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiAccessPointController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiAccessPointController.java
@@ -134,6 +134,9 @@
final List<AccessPoint> aps = new ArrayList<AccessPoint>(scanResults.size());
final ArraySet<String> ssids = new ArraySet<String>();
for (ScanResult scanResult : scanResults) {
+ if (scanResult == null) {
+ continue;
+ }
final String ssid = scanResult.SSID;
if (TextUtils.isEmpty(ssid) || ssids.contains(ssid)) continue;
if (!configured.containsKey(ssid)) continue;
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 8dd6420..8bb094b 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -1898,17 +1898,17 @@
break;
}
case NetworkMonitor.EVENT_PROVISIONING_NOTIFICATION: {
- NetworkAgentInfo nai = null;
- synchronized (mNetworkForNetId) {
- nai = mNetworkForNetId.get(msg.arg2);
- }
- if (nai == null) {
- loge("EVENT_PROVISIONING_NOTIFICATION from unknown NetworkMonitor");
- break;
- }
if (msg.arg1 == 0) {
setProvNotificationVisibleIntent(false, msg.arg2, 0, null, null);
} else {
+ NetworkAgentInfo nai = null;
+ synchronized (mNetworkForNetId) {
+ nai = mNetworkForNetId.get(msg.arg2);
+ }
+ if (nai == null) {
+ loge("EVENT_PROVISIONING_NOTIFICATION from unknown NetworkMonitor");
+ break;
+ }
setProvNotificationVisibleIntent(true, msg.arg2, nai.networkInfo.getType(),
nai.networkInfo.getExtraInfo(), (PendingIntent)msg.obj);
}
diff --git a/services/core/java/com/android/server/tv/TvInputHardwareManager.java b/services/core/java/com/android/server/tv/TvInputHardwareManager.java
index fa991c2..77ab33b 100644
--- a/services/core/java/com/android/server/tv/TvInputHardwareManager.java
+++ b/services/core/java/com/android/server/tv/TvInputHardwareManager.java
@@ -1021,7 +1021,9 @@
synchronized (mLock) {
for (int i = 0; i < mConnections.size(); ++i) {
TvInputHardwareImpl impl = mConnections.valueAt(i).getHardwareImplLocked();
- impl.handleAudioSinkUpdated();
+ if (impl != null) {
+ impl.handleAudioSinkUpdated();
+ }
}
}
}
diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java
index 6ad9aee..ac43d16 100644
--- a/services/core/java/com/android/server/tv/TvInputManagerService.java
+++ b/services/core/java/com/android/server/tv/TvInputManagerService.java
@@ -1041,13 +1041,12 @@
}
private void ensureParentalControlsPermission() {
- // STOPSHIP: Uncomment when b/16984416 is resolved.
- //if (mContext.checkCallingPermission(
- // android.Manifest.permission.MODIFY_PARENTAL_CONTROLS)
- // != PackageManager.PERMISSION_GRANTED) {
- // throw new SecurityException(
- // "The caller does not have parental controls permission");
- //}
+ if (mContext.checkCallingPermission(
+ android.Manifest.permission.MODIFY_PARENTAL_CONTROLS)
+ != PackageManager.PERMISSION_GRANTED) {
+ throw new SecurityException(
+ "The caller does not have parental controls permission");
+ }
}
@Override
diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java
index 4edd5cf..81cd602 100644
--- a/services/core/java/com/android/server/wm/WindowAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowAnimator.java
@@ -248,6 +248,10 @@
mForceHiding = KEYGUARD_NOT_SHOWN;
+ final WindowState imeTarget = mService.mInputMethodTarget;
+ final boolean showImeOverKeyguard = imeTarget != null && imeTarget.isVisibleNow() &&
+ (imeTarget.getAttrs().flags & FLAG_SHOW_WHEN_LOCKED) != 0;
+
for (int i = windows.size() - 1; i >= 0; i--) {
WindowState win = windows.get(i);
WindowStateAnimator winAnimator = win.mWinAnimator;
@@ -312,7 +316,8 @@
+ " hidden=" + win.mRootToken.hidden
+ " anim=" + win.mWinAnimator.mAnimation);
} else if (mPolicy.canBeForceHidden(win, win.mAttrs)) {
- final boolean hideWhenLocked = (flags & FLAG_SHOW_WHEN_LOCKED) == 0;
+ final boolean hideWhenLocked = (flags & FLAG_SHOW_WHEN_LOCKED) == 0 &&
+ !(win.mIsImWindow && showImeOverKeyguard);
final boolean changed;
if (((mForceHiding == KEYGUARD_ANIMATING_IN)
&& (!winAnimator.isAnimating() || hideWhenLocked))