diff options
| -rw-r--r-- | core/java/android/widget/LinearLayout.java | 6 | ||||
| -rwxr-xr-x | core/res/res/values/strings.xml | 2 | ||||
| -rw-r--r-- | docs/html/guide/google/gcm/adv.jd | 7 | ||||
| -rw-r--r-- | docs/html/guide/google/gcm/gcm.jd | 15 | ||||
| -rw-r--r-- | docs/html/guide/google/gcm/gs.jd | 2 | ||||
| -rwxr-xr-x | policy/src/com/android/internal/policy/impl/PhoneWindowManager.java | 3 | ||||
| -rw-r--r-- | policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewManager.java | 3 | ||||
| -rwxr-xr-x | services/java/com/android/server/NotificationManagerService.java | 21 | ||||
| -rwxr-xr-x | services/java/com/android/server/wm/WindowManagerService.java | 17 |
9 files changed, 47 insertions, 29 deletions
diff --git a/core/java/android/widget/LinearLayout.java b/core/java/android/widget/LinearLayout.java index b6f08623a38f..2f31ebd44a0d 100644 --- a/core/java/android/widget/LinearLayout.java +++ b/core/java/android/widget/LinearLayout.java @@ -648,6 +648,8 @@ public class LinearLayout extends ViewGroup { int largestChildHeight = Integer.MIN_VALUE; + final int layoutDirection = getLayoutDirection(); + // See how tall everyone is. Also remember max width. for (int i = 0; i < count; ++i) { final View child = getVirtualChildAt(i); @@ -667,6 +669,7 @@ public class LinearLayout extends ViewGroup { } LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) child.getLayoutParams(); + lp.onResolveLayoutDirection(layoutDirection); totalWeight += lp.weight; @@ -989,6 +992,8 @@ public class LinearLayout extends ViewGroup { int largestChildWidth = Integer.MIN_VALUE; + final int layoutDirection = getLayoutDirection(); + // See how wide everyone is. Also remember max height. for (int i = 0; i < count; ++i) { final View child = getVirtualChildAt(i); @@ -1009,6 +1014,7 @@ public class LinearLayout extends ViewGroup { final LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) child.getLayoutParams(); + lp.onResolveLayoutDirection(layoutDirection); totalWeight += lp.weight; diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 1c71e644f877..72de22c8f384 100755 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -3936,7 +3936,7 @@ </string> <!-- Text spoken when the user is performing a gesture that will enable accessibility. [CHAR LIMIT=none] --> - <string name="continue_to_enable_accessibility">Keep holding down your two fingers to enable accessibility.</string> + <string name="continue_to_enable_accessibility">Keep holding down two fingers to enable accessibility.</string> <!-- Text spoken when the user enabled accessibility. [CHAR LIMIT=none] --> <string name="accessibility_enabled">Accessibility enabled.</string> <!-- Text spoken when the user stops preforming a gesture that would enable accessibility. [CHAR LIMIT=none] --> diff --git a/docs/html/guide/google/gcm/adv.jd b/docs/html/guide/google/gcm/adv.jd index aa66e25bdd11..356ee1d2b003 100644 --- a/docs/html/guide/google/gcm/adv.jd +++ b/docs/html/guide/google/gcm/adv.jd @@ -163,7 +163,7 @@ registerReceiver(mRetryReceiver, filter); <p>There are two ways to unregister a device from GCM: manually and automatically.</p> <p>An Android application can manually unregister itself by issuing a <code>com.google.android.c2dm.intent.UNREGISTER</code> intent, which is useful when the application offers a logoff feature (so it can unregister on logoff and register again on logon). See the <a href="gcm.html#unregistering">Architectural Overview</a> for more discussion of this topic. This is the sequence of events when an application unregisters itself:</p> <ol> - <li> The application issues a <code>com.google.android.c2dm.intent.UNREGISTER</code> intent, passing the registration ID (the application should have saved its registration ID when it received the proper <code>com.google.android.c2dm.intent.REGISTRATION</code> intent).</li> + <li> The application issues a <code>com.google.android.c2dm.intent.UNREGISTER</code> intent, passing the package name as an extra.</li> <li>When the GCM server is done with the unregistration, it sends a <code>com.google.android.c2dm.intent.REGISTRATION</code> intent with the <code>unregistered</code> extra set.</li> <li>The application then must contact the 3rd-party server so it can remove the registration ID.</li> <li>The application should also clear its registration ID. @@ -174,7 +174,7 @@ registerReceiver(mRetryReceiver, filter); <li>The end user uninstalls the application.</li> <li>The 3rd-party server sends a message to GCM server.</li> <li>The GCM server sends the message to the device.</li> - <li>The GCM client receives the message and queries Package Manager about whether there are broadcast receivers configured to receive it, which returns <code>false</code>. + <li>The GCM client receives the message and queries Package Manager about whether there are broadcast receivers configured to receive it, which returns <code>false</code>. </li> <li>The GCM client informs the GCM server that the application was uninstalled.</li> <li>The GCM server marks the registration ID for deletion.</li> @@ -183,6 +183,9 @@ registerReceiver(mRetryReceiver, filter); <li>The 3rd-party deletes the registration ID. </li> </ol> + +<p class ="note"><strong>Note:</strong> The GCM client is the Google Cloud Messaging framework present on the device.</p> + <p>Note that it might take a while for the registration ID be completely removed from GCM. Thus it is possible that messages sent during step 7 above gets a valid message ID as response, even though the message will not be delivered to the device. Eventually, the registration ID will be removed and the server will get a <code>NotRegistered</code> error, without any further action being required from the 3rd-party server (this scenario happens frequently while an application is being developed and tested).</p> <h2 id="collapsible">Send-to-Sync vs. Messages with Payload</h2> diff --git a/docs/html/guide/google/gcm/gcm.jd b/docs/html/guide/google/gcm/gcm.jd index c4dfecf33e3c..a47ceb9b6ddc 100644 --- a/docs/html/guide/google/gcm/gcm.jd +++ b/docs/html/guide/google/gcm/gcm.jd @@ -773,13 +773,8 @@ the HTTP response contains a non-200 status code (such as 400, 401, or 503).</p> <td>There was an error authenticating the sender account. <a href="#auth_error">Troubleshoot</a></td> </tr> <tr> - <td>500</td> - <td>There was an internal error in the GCM server while trying to process the request. <a href="#internal_error">Troubleshoot</a></td> - </tr> - <tr> - <td>503</td> - <td>Indicates that the server is temporarily unavailable (i.e., because of timeouts, etc ). Sender must retry later, honoring any <code>Retry-After</code> header - included in the response. Application servers must implement exponential back-off. The GCM server took too long to process the request. <a href="#internal_error">Troubleshoot</a></td> + <td>5xx</td> + <td>Errors in the 500-599 range (such as 500 or 503) indicate that there was an internal error in the GCM server while trying to process the request, or that the server is temporarily unavailable (for example, because of timeouts). Sender must retry later, honoring any <code>Retry-After</code> header included in the response. Application servers must implement exponential back-off. <a href="#internal_error">Troubleshoot</a></td> </tr> </table> @@ -935,17 +930,15 @@ all messages at the same time.</li> Senders that cause problems risk being blacklisted. <br /> -Happens when the HTTP status code is 503, or when the <code>error</code> field of a JSON object in the results array is <code>Unavailable</code>. +Happens when the HTTP status code is between 501 and 599, or when the <code>error</code> field of a JSON object in the results array is <code>Unavailable</code>. </dd> <dt id="internal_error"><strong>Internal Server Error</strong></dt> <dd> The server encountered an error while trying to process the request. You -could retry the same request (obeying the requirements listed in the <strong>Timeout</strong> +could retry the same request (obeying the requirements listed in the <a href="#timeout">Timeout</a> section), but if the error persists, please report the problem in the <a href="https://groups.google.com/forum/?fromgroups#!forum/android-gcm">android-gcm group</a>. -<br /> -Senders that cause problems risk being blacklisted. <br /> Happens when the HTTP status code is 500, or when the <code>error</code> field of a JSON object in the results array is <code>InternalServerError</code>. diff --git a/docs/html/guide/google/gcm/gs.jd b/docs/html/guide/google/gcm/gs.jd index 93eb79448e2c..8d132d859020 100644 --- a/docs/html/guide/google/gcm/gs.jd +++ b/docs/html/guide/google/gcm/gs.jd @@ -145,7 +145,9 @@ page.title=GCM: Getting Started <li>If the value is dynamic, the service should override the <code>getSenderIds()</code> method.</li> </ul> + <h4>Step 3: Write the my_app_package.GCMIntentService class</h4> + <p>Next write the <code>my_app_package.GCMIntentService</code> class, overriding the following callback methods (which are called by <code>GCMBroadcastReceiver</code>):<br> </p> <ul> diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index 9307f37b1bfe..7e047fdfdf96 100755 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -4302,6 +4302,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { } public boolean performHapticFeedbackLw(WindowState win, int effectId, boolean always) { + if (!mVibrator.hasVibrator()) { + return false; + } final boolean hapticsDisabled = Settings.System.getIntForUser(mContext.getContentResolver(), Settings.System.HAPTIC_FEEDBACK_ENABLED, 0, UserHandle.USER_CURRENT) == 0; if (!always && (hapticsDisabled || mKeyguardMediator.isShowingAndNotHidden())) { diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewManager.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewManager.java index 3ffd43f89881..d25444f963ef 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewManager.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewManager.java @@ -201,6 +201,9 @@ public class KeyguardViewManager { if (v != null) { mKeyguardHost.removeView(v); } + // TODO: Remove once b/7094175 is fixed + Slog.d(TAG, "inflateKeyguardView: b/7094175 mContext.config=" + + mContext.getResources().getConfiguration()); final LayoutInflater inflater = LayoutInflater.from(mContext); View view = inflater.inflate(R.layout.keyguard_host_view, mKeyguardHost, true); mKeyguardView = (KeyguardHostView) view.findViewById(R.id.keyguard_host_view); diff --git a/services/java/com/android/server/NotificationManagerService.java b/services/java/com/android/server/NotificationManagerService.java index 85b488c9e1a2..93ae0295e297 100755 --- a/services/java/com/android/server/NotificationManagerService.java +++ b/services/java/com/android/server/NotificationManagerService.java @@ -991,6 +991,14 @@ public class NotificationManagerService extends INotificationManager.Stub | Notification.FLAG_NO_CLEAR; } + final int currentUser; + final long token = Binder.clearCallingIdentity(); + try { + currentUser = ActivityManager.getCurrentUser(); + } finally { + Binder.restoreCallingIdentity(token); + } + if (notification.icon != 0) { final StatusBarNotification n = new StatusBarNotification( pkg, id, tag, r.uid, r.initialPid, score, notification, user); @@ -1015,7 +1023,10 @@ public class NotificationManagerService extends INotificationManager.Stub Binder.restoreCallingIdentity(identity); } } - sendAccessibilityEvent(notification, pkg); + // Send accessibility events only for the current user. + if (currentUser == userId) { + sendAccessibilityEvent(notification, pkg); + } } else { Slog.e(TAG, "Ignoring notification with icon==0: " + notification); if (old != null && old.statusBarKey != null) { @@ -1029,14 +1040,6 @@ public class NotificationManagerService extends INotificationManager.Stub } } - final int currentUser; - final long token = Binder.clearCallingIdentity(); - try { - currentUser = ActivityManager.getCurrentUser(); - } finally { - Binder.restoreCallingIdentity(token); - } - // If we're not supposed to beep, vibrate, etc. then don't. if (((mDisabledNotifications & StatusBarManager.DISABLE_NOTIFICATION_ALERTS) == 0) && (!(old != null diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index abbeb8204cef..54f6deb417be 100755 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -2752,7 +2752,10 @@ public class WindowManagerService extends IWindowManager.Stub } } - if (DEBUG_LAYOUT) Slog.v(TAG, "Relayout " + win + ": viewVisibility=" + viewVisibility + if (DEBUG_LAYOUT + // TODO: Remove once b/7094175 is fixed + || ((String)win.mAttrs.getTitle()).contains("Keyguard") + ) Slog.v(TAG, "Relayout " + win + ": viewVisibility=" + viewVisibility + " " + requestedWidth + "x" + requestedHeight + " " + win.mAttrs); win.mEnforceSizeCompat = (win.mAttrs.flags & FLAG_COMPATIBLE_WINDOW) != 0; @@ -5651,12 +5654,12 @@ public class WindowManagerService extends IWindowManager.Stub @Override public void showStrictModeViolation(boolean on) { if (mHeadless) return; - mH.sendMessage(mH.obtainMessage(H.SHOW_STRICT_MODE_VIOLATION, on ? 1 : 0, 0)); + int pid = Binder.getCallingPid(); + mH.sendMessage(mH.obtainMessage(H.SHOW_STRICT_MODE_VIOLATION, on ? 1 : 0, pid)); } - private void showStrictModeViolation(int arg) { + private void showStrictModeViolation(int arg, int pid) { final boolean on = arg != 0; - int pid = Binder.getCallingPid(); synchronized(mWindowMap) { // Ignoring requests to enable the red border from clients // which aren't on screen. (e.g. Broadcast Receivers in @@ -7647,7 +7650,7 @@ public class WindowManagerService extends IWindowManager.Stub } case SHOW_STRICT_MODE_VIOLATION: { - showStrictModeViolation(msg.arg1); + showStrictModeViolation(msg.arg1, msg.arg2); break; } @@ -9272,7 +9275,9 @@ public class WindowManagerService extends IWindowManager.Stub "Reporting new frame to " + win + ": " + win.mCompatFrame); int diff = 0; boolean configChanged = win.isConfigChanged(); - if ((DEBUG_RESIZE || DEBUG_ORIENTATION || DEBUG_CONFIGURATION) + if ((DEBUG_RESIZE || DEBUG_ORIENTATION || DEBUG_CONFIGURATION + // TODO: Remove once b/7094175 is fixed + || ((String)win.mAttrs.getTitle()).contains("Keyguard")) && configChanged) { Slog.i(TAG, "Sending new config to window " + win + ": " + winAnimator.mSurfaceW + "x" + winAnimator.mSurfaceH |