Merge "A separate entry for work profile CA cert" into oc-mr1-dev
diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java b/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java
index 64f3a6f..a67184a 100644
--- a/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java
+++ b/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java
@@ -77,6 +77,9 @@
     protected static final int USER_TYPE_MANAGED_PROFILE = 2;
     protected static final int USER_TYPE_SECONDARY = 3;
 
+    /** Time we wait before clearing a wrong input attempt (e.g. pattern) and the error message. */
+    protected static final long CLEAR_WRONG_ATTEMPT_TIMEOUT_MS = 3000;
+
     private FingerprintUiHelper mFingerprintHelper;
     protected boolean mReturnCredentials = false;
     protected Button mCancelButton;
diff --git a/src/com/android/settings/password/ConfirmLockPassword.java b/src/com/android/settings/password/ConfirmLockPassword.java
index dcb7b66..20182cb 100644
--- a/src/com/android/settings/password/ConfirmLockPassword.java
+++ b/src/com/android/settings/password/ConfirmLockPassword.java
@@ -93,7 +93,6 @@
     public static class ConfirmLockPasswordFragment extends ConfirmDeviceCredentialBaseFragment
             implements OnClickListener, OnEditorActionListener,
             CredentialCheckResultTracker.Listener {
-        private static final long ERROR_MESSAGE_TIMEOUT = 3000;
         private static final String FRAGMENT_TAG_CHECK_LOCK_RESULT = "check_lock_result";
         private ImeAwareEditText mPasswordEntry;
         private TextViewInputDisabler mPasswordEntryInputDisabler;
@@ -460,7 +459,7 @@
                             effectiveUserId, timeoutMs);
                     handleAttemptLockout(deadline);
                 } else {
-                    showError(getErrorMessage(), ERROR_MESSAGE_TIMEOUT);
+                    showError(getErrorMessage(), CLEAR_WRONG_ATTEMPT_TIMEOUT_MS);
                 }
                 if (newResult) {
                     reportFailedAttempt();
diff --git a/src/com/android/settings/password/ConfirmLockPattern.java b/src/com/android/settings/password/ConfirmLockPattern.java
index 60d5a01..1e88150 100644
--- a/src/com/android/settings/password/ConfirmLockPattern.java
+++ b/src/com/android/settings/password/ConfirmLockPattern.java
@@ -79,9 +79,6 @@
     public static class ConfirmLockPatternFragment extends ConfirmDeviceCredentialBaseFragment
             implements AppearAnimationCreator<Object>, CredentialCheckResultTracker.Listener {
 
-        // how long we wait to clear a wrong pattern
-        private static final int WRONG_PATTERN_CLEAR_TIMEOUT_MS = 2000;
-
         private static final String FRAGMENT_TAG_CHECK_LOCK_RESULT = "check_lock_result";
 
         private LockPatternView mLockPatternView;
@@ -315,7 +312,8 @@
                     mLockPatternView.clearPattern();
                     break;
                 case NeedToUnlockWrong:
-                    mErrorTextView.setText(R.string.lockpattern_need_to_unlock_wrong);
+                    showError(R.string.lockpattern_need_to_unlock_wrong,
+                            CLEAR_WRONG_ATTEMPT_TIMEOUT_MS);
 
                     mLockPatternView.setDisplayMode(LockPatternView.DisplayMode.Wrong);
                     mLockPatternView.setEnabled(true);
@@ -349,7 +347,7 @@
         // already
         private void postClearPatternRunnable() {
             mLockPatternView.removeCallbacks(mClearPatternRunnable);
-            mLockPatternView.postDelayed(mClearPatternRunnable, WRONG_PATTERN_CLEAR_TIMEOUT_MS);
+            mLockPatternView.postDelayed(mClearPatternRunnable, CLEAR_WRONG_ATTEMPT_TIMEOUT_MS);
         }
 
         @Override
diff --git a/src/com/android/settings/widget/DonutView.java b/src/com/android/settings/widget/DonutView.java
index 629e35e..330249b 100644
--- a/src/com/android/settings/widget/DonutView.java
+++ b/src/com/android/settings/widget/DonutView.java
@@ -26,11 +26,15 @@
 import android.graphics.Typeface;
 import android.support.annotation.ColorRes;
 import android.text.TextPaint;
+import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.view.View;
+
 import com.android.settings.R;
 import com.android.settings.Utils;
 
+import java.util.Locale;
+
 /**
  * DonutView represents a donut graph. It visualizes a certain percentage of fullness with a
  * corresponding label with the fullness on the inside (i.e. "50%" inside of the donut).
@@ -101,12 +105,19 @@
             mFilledArc.setColorFilter(mAccentColorFilter);
         }
 
+        final Locale locale = resources.getConfiguration().locale;
+        final int layoutDirection = TextUtils.getLayoutDirectionFromLocale(locale);
+        final int bidiFlags = (layoutDirection == LAYOUT_DIRECTION_LTR)
+                ? Paint.BIDI_LTR
+                : Paint.BIDI_RTL;
+
         mTextPaint = new TextPaint();
         mTextPaint.setColor(Utils.getColorAccent(getContext()));
         mTextPaint.setAntiAlias(true);
         mTextPaint.setTextSize(
                 resources.getDimension(R.dimen.storage_donut_view_label_text_size));
         mTextPaint.setTextAlign(Paint.Align.CENTER);
+        mTextPaint.setBidiFlags(bidiFlags);
 
         mBigNumberPaint = new TextPaint();
         mBigNumberPaint.setColor(Utils.getColorAccent(getContext()));
@@ -117,6 +128,7 @@
         mBigNumberPaint.setTypeface(Typeface.create(
                 context.getString(com.android.internal.R.string.config_headlineFontFamily),
                 Typeface.NORMAL));
+        mBigNumberPaint.setBidiFlags(bidiFlags);
     }
 
     @Override