Patches for IKeyguardStateCallback

1. Also notify input is restricted or not when IKeyguardStateCallback callback is added.
When first Keyguard is showing after boot, the mInputRestricted is not updated. So,
inKeyguardRestrictedInputMode still returns false, although device is locked.

2. If mShowing remains false during setup time of KeyguardViewMediator, mInputRestricted
is not updated. This is because updateInputRestrictedLocked is called only if showing
value is changed during setup time.
For this reason, when device is not provisioned, inKeyguardRestrictedInputMode returns
false, and device does not restrict key.

3. If one of callbacks causes RemoteException, the other callbacks are not called.
This is because catching RemoteException breaks for-loop.

Change-Id: I0281405127bcc75285b908d01485da3ac9b40b52
Signed-off-by: Dooyoung Hwang <dooyoung.hwang@lge.com>
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index fae0643..5f4e4ca 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -33,6 +33,7 @@
 import android.media.AudioManager;
 import android.media.SoundPool;
 import android.os.Bundle;
+import android.os.DeadObjectException;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
@@ -380,14 +381,17 @@
                         + ",state=" + simState + ")");
             }
 
-            try {
-                int size = mKeyguardStateCallbacks.size();
-                boolean simPinSecure = mUpdateMonitor.isSimPinSecure();
-                for (int i = 0; i < size; i++) {
+            int size = mKeyguardStateCallbacks.size();
+            boolean simPinSecure = mUpdateMonitor.isSimPinSecure();
+            for (int i = size - 1; i >= 0; i--) {
+                try {
                     mKeyguardStateCallbacks.get(i).onSimSecureStateChanged(simPinSecure);
+                } catch (RemoteException e) {
+                    Slog.w(TAG, "Failed to call onSimSecureStateChanged", e);
+                    if (e instanceof DeadObjectException) {
+                        mKeyguardStateCallbacks.remove(i);
+                    }
                 }
-            } catch (RemoteException e) {
-                Slog.w(TAG, "Failed to call onSimSecureStateChanged", e);
             }
 
             switch (simState) {
@@ -540,6 +544,7 @@
 
         // Assume keyguard is showing (unless it's disabled) until we know for sure...
         setShowingLocked(!shouldWaitForProvisioning() && !mLockPatternUtils.isLockScreenDisabled());
+        updateInputRestrictedLocked();
         mTrustManager.reportKeyguardShowingChanged();
 
         mStatusBarKeyguardViewManager = new StatusBarKeyguardViewManager(mContext,
@@ -929,13 +934,16 @@
         boolean inputRestricted = isInputRestricted();
         if (mInputRestricted != inputRestricted) {
             mInputRestricted = inputRestricted;
-            try {
-                int size = mKeyguardStateCallbacks.size();
-                for (int i = 0; i < size; i++) {
+            int size = mKeyguardStateCallbacks.size();
+            for (int i = size - 1; i >= 0; i--) {
+                try {
                     mKeyguardStateCallbacks.get(i).onInputRestrictedStateChanged(inputRestricted);
+                } catch (RemoteException e) {
+                    Slog.w(TAG, "Failed to call onDeviceProvisioned", e);
+                    if (e instanceof DeadObjectException) {
+                        mKeyguardStateCallbacks.remove(i);
+                    }
                 }
-            } catch (RemoteException e) {
-                Slog.w(TAG, "Failed to call onDeviceProvisioned", e);
             }
         }
     }
@@ -1531,13 +1539,16 @@
     private void setShowingLocked(boolean showing) {
         if (showing != mShowing) {
             mShowing = showing;
-            try {
-                int size = mKeyguardStateCallbacks.size();
-                for (int i = 0; i < size; i++) {
+            int size = mKeyguardStateCallbacks.size();
+            for (int i = size - 1; i >= 0; i--) {
+                try {
                     mKeyguardStateCallbacks.get(i).onShowingStateChanged(showing);
+                } catch (RemoteException e) {
+                    Slog.w(TAG, "Failed to call onShowingStateChanged", e);
+                    if (e instanceof DeadObjectException) {
+                        mKeyguardStateCallbacks.remove(i);
+                    }
                 }
-            } catch (RemoteException e) {
-                Slog.w(TAG, "Failed to call onShowingStateChanged", e);
             }
             updateInputRestrictedLocked();
             mTrustManager.reportKeyguardShowingChanged();
@@ -1550,8 +1561,9 @@
             try {
                 callback.onSimSecureStateChanged(mUpdateMonitor.isSimPinSecure());
                 callback.onShowingStateChanged(mShowing);
+                callback.onInputRestrictedStateChanged(mInputRestricted);
             } catch (RemoteException e) {
-                Slog.w(TAG, "Failed to call onShowingStateChanged or onSimSecureStateChanged", e);
+                Slog.w(TAG, "Failed to call onShowingStateChanged or onSimSecureStateChanged or onInputRestrictedStateChanged", e);
             }
         }
     }