Merge "Make recents visible on resume unless requested otherwise."
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index b5b77e6..390c280 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -3271,12 +3271,16 @@
* Construct a RemoteViews for the final big notification layout.
*/
public RemoteViews makeBigContentView() {
- if (mStyle != null) {
+ if (mN.bigContentView != null) {
+ return mN.bigContentView;
+ } else if (mStyle != null) {
final RemoteViews styleView = mStyle.makeBigContentView();
if (styleView != null) {
return styleView;
}
- } else if (mActions.size() == 0) return null;
+ } else if (mActions.size() == 0) {
+ return null;
+ }
return applyStandardTemplateWithActions(getBigBaseLayoutResource());
}
@@ -3285,12 +3289,17 @@
* Construct a RemoteViews for the final heads-up notification layout.
*/
public RemoteViews makeHeadsUpContentView() {
- if (mStyle != null) {
- final RemoteViews styleView = mStyle.makeHeadsUpContentView();
- if (styleView != null) {
- return styleView;
- }
- } else if (mActions.size() == 0) return null;
+ if (mN.headsUpContentView != null) {
+ return mN.headsUpContentView;
+ } else if (mStyle != null) {
+ final RemoteViews styleView = mStyle.makeHeadsUpContentView();
+ if (styleView != null) {
+ return styleView;
+ }
+ } else if (mActions.size() == 0) {
+ return null;
+ }
+
return applyStandardTemplateWithActions(getBigBaseLayoutResource());
}
diff --git a/core/java/android/widget/ActionMenuPresenter.java b/core/java/android/widget/ActionMenuPresenter.java
index 5eea252..47df4e8 100644
--- a/core/java/android/widget/ActionMenuPresenter.java
+++ b/core/java/android/widget/ActionMenuPresenter.java
@@ -177,8 +177,7 @@
public void onConfigurationChanged(Configuration newConfig) {
if (!mMaxItemsSet) {
- mMaxItems = mContext.getResources().getInteger(
- com.android.internal.R.integer.max_action_buttons);
+ mMaxItems = ActionBarPolicy.get(mContext).getMaxActionButtons();
}
if (mMenu != null) {
mMenu.onItemsChanged(true);
diff --git a/core/java/com/android/internal/view/ActionBarPolicy.java b/core/java/com/android/internal/view/ActionBarPolicy.java
index bee59dc..007ab29 100644
--- a/core/java/com/android/internal/view/ActionBarPolicy.java
+++ b/core/java/com/android/internal/view/ActionBarPolicy.java
@@ -19,6 +19,7 @@
import com.android.internal.R;
import android.content.Context;
+import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.os.Build;
@@ -38,10 +39,29 @@
mContext = context;
}
+ /**
+ * Returns the maximum number of action buttons that should be permitted within an action
+ * bar/action mode. This will be used to determine how many showAsAction="ifRoom" items can fit.
+ * "always" items can override this.
+ */
public int getMaxActionButtons() {
- return mContext.getResources().getInteger(R.integer.max_action_buttons);
+ final Configuration config = mContext.getResources().getConfiguration();
+ final int width = config.screenWidthDp;
+ final int height = config.screenHeightDp;
+ final int smallest = config.smallestScreenWidthDp;
+ if (smallest > 600 || (width > 960 && height > 720) || (width > 720 && height > 960)) {
+ // For values-w600dp, values-sw600dp and values-xlarge.
+ return 5;
+ } else if (width >= 500 || (width > 640 && height > 480) || (width > 480 && height > 640)) {
+ // For values-w500dp and values-large.
+ return 4;
+ } else if (width >= 360) {
+ // For values-w360dp.
+ return 3;
+ } else {
+ return 2;
+ }
}
-
public boolean showsOverflowMenuButton() {
return true;
}
diff --git a/core/res/res/values-sw600dp/dimens.xml b/core/res/res/values-sw600dp/dimens.xml
index 94e9c4e..9c45c12 100644
--- a/core/res/res/values-sw600dp/dimens.xml
+++ b/core/res/res/values-sw600dp/dimens.xml
@@ -22,10 +22,6 @@
<dimen name="thumbnail_width">360dp</dimen>
<!-- The height that is used when creating thumbnails of applications. -->
<dimen name="thumbnail_height">360dp</dimen>
- <!-- The maximum number of action buttons that should be permitted within
- an action bar/action mode. This will be used to determine how many
- showAsAction="ifRoom" items can fit. "always" items can override this. -->
- <integer name="max_action_buttons">5</integer>
<!-- Default height of an action bar. -->
<dimen name="action_bar_default_height">56dip</dimen>
<!-- Vertical padding around action bar icons. -->
@@ -88,7 +84,7 @@
<!-- Size of the generic status lines keyguard's status view -->
<dimen name="kg_status_line_font_size">16sp</dimen>
- <!-- Top margin for the clock view -->
+ <!-- Top margin for the clock view -->
<dimen name="kg_clock_top_margin">0dp</dimen>
<!-- Size of margin on the right of keyguard's status view -->
diff --git a/core/res/res/values-w360dp/dimens.xml b/core/res/res/values-w360dp/dimens.xml
deleted file mode 100644
index 0f5d656..0000000
--- a/core/res/res/values-w360dp/dimens.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 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.
-*/
--->
-<resources>
- <!-- The maximum number of action buttons that should be permitted within
- an action bar/action mode. This will be used to determine how many
- showAsAction="ifRoom" items can fit. "always" items can override this. -->
- <integer name="max_action_buttons">3</integer>
-</resources>
diff --git a/core/res/res/values-w500dp/dimens.xml b/core/res/res/values-w500dp/dimens.xml
deleted file mode 100644
index 68841ca..0000000
--- a/core/res/res/values-w500dp/dimens.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 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.
-*/
--->
-<resources>
- <!-- The maximum number of action buttons that should be permitted within
- an action bar/action mode. This will be used to determine how many
- showAsAction="ifRoom" items can fit. "always" items can override this. -->
- <integer name="max_action_buttons">4</integer>
-</resources>
diff --git a/core/res/res/values-w600dp/dimens.xml b/core/res/res/values-w600dp/dimens.xml
deleted file mode 100644
index 83c45b5..0000000
--- a/core/res/res/values-w600dp/dimens.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 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.
-*/
--->
-<resources>
- <!-- The maximum number of action buttons that should be permitted within
- an action bar/action mode. This will be used to determine how many
- showAsAction="ifRoom" items can fit. "always" items can override this. -->
- <integer name="max_action_buttons">5</integer>
-</resources>
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index 28756f5..01daf26 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -25,10 +25,7 @@
<!-- The standard size (both width and height) of an application icon that
will be displayed in the app launcher and elsewhere. -->
<dimen name="app_icon_size">48dip</dimen>
- <!-- The maximum number of action buttons that should be permitted within
- an action bar/action mode. This will be used to determine how many
- showAsAction="ifRoom" items can fit. "always" items can override this. -->
- <integer name="max_action_buttons">2</integer>
+
<dimen name="toast_y_offset">64dip</dimen>
<!-- Height of the status bar -->
<dimen name="status_bar_height">24dp</dimen>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index e8f6b46..556467a 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -401,7 +401,6 @@
<java-symbol type="integer" name="db_connection_pool_size" />
<java-symbol type="integer" name="db_journal_size_limit" />
<java-symbol type="integer" name="db_wal_autocheckpoint" />
- <java-symbol type="integer" name="max_action_buttons" />
<java-symbol type="integer" name="config_soundEffectVolumeDb" />
<java-symbol type="integer" name="config_lockSoundVolumeDb" />
<java-symbol type="integer" name="config_multiuserMaximumUsers" />
diff --git a/packages/SettingsLib/src/com/android/settingslib/accounts/AuthenticatorHelper.java b/packages/SettingsLib/src/com/android/settingslib/accounts/AuthenticatorHelper.java
new file mode 100644
index 0000000..ef511bb
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/accounts/AuthenticatorHelper.java
@@ -0,0 +1,269 @@
+/*
+ * Copyright (C) 2015 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.settingslib.accounts;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.accounts.AuthenticatorDescription;
+import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.SyncAdapterType;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.os.AsyncTask;
+import android.os.UserHandle;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Helper class for monitoring accounts on the device for a given user.
+ *
+ * Classes using this helper should implement {@link OnAccountsUpdateListener}.
+ * {@link OnAccountsUpdateListener#onAccountsUpdate(UserHandle)} will then be
+ * called once accounts get updated. For setting up listening for account
+ * updates, {@link #listenToAccountUpdates()} and
+ * {@link #stopListeningToAccountUpdates()} should be used.
+ */
+final public class AuthenticatorHelper extends BroadcastReceiver {
+ private static final String TAG = "AuthenticatorHelper";
+
+ private final Map<String, AuthenticatorDescription> mTypeToAuthDescription = new HashMap<>();
+ private final ArrayList<String> mEnabledAccountTypes = new ArrayList<>();
+ private final Map<String, Drawable> mAccTypeIconCache = new HashMap<>();
+ private final HashMap<String, ArrayList<String>> mAccountTypeToAuthorities = new HashMap<>();
+
+ private final UserHandle mUserHandle;
+ private final Context mContext;
+ private final OnAccountsUpdateListener mListener;
+ private boolean mListeningToAccountUpdates;
+
+ public interface OnAccountsUpdateListener {
+ void onAccountsUpdate(UserHandle userHandle);
+ }
+
+ public AuthenticatorHelper(Context context, UserHandle userHandle,
+ OnAccountsUpdateListener listener) {
+ mContext = context;
+ mUserHandle = userHandle;
+ mListener = listener;
+ // This guarantees that the helper is ready to use once constructed: the account types and
+ // authorities are initialized
+ onAccountsUpdated(null);
+ }
+
+ public String[] getEnabledAccountTypes() {
+ return mEnabledAccountTypes.toArray(new String[mEnabledAccountTypes.size()]);
+ }
+
+ public void preloadDrawableForType(final Context context, final String accountType) {
+ new AsyncTask<Void, Void, Void>() {
+ @Override
+ protected Void doInBackground(Void... params) {
+ getDrawableForType(context, accountType);
+ return null;
+ }
+ }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void[]) null);
+ }
+
+ /**
+ * Gets an icon associated with a particular account type. If none found, return null.
+ * @param accountType the type of account
+ * @return a drawable for the icon or a default icon returned by
+ * {@link PackageManager#getDefaultActivityIcon} if one cannot be found.
+ */
+ public Drawable getDrawableForType(Context context, final String accountType) {
+ Drawable icon = null;
+ synchronized (mAccTypeIconCache) {
+ if (mAccTypeIconCache.containsKey(accountType)) {
+ return mAccTypeIconCache.get(accountType);
+ }
+ }
+ if (mTypeToAuthDescription.containsKey(accountType)) {
+ try {
+ AuthenticatorDescription desc = mTypeToAuthDescription.get(accountType);
+ Context authContext = context.createPackageContextAsUser(desc.packageName, 0,
+ mUserHandle);
+ icon = mContext.getPackageManager().getUserBadgedIcon(
+ authContext.getDrawable(desc.iconId), mUserHandle);
+ synchronized (mAccTypeIconCache) {
+ mAccTypeIconCache.put(accountType, icon);
+ }
+ } catch (PackageManager.NameNotFoundException|Resources.NotFoundException e) {
+ // Ignore
+ }
+ }
+ if (icon == null) {
+ icon = context.getPackageManager().getDefaultActivityIcon();
+ }
+ return icon;
+ }
+
+ /**
+ * Gets the label associated with a particular account type. If none found, return null.
+ * @param accountType the type of account
+ * @return a CharSequence for the label or null if one cannot be found.
+ */
+ public CharSequence getLabelForType(Context context, final String accountType) {
+ CharSequence label = null;
+ if (mTypeToAuthDescription.containsKey(accountType)) {
+ try {
+ AuthenticatorDescription desc = mTypeToAuthDescription.get(accountType);
+ Context authContext = context.createPackageContextAsUser(desc.packageName, 0,
+ mUserHandle);
+ label = authContext.getResources().getText(desc.labelId);
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.w(TAG, "No label name for account type " + accountType);
+ } catch (Resources.NotFoundException e) {
+ Log.w(TAG, "No label icon for account type " + accountType);
+ }
+ }
+ return label;
+ }
+
+ /**
+ * Gets the package associated with a particular account type. If none found, return null.
+ * @param accountType the type of account
+ * @return the package name or null if one cannot be found.
+ */
+ public String getPackageForType(final String accountType) {
+ if (mTypeToAuthDescription.containsKey(accountType)) {
+ AuthenticatorDescription desc = mTypeToAuthDescription.get(accountType);
+ return desc.packageName;
+ }
+ return null;
+ }
+
+ /**
+ * Gets the resource id of the label associated with a particular account type. If none found,
+ * return -1.
+ * @param accountType the type of account
+ * @return a resource id for the label or -1 if none found;
+ */
+ public int getLabelIdForType(final String accountType) {
+ if (mTypeToAuthDescription.containsKey(accountType)) {
+ AuthenticatorDescription desc = mTypeToAuthDescription.get(accountType);
+ return desc.labelId;
+ }
+ return -1;
+ }
+
+ /**
+ * Updates provider icons. Subclasses should call this in onCreate()
+ * and update any UI that depends on AuthenticatorDescriptions in onAuthDescriptionsUpdated().
+ */
+ public void updateAuthDescriptions(Context context) {
+ AuthenticatorDescription[] authDescs = AccountManager.get(context)
+ .getAuthenticatorTypesAsUser(mUserHandle.getIdentifier());
+ for (int i = 0; i < authDescs.length; i++) {
+ mTypeToAuthDescription.put(authDescs[i].type, authDescs[i]);
+ }
+ }
+
+ public boolean containsAccountType(String accountType) {
+ return mTypeToAuthDescription.containsKey(accountType);
+ }
+
+ public AuthenticatorDescription getAccountTypeDescription(String accountType) {
+ return mTypeToAuthDescription.get(accountType);
+ }
+
+ public boolean hasAccountPreferences(final String accountType) {
+ if (containsAccountType(accountType)) {
+ AuthenticatorDescription desc = getAccountTypeDescription(accountType);
+ if (desc != null && desc.accountPreferencesId != 0) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ void onAccountsUpdated(Account[] accounts) {
+ updateAuthDescriptions(mContext);
+ if (accounts == null) {
+ accounts = AccountManager.get(mContext).getAccountsAsUser(mUserHandle.getIdentifier());
+ }
+ mEnabledAccountTypes.clear();
+ mAccTypeIconCache.clear();
+ for (int i = 0; i < accounts.length; i++) {
+ final Account account = accounts[i];
+ if (!mEnabledAccountTypes.contains(account.type)) {
+ mEnabledAccountTypes.add(account.type);
+ }
+ }
+ buildAccountTypeToAuthoritiesMap();
+ if (mListeningToAccountUpdates) {
+ mListener.onAccountsUpdate(mUserHandle);
+ }
+ }
+
+ @Override
+ public void onReceive(final Context context, final Intent intent) {
+ // TODO: watch for package upgrades to invalidate cache; see http://b/7206643
+ final Account[] accounts = AccountManager.get(mContext)
+ .getAccountsAsUser(mUserHandle.getIdentifier());
+ onAccountsUpdated(accounts);
+ }
+
+ public void listenToAccountUpdates() {
+ if (!mListeningToAccountUpdates) {
+ IntentFilter intentFilter = new IntentFilter();
+ intentFilter.addAction(AccountManager.LOGIN_ACCOUNTS_CHANGED_ACTION);
+ // At disk full, certain actions are blocked (such as writing the accounts to storage).
+ // It is useful to also listen for recovery from disk full to avoid bugs.
+ intentFilter.addAction(Intent.ACTION_DEVICE_STORAGE_OK);
+ mContext.registerReceiverAsUser(this, mUserHandle, intentFilter, null, null);
+ mListeningToAccountUpdates = true;
+ }
+ }
+
+ public void stopListeningToAccountUpdates() {
+ if (mListeningToAccountUpdates) {
+ mContext.unregisterReceiver(this);
+ mListeningToAccountUpdates = false;
+ }
+ }
+
+ public ArrayList<String> getAuthoritiesForAccountType(String type) {
+ return mAccountTypeToAuthorities.get(type);
+ }
+
+ private void buildAccountTypeToAuthoritiesMap() {
+ mAccountTypeToAuthorities.clear();
+ SyncAdapterType[] syncAdapters = ContentResolver.getSyncAdapterTypesAsUser(
+ mUserHandle.getIdentifier());
+ for (int i = 0, n = syncAdapters.length; i < n; i++) {
+ final SyncAdapterType sa = syncAdapters[i];
+ ArrayList<String> authorities = mAccountTypeToAuthorities.get(sa.accountType);
+ if (authorities == null) {
+ authorities = new ArrayList<String>();
+ mAccountTypeToAuthorities.put(sa.accountType, authorities);
+ }
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "Added authority " + sa.authority + " to accountType "
+ + sa.accountType);
+ }
+ authorities.add(sa.authority);
+ }
+ }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/widget/AnimatedImageView.java b/packages/SettingsLib/src/com/android/settingslib/widget/AnimatedImageView.java
new file mode 100644
index 0000000..f5e39be
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/widget/AnimatedImageView.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2015 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.settingslib.widget;
+
+import android.content.Context;
+import android.graphics.drawable.AnimatedRotateDrawable;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.ImageView;
+
+public class AnimatedImageView extends ImageView {
+ private AnimatedRotateDrawable mDrawable;
+ private boolean mAnimating;
+
+ public AnimatedImageView(Context context) {
+ super(context);
+ }
+
+ public AnimatedImageView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ private void updateDrawable() {
+ if (isShown() && mDrawable != null) {
+ mDrawable.stop();
+ }
+ final Drawable drawable = getDrawable();
+ if (drawable instanceof AnimatedRotateDrawable) {
+ mDrawable = (AnimatedRotateDrawable) drawable;
+ // TODO: define in drawable xml once we have public attrs.
+ mDrawable.setFramesCount(56);
+ mDrawable.setFramesDuration(32);
+ if (isShown() && mAnimating) {
+ mDrawable.start();
+ }
+ } else {
+ mDrawable = null;
+ }
+ }
+
+ private void updateAnimating() {
+ if (mDrawable != null) {
+ if (isShown() && mAnimating) {
+ mDrawable.start();
+ } else {
+ mDrawable.stop();
+ }
+ }
+ }
+
+ @Override
+ public void setImageDrawable(Drawable drawable) {
+ super.setImageDrawable(drawable);
+ updateDrawable();
+ }
+
+ @Override
+ public void setImageResource(int resid) {
+ super.setImageResource(resid);
+ updateDrawable();
+ }
+
+ @Override
+ public void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ updateAnimating();
+ }
+
+ @Override
+ public void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ updateAnimating();
+ }
+
+ public void setAnimating(boolean animating) {
+ mAnimating = animating;
+ updateAnimating();
+ }
+
+ @Override
+ protected void onVisibilityChanged(View changedView, int vis) {
+ super.onVisibilityChanged(changedView, vis);
+ updateAnimating();
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
index 4328e24..83dbde5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
@@ -105,36 +105,29 @@
}
public boolean cacheContentViews(Context ctx, Notification updatedNotification) {
- boolean cached = false;
+ boolean applyInPlace = false;
if (updatedNotification != null) {
final Notification.Builder updatedNotificationBuilder
= Notification.Builder.recoverBuilder(ctx, updatedNotification);
final RemoteViews newContentView = updatedNotificationBuilder.makeContentView();
- if (!compareRemoteViews(cachedContentView, newContentView)) {
- cachedContentView = newContentView;
- cached |= true;
- }
final RemoteViews newBigContentView =
updatedNotificationBuilder.makeBigContentView();
- if (!compareRemoteViews(cachedBigContentView, newBigContentView)) {
- cachedBigContentView = newBigContentView;
- cached |= true;
- }
final RemoteViews newHeadsUpContentView =
updatedNotificationBuilder.makeHeadsUpContentView();
- if (!compareRemoteViews(cachedHeadsUpContentView, newBigContentView)) {
- cachedHeadsUpContentView = newHeadsUpContentView;
- cached |= true;
- }
final Notification updatedPublicNotification = updatedNotification.publicVersion;
final RemoteViews newPubContentView = (updatedPublicNotification != null)
? Notification.Builder.recoverBuilder(
ctx, updatedPublicNotification).makeContentView()
: null;
- if (!compareRemoteViews(cachedPublicContentView, newPubContentView)) {
- cachedPublicContentView = newPubContentView;
- cached |= true;
- }
+
+ applyInPlace = compareRemoteViews(cachedContentView, newContentView)
+ && compareRemoteViews(cachedBigContentView, newBigContentView)
+ && compareRemoteViews(cachedHeadsUpContentView, newHeadsUpContentView)
+ && compareRemoteViews(cachedPublicContentView, newPubContentView);
+ cachedPublicContentView = newPubContentView;
+ cachedHeadsUpContentView = newHeadsUpContentView;
+ cachedBigContentView = newBigContentView;
+ cachedContentView = newContentView;
} else {
final Notification.Builder builder
= Notification.Builder.recoverBuilder(ctx, notification.getNotification());
@@ -150,9 +143,9 @@
= Notification.Builder.recoverBuilder(ctx, publicNotification);
cachedPublicContentView = publicBuilder.makeContentView();
}
- cached = true;
+ applyInPlace = false;
}
- return cached;
+ return applyInPlace;
}
// Returns true if the RemoteViews are the same.