OSDN Git Service

Fix bug 5623642 - Status bar background incompatible with some legacy apps
authorAdam Powell <adamp@google.com>
Wed, 16 Nov 2011 02:59:36 +0000 (18:59 -0800)
committerAdam Powell <adamp@google.com>
Wed, 16 Nov 2011 03:04:33 +0000 (19:04 -0800)
Give some background protection to custom layouts in legacy notifications.

Pre-HC it was extremely common for apps to hardcode text colors in
layouts. Since this can lead to black text on a dark background in
HC/ICS, give these older apps that target SDK < 11 a light gray
background.

Change-Id: Iab3dea4beb9172b2f9a5cae53991cf952d0c8cde

packages/SystemUI/res/drawable/notification_row_legacy_bg.xml [new file with mode: 0644]
packages/SystemUI/res/values/colors.xml
packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java

diff --git a/packages/SystemUI/res/drawable/notification_row_legacy_bg.xml b/packages/SystemUI/res/drawable/notification_row_legacy_bg.xml
new file mode 100644 (file)
index 0000000..ce3372e
--- /dev/null
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:exitFadeDuration="@android:integer/config_mediumAnimTime">
+
+    <item android:state_pressed="true"  android:drawable="@drawable/notification_item_background_color_pressed" />
+    <item android:state_pressed="false" android:drawable="@drawable/notification_item_background_legacy_color" />
+</selector>
index ff67a7e..3a2ea65 100644 (file)
@@ -30,4 +30,5 @@
     <drawable name="notification_tracking_bg">#d8000000</drawable>
     <color name="notification_list_shadow_top">#80000000</color>
     <drawable name="recents_callout_line">#99ffffff</drawable>
+    <drawable name="notification_item_background_legacy_color">#ffaaaaaa</drawable>
 </resources>
index b0554d0..f0093d3 100644 (file)
@@ -28,11 +28,14 @@ import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.res.Resources;
 import android.content.res.Configuration;
 import android.graphics.PixelFormat;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
+import android.os.Build;
 import android.os.IBinder;
 import android.os.RemoteException;
 import android.os.Handler;
@@ -775,6 +778,8 @@ public class PhoneStatusBar extends StatusBar {
             row.setDrawingCacheEnabled(true);
         }
 
+        applyLegacyRowBackground(notification, content);
+
         return new View[] { row, content, expanded };
     }
 
@@ -948,6 +953,8 @@ public class PhoneStatusBar extends StatusBar {
             row.setDrawingCacheEnabled(true);
         }
 
+        applyLegacyRowBackground(sbn, content);
+
         entry.row = row;
         entry.content = content;
         entry.expanded = expanded;
@@ -956,6 +963,24 @@ public class PhoneStatusBar extends StatusBar {
         return true;
     }
 
+    void applyLegacyRowBackground(StatusBarNotification sbn, View content) {
+        if (sbn.notification.contentView.getLayoutId() !=
+                com.android.internal.R.layout.status_bar_latest_event_content) {
+            int version = 0;
+            try {
+                ApplicationInfo info = mContext.getPackageManager().getApplicationInfo(sbn.pkg, 0);
+                version = info.targetSdkVersion;
+            } catch (NameNotFoundException ex) {
+                Slog.e(TAG, "Failed looking up ApplicationInfo for " + sbn.pkg, ex);
+            }
+            if (version > 0 && version < Build.VERSION_CODES.HONEYCOMB) {
+                content.setBackgroundResource(R.drawable.notification_row_legacy_bg);
+            } else {
+                content.setBackgroundResource(R.drawable.notification_row_bg);
+            }
+        }
+    }
+
     StatusBarNotification removeNotificationViews(IBinder key) {
         NotificationData.Entry entry = mNotificationData.remove(key);
         if (entry == null) {
index 5c691aa..01406bc 100644 (file)
@@ -32,13 +32,17 @@ import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.SharedPreferences;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.inputmethodservice.InputMethodService;
 import android.graphics.PixelFormat;
 import android.graphics.Point;
 import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
 import android.graphics.drawable.LayerDrawable;
+import android.os.Build;
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.Message;
@@ -1742,8 +1746,10 @@ public class TabletStatusBar extends StatusBar implements
     }
 
     void workAroundBadLayerDrawableOpacity(View v) {
-        LayerDrawable d = (LayerDrawable)v.getBackground();
-        if (d == null) return;
+        Drawable bgd = v.getBackground();
+        if (!(bgd instanceof LayerDrawable)) return;
+
+        LayerDrawable d = (LayerDrawable) bgd;
         v.setBackgroundDrawable(null);
         d.setOpacity(PixelFormat.TRANSLUCENT);
         v.setBackgroundDrawable(d);
@@ -1809,6 +1815,8 @@ public class TabletStatusBar extends StatusBar implements
             row.setDrawingCacheEnabled(true);
         }
 
+        applyLegacyRowBackground(sbn, content);
+
         entry.row = row;
         entry.content = content;
         entry.expanded = expanded;
@@ -1817,6 +1825,24 @@ public class TabletStatusBar extends StatusBar implements
         return true;
     }
 
+    void applyLegacyRowBackground(StatusBarNotification sbn, View content) {
+        if (sbn.notification.contentView.getLayoutId() !=
+                com.android.internal.R.layout.status_bar_latest_event_content) {
+            int version = 0;
+            try {
+                ApplicationInfo info = mContext.getPackageManager().getApplicationInfo(sbn.pkg, 0);
+                version = info.targetSdkVersion;
+            } catch (NameNotFoundException ex) {
+                Slog.e(TAG, "Failed looking up ApplicationInfo for " + sbn.pkg, ex);
+            }
+            if (version > 0 && version < Build.VERSION_CODES.HONEYCOMB) {
+                content.setBackgroundResource(R.drawable.notification_row_legacy_bg);
+            } else {
+                content.setBackgroundResource(R.drawable.notification_row_bg);
+            }
+        }
+    }
+
     public void clearAll() {
         try {
             mBarService.onClearAllNotifications();