Merge "Add popup theme to AutoCompleteTextView, clean up constructor"
diff --git a/api/current.txt b/api/current.txt
index 9858ff0..1e4a63c 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -22694,12 +22694,14 @@
public static class Build.VERSION {
ctor public Build.VERSION();
+ field public static final java.lang.String BASE_OS;
field public static final java.lang.String CODENAME;
field public static final java.lang.String INCREMENTAL;
field public static final int PREVIEW_SDK_INT;
field public static final java.lang.String RELEASE;
field public static final deprecated java.lang.String SDK;
field public static final int SDK_INT;
+ field public static final java.lang.String SECURITY_PATCH;
}
public static class Build.VERSION_CODES {
@@ -23885,6 +23887,7 @@
method protected void onClick();
method protected android.view.View onCreateView(android.view.ViewGroup);
method public void onDependencyChanged(android.preference.Preference, boolean);
+ method protected void onDetachedFromActivity();
method protected java.lang.Object onGetDefaultValue(android.content.res.TypedArray, int);
method public void onParentChanged(android.preference.Preference, boolean);
method protected void onPrepareForRemoval();
diff --git a/api/system-current.txt b/api/system-current.txt
index 4b6e021..e3828698 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -24638,12 +24638,14 @@
public static class Build.VERSION {
ctor public Build.VERSION();
+ field public static final java.lang.String BASE_OS;
field public static final java.lang.String CODENAME;
field public static final java.lang.String INCREMENTAL;
field public static final int PREVIEW_SDK_INT;
field public static final java.lang.String RELEASE;
field public static final deprecated java.lang.String SDK;
field public static final int SDK_INT;
+ field public static final java.lang.String SECURITY_PATCH;
}
public static class Build.VERSION_CODES {
@@ -25841,6 +25843,7 @@
method protected void onClick();
method protected android.view.View onCreateView(android.view.ViewGroup);
method public void onDependencyChanged(android.preference.Preference, boolean);
+ method protected void onDetachedFromActivity();
method protected java.lang.Object onGetDefaultValue(android.content.res.TypedArray, int);
method public void onParentChanged(android.preference.Preference, boolean);
method protected void onPrepareForRemoval();
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index 0adce5d..0cd02dd 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -74,6 +74,7 @@
import android.os.UserManager;
import android.os.storage.StorageManager;
import android.os.storage.VolumeInfo;
+import android.provider.Settings;
import android.util.ArrayMap;
import android.util.Log;
import android.view.Display;
@@ -1603,14 +1604,17 @@
final List<VolumeInfo> vols = storage.getVolumes();
final List<VolumeInfo> candidates = new ArrayList<>();
for (VolumeInfo vol : vols) {
- if (Objects.equals(vol, currentVol) || isPackageCandidateVolume(app, vol)) {
+ if (Objects.equals(vol, currentVol) || isPackageCandidateVolume(mContext, app, vol)) {
candidates.add(vol);
}
}
return candidates;
}
- private static boolean isPackageCandidateVolume(ApplicationInfo app, VolumeInfo vol) {
+ private static boolean isPackageCandidateVolume(
+ ContextImpl context, ApplicationInfo app, VolumeInfo vol) {
+ final boolean forceAllowOnExternal = Settings.Global.getInt(
+ context.getContentResolver(), Settings.Global.FORCE_ALLOW_ON_EXTERNAL, 0) != 0;
// Private internal is always an option
if (VolumeInfo.ID_PRIVATE_INTERNAL.equals(vol.getId())) {
return true;
@@ -1618,8 +1622,11 @@
// System apps and apps demanding internal storage can't be moved
// anywhere else
- if (app.isSystemApp()
- || app.installLocation == PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY) {
+ if (app.isSystemApp()) {
+ return false;
+ }
+ if (!forceAllowOnExternal
+ && app.installLocation == PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY) {
return false;
}
diff --git a/core/java/android/content/res/TypedArray.java b/core/java/android/content/res/TypedArray.java
index 8bcd5d1..cc65e1e 100644
--- a/core/java/android/content/res/TypedArray.java
+++ b/core/java/android/content/res/TypedArray.java
@@ -19,6 +19,7 @@
import android.annotation.AnyRes;
import android.annotation.ColorInt;
import android.annotation.Nullable;
+import android.annotation.StyleableRes;
import android.graphics.drawable.Drawable;
import android.os.StrictMode;
import android.util.AttributeSet;
@@ -144,7 +145,7 @@
* coerced to a string.
* @throws RuntimeException if the TypedArray has already been recycled.
*/
- public CharSequence getText(int index) {
+ public CharSequence getText(@StyleableRes int index) {
if (mRecycled) {
throw new RuntimeException("Cannot make calls to a recycled instance!");
}
@@ -181,7 +182,7 @@
* @throws RuntimeException if the TypedArray has already been recycled.
*/
@Nullable
- public String getString(int index) {
+ public String getString(@StyleableRes int index) {
if (mRecycled) {
throw new RuntimeException("Cannot make calls to a recycled instance!");
}
@@ -220,7 +221,7 @@
* an immediate string value.
* @throws RuntimeException if the TypedArray has already been recycled.
*/
- public String getNonResourceString(int index) {
+ public String getNonResourceString(@StyleableRes int index) {
if (mRecycled) {
throw new RuntimeException("Cannot make calls to a recycled instance!");
}
@@ -251,7 +252,7 @@
* @throws RuntimeException if the TypedArray has already been recycled.
* @hide
*/
- public String getNonConfigurationString(int index, int allowedChangingConfigs) {
+ public String getNonConfigurationString(@StyleableRes int index, int allowedChangingConfigs) {
if (mRecycled) {
throw new RuntimeException("Cannot make calls to a recycled instance!");
}
@@ -295,7 +296,7 @@
* not defined or could not be coerced to an integer.
* @throws RuntimeException if the TypedArray has already been recycled.
*/
- public boolean getBoolean(int index, boolean defValue) {
+ public boolean getBoolean(@StyleableRes int index, boolean defValue) {
if (mRecycled) {
throw new RuntimeException("Cannot make calls to a recycled instance!");
}
@@ -334,7 +335,7 @@
* not defined or could not be coerced to an integer.
* @throws RuntimeException if the TypedArray has already been recycled.
*/
- public int getInt(int index, int defValue) {
+ public int getInt(@StyleableRes int index, int defValue) {
if (mRecycled) {
throw new RuntimeException("Cannot make calls to a recycled instance!");
}
@@ -371,7 +372,7 @@
* not defined or could not be coerced to a float.
* @throws RuntimeException if the TypedArray has already been recycled.
*/
- public float getFloat(int index, float defValue) {
+ public float getFloat(@StyleableRes int index, float defValue) {
if (mRecycled) {
throw new RuntimeException("Cannot make calls to a recycled instance!");
}
@@ -420,7 +421,7 @@
* not an integer color or color state list.
*/
@ColorInt
- public int getColor(int index, @ColorInt int defValue) {
+ public int getColor(@StyleableRes int index, @ColorInt int defValue) {
if (mRecycled) {
throw new RuntimeException("Cannot make calls to a recycled instance!");
}
@@ -471,7 +472,7 @@
* not an integer color or color state list.
*/
@Nullable
- public ColorStateList getColorStateList(int index) {
+ public ColorStateList getColorStateList(@StyleableRes int index) {
if (mRecycled) {
throw new RuntimeException("Cannot make calls to a recycled instance!");
}
@@ -502,7 +503,7 @@
* @throws UnsupportedOperationException if the attribute is defined but is
* not an integer.
*/
- public int getInteger(int index, int defValue) {
+ public int getInteger(@StyleableRes int index, int defValue) {
if (mRecycled) {
throw new RuntimeException("Cannot make calls to a recycled instance!");
}
@@ -548,7 +549,7 @@
* @see #getDimensionPixelOffset
* @see #getDimensionPixelSize
*/
- public float getDimension(int index, float defValue) {
+ public float getDimension(@StyleableRes int index, float defValue) {
if (mRecycled) {
throw new RuntimeException("Cannot make calls to a recycled instance!");
}
@@ -595,7 +596,7 @@
* @see #getDimension
* @see #getDimensionPixelSize
*/
- public int getDimensionPixelOffset(int index, int defValue) {
+ public int getDimensionPixelOffset(@StyleableRes int index, int defValue) {
if (mRecycled) {
throw new RuntimeException("Cannot make calls to a recycled instance!");
}
@@ -643,7 +644,7 @@
* @see #getDimension
* @see #getDimensionPixelOffset
*/
- public int getDimensionPixelSize(int index, int defValue) {
+ public int getDimensionPixelSize(@StyleableRes int index, int defValue) {
if (mRecycled) {
throw new RuntimeException("Cannot make calls to a recycled instance!");
}
@@ -685,7 +686,7 @@
* @throws UnsupportedOperationException if the attribute is defined but is
* not a dimension or integer (enum).
*/
- public int getLayoutDimension(int index, String name) {
+ public int getLayoutDimension(@StyleableRes int index, String name) {
if (mRecycled) {
throw new RuntimeException("Cannot make calls to a recycled instance!");
}
@@ -724,7 +725,7 @@
* metric and truncated to integer pixels.
* @throws RuntimeException if the TypedArray has already been recycled.
*/
- public int getLayoutDimension(int index, int defValue) {
+ public int getLayoutDimension(@StyleableRes int index, int defValue) {
if (mRecycled) {
throw new RuntimeException("Cannot make calls to a recycled instance!");
}
@@ -761,7 +762,7 @@
* @throws UnsupportedOperationException if the attribute is defined but is
* not a fraction.
*/
- public float getFraction(int index, int base, int pbase, float defValue) {
+ public float getFraction(@StyleableRes int index, int base, int pbase, float defValue) {
if (mRecycled) {
throw new RuntimeException("Cannot make calls to a recycled instance!");
}
@@ -801,7 +802,7 @@
* @throws RuntimeException if the TypedArray has already been recycled.
*/
@AnyRes
- public int getResourceId(int index, int defValue) {
+ public int getResourceId(@StyleableRes int index, int defValue) {
if (mRecycled) {
throw new RuntimeException("Cannot make calls to a recycled instance!");
}
@@ -829,7 +830,7 @@
* @throws RuntimeException if the TypedArray has already been recycled.
* @hide
*/
- public int getThemeAttributeId(int index, int defValue) {
+ public int getThemeAttributeId(@StyleableRes int index, int defValue) {
if (mRecycled) {
throw new RuntimeException("Cannot make calls to a recycled instance!");
}
@@ -856,7 +857,7 @@
* not a color or drawable resource.
*/
@Nullable
- public Drawable getDrawable(int index) {
+ public Drawable getDrawable(@StyleableRes int index) {
if (mRecycled) {
throw new RuntimeException("Cannot make calls to a recycled instance!");
}
@@ -887,7 +888,7 @@
* defined.
* @throws RuntimeException if the TypedArray has already been recycled.
*/
- public CharSequence[] getTextArray(int index) {
+ public CharSequence[] getTextArray(@StyleableRes int index) {
if (mRecycled) {
throw new RuntimeException("Cannot make calls to a recycled instance!");
}
@@ -909,7 +910,7 @@
* @return {@code true} if the value was retrieved, false otherwise.
* @throws RuntimeException if the TypedArray has already been recycled.
*/
- public boolean getValue(int index, TypedValue outValue) {
+ public boolean getValue(@StyleableRes int index, TypedValue outValue) {
if (mRecycled) {
throw new RuntimeException("Cannot make calls to a recycled instance!");
}
@@ -925,7 +926,7 @@
* @return Attribute type.
* @throws RuntimeException if the TypedArray has already been recycled.
*/
- public int getType(int index) {
+ public int getType(@StyleableRes int index) {
if (mRecycled) {
throw new RuntimeException("Cannot make calls to a recycled instance!");
}
@@ -945,7 +946,7 @@
* @return True if the attribute has a value, false otherwise.
* @throws RuntimeException if the TypedArray has already been recycled.
*/
- public boolean hasValue(int index) {
+ public boolean hasValue(@StyleableRes int index) {
if (mRecycled) {
throw new RuntimeException("Cannot make calls to a recycled instance!");
}
@@ -966,7 +967,7 @@
* @return True if the attribute has a value or is empty, false otherwise.
* @throws RuntimeException if the TypedArray has already been recycled.
*/
- public boolean hasValueOrEmpty(int index) {
+ public boolean hasValueOrEmpty(@StyleableRes int index) {
if (mRecycled) {
throw new RuntimeException("Cannot make calls to a recycled instance!");
}
@@ -990,7 +991,7 @@
* receive a TypedValue whose type is TYPE_NULL.)
* @throws RuntimeException if the TypedArray has already been recycled.
*/
- public TypedValue peekValue(int index) {
+ public TypedValue peekValue(@StyleableRes int index) {
if (mRecycled) {
throw new RuntimeException("Cannot make calls to a recycled instance!");
}
diff --git a/core/java/android/hardware/camera2/params/StreamConfigurationMap.java b/core/java/android/hardware/camera2/params/StreamConfigurationMap.java
index 8e0eab2..e71e49f 100644
--- a/core/java/android/hardware/camera2/params/StreamConfigurationMap.java
+++ b/core/java/android/hardware/camera2/params/StreamConfigurationMap.java
@@ -98,9 +98,19 @@
HighSpeedVideoConfiguration[] highSpeedVideoConfigurations,
ReprocessFormatsMap inputOutputFormatsMap,
boolean listHighResolution) {
- mConfigurations = checkArrayElementsNotNull(configurations, "configurations");
- mMinFrameDurations = checkArrayElementsNotNull(minFrameDurations, "minFrameDurations");
- mStallDurations = checkArrayElementsNotNull(stallDurations, "stallDurations");
+
+ if (configurations == null) {
+ // If no color configurations exist, ensure depth ones do
+ checkArrayElementsNotNull(depthConfigurations, "depthConfigurations");
+ mConfigurations = new StreamConfiguration[0];
+ mMinFrameDurations = new StreamConfigurationDuration[0];
+ mStallDurations = new StreamConfigurationDuration[0];
+ } else {
+ mConfigurations = checkArrayElementsNotNull(configurations, "configurations");
+ mMinFrameDurations = checkArrayElementsNotNull(minFrameDurations, "minFrameDurations");
+ mStallDurations = checkArrayElementsNotNull(stallDurations, "stallDurations");
+ }
+
mListHighResolution = listHighResolution;
if (depthConfigurations == null) {
@@ -124,7 +134,7 @@
}
// For each format, track how many sizes there are available to configure
- for (StreamConfiguration config : configurations) {
+ for (StreamConfiguration config : mConfigurations) {
int fmt = config.getFormat();
SparseIntArray map = null;
if (config.isOutput()) {
@@ -159,7 +169,8 @@
mDepthOutputFormats.get(config.getFormat()) + 1);
}
- if (mOutputFormats.indexOfKey(HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) < 0) {
+ if (configurations != null &&
+ mOutputFormats.indexOfKey(HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) < 0) {
throw new AssertionError(
"At least one stream configuration for IMPLEMENTATION_DEFINED must exist");
}
diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java
index a0162f7..2374899 100644
--- a/core/java/android/os/Build.java
+++ b/core/java/android/os/Build.java
@@ -157,6 +157,17 @@
public static final String RELEASE = getString("ro.build.version.release");
/**
+ * The base OS build the product is based on.
+ */
+ public static final String BASE_OS = SystemProperties.get("ro.build.version.base_os", "");
+
+ /**
+ * The user-visible security patch level.
+ */
+ public static final String SECURITY_PATCH = SystemProperties.get(
+ "ro.build.version.security_patch", "");
+
+ /**
* The user-visible SDK version of the framework in its raw String
* representation; use {@link #SDK_INT} instead.
*
diff --git a/core/java/android/preference/Preference.java b/core/java/android/preference/Preference.java
index 3b482eb..5d64af5 100644
--- a/core/java/android/preference/Preference.java
+++ b/core/java/android/preference/Preference.java
@@ -1184,9 +1184,10 @@
/**
* Called when the Preference hierarchy has been attached to the
- * {@link PreferenceActivity}. This can also be called when this
- * Preference has been attached to a group that was already attached
- * to the {@link PreferenceActivity}.
+ * {@link PreferenceActivity} or {@link PreferenceFragment}. This can
+ * also be called when this Preference has been attached to a group
+ * that was already attached to the {@link PreferenceActivity} or
+ * {@link PreferenceFragment}.
*/
protected void onAttachedToActivity() {
// At this point, the hierarchy that this preference is in is connected
@@ -1194,6 +1195,16 @@
registerDependency();
}
+ /**
+ * Called when the Preference hierarchy has been detached from the
+ * {@link PreferenceActivity} or {@link PreferenceFragment}. This can
+ * also be called when this Preference has been removed from a group
+ * that was already attached to the {@link PreferenceActivity} or
+ * {@link PreferenceFragment}.
+ */
+ protected void onDetachedFromActivity() {
+ }
+
private void registerDependency() {
if (TextUtils.isEmpty(mDependencyKey)) return;
diff --git a/core/java/android/preference/PreferenceGroup.java b/core/java/android/preference/PreferenceGroup.java
index 5e84086..d6e9e61f 100644
--- a/core/java/android/preference/PreferenceGroup.java
+++ b/core/java/android/preference/PreferenceGroup.java
@@ -187,7 +187,11 @@
private boolean removePreferenceInt(Preference preference) {
synchronized(this) {
preference.onPrepareForRemoval();
- return mPreferenceList.remove(preference);
+ boolean success = mPreferenceList.remove(preference);
+ if (mAttachedToActivity) {
+ preference.onDetachedFromActivity();
+ }
+ return success;
}
}
@@ -263,7 +267,7 @@
protected boolean isOnSameScreenAsChildren() {
return true;
}
-
+
@Override
protected void onAttachedToActivity() {
super.onAttachedToActivity();
@@ -280,11 +284,17 @@
}
@Override
- protected void onPrepareForRemoval() {
- super.onPrepareForRemoval();
-
+ protected void onDetachedFromActivity() {
+ super.onDetachedFromActivity();
+
// We won't be attached to the activity anymore
mAttachedToActivity = false;
+
+ // Dispatch to all contained preferences
+ final int preferenceCount = getPreferenceCount();
+ for (int i = 0; i < preferenceCount; i++) {
+ getPreference(i).onDetachedFromActivity();
+ }
}
@Override
diff --git a/core/java/android/preference/PreferenceManager.java b/core/java/android/preference/PreferenceManager.java
index 55ee77a..4e4b1c9 100644
--- a/core/java/android/preference/PreferenceManager.java
+++ b/core/java/android/preference/PreferenceManager.java
@@ -396,6 +396,9 @@
*/
boolean setPreferences(PreferenceScreen preferenceScreen) {
if (preferenceScreen != mPreferenceScreen) {
+ if (mPreferenceScreen != null) {
+ mPreferenceScreen.onDetachedFromActivity();
+ }
mPreferenceScreen = preferenceScreen;
return true;
}
@@ -704,7 +707,11 @@
*/
void dispatchActivityDestroy() {
List<OnActivityDestroyListener> list = null;
-
+
+ if (mPreferenceScreen != null) {
+ mPreferenceScreen.onDetachedFromActivity();
+ mPreferenceScreen = null;
+ }
synchronized (this) {
if (mActivityDestroyListeners != null) {
list = new ArrayList<OnActivityDestroyListener>(mActivityDestroyListeners);
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 9b860515e..8f0f2d2 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -6260,6 +6260,14 @@
public static final String MDC_INITIAL_MAX_RETRY = "mdc_initial_max_retry";
/**
+ * Whether any package can be on external storage. When this is true, any
+ * package, regardless of manifest values, is a candidate for installing
+ * or moving onto external storage. (0 = false, 1 = true)
+ * @hide
+ */
+ public static final String FORCE_ALLOW_ON_EXTERNAL = "force_allow_on_external";
+
+ /**
* Whether user has enabled development settings.
*/
public static final String DEVELOPMENT_SETTINGS_ENABLED = "development_settings_enabled";
diff --git a/core/java/android/text/Html.java b/core/java/android/text/Html.java
index dc1d6f6..3d8ab1e 100644
--- a/core/java/android/text/Html.java
+++ b/core/java/android/text/Html.java
@@ -514,6 +514,12 @@
startA(mSpannableStringBuilder, attributes);
} else if (tag.equalsIgnoreCase("u")) {
start(mSpannableStringBuilder, new Underline());
+ } else if (tag.equalsIgnoreCase("del")) {
+ start(mSpannableStringBuilder, new Strikethrough());
+ } else if (tag.equalsIgnoreCase("s")) {
+ start(mSpannableStringBuilder, new Strikethrough());
+ } else if (tag.equalsIgnoreCase("strike")) {
+ start(mSpannableStringBuilder, new Strikethrough());
} else if (tag.equalsIgnoreCase("sup")) {
start(mSpannableStringBuilder, new Super());
} else if (tag.equalsIgnoreCase("sub")) {
@@ -565,6 +571,12 @@
endA(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("u")) {
end(mSpannableStringBuilder, Underline.class, new UnderlineSpan());
+ } else if (tag.equalsIgnoreCase("del")) {
+ end(mSpannableStringBuilder, Strikethrough.class, new StrikethroughSpan());
+ } else if (tag.equalsIgnoreCase("s")) {
+ end(mSpannableStringBuilder, Strikethrough.class, new StrikethroughSpan());
+ } else if (tag.equalsIgnoreCase("strike")) {
+ end(mSpannableStringBuilder, Strikethrough.class, new StrikethroughSpan());
} else if (tag.equalsIgnoreCase("sup")) {
end(mSpannableStringBuilder, Super.class, new SuperscriptSpan());
} else if (tag.equalsIgnoreCase("sub")) {
@@ -822,6 +834,7 @@
private static class Bold { }
private static class Italic { }
private static class Underline { }
+ private static class Strikethrough { }
private static class Big { }
private static class Small { }
private static class Monospace { }
diff --git a/core/java/android/text/SpannableStringBuilder.java b/core/java/android/text/SpannableStringBuilder.java
index 992dc4d..40315ad 100644
--- a/core/java/android/text/SpannableStringBuilder.java
+++ b/core/java/android/text/SpannableStringBuilder.java
@@ -16,6 +16,7 @@
package android.text;
+import android.annotation.Nullable;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.Log;
@@ -814,8 +815,9 @@
* a list of all the spans regardless of type.
*/
@SuppressWarnings("unchecked")
- public <T> T[] getSpans(int queryStart, int queryEnd, Class<T> kind) {
- if (kind == null || mSpanCount == 0) return ArrayUtils.emptyArray(kind);
+ public <T> T[] getSpans(int queryStart, int queryEnd, @Nullable Class<T> kind) {
+ if (kind == null) return (T[]) ArrayUtils.emptyArray(Object.class);
+ if (mSpanCount == 0) return ArrayUtils.emptyArray(kind);
int count = countSpans(queryStart, queryEnd, kind, treeRoot());
if (count == 0) {
return ArrayUtils.emptyArray(kind);
diff --git a/core/java/android/text/format/Formatter.java b/core/java/android/text/format/Formatter.java
index b5068b2..a53da09 100644
--- a/core/java/android/text/format/Formatter.java
+++ b/core/java/android/text/format/Formatter.java
@@ -131,7 +131,10 @@
// floating point errors.
final int roundFactor;
final String roundFormat;
- if (result < 1) {
+ if (mult == 1 || result >= 100) {
+ roundFactor = 1;
+ roundFormat = "%.0f";
+ } else if (result < 1) {
roundFactor = 100;
roundFormat = "%.2f";
} else if (result < 10) {
@@ -142,7 +145,7 @@
roundFactor = 100;
roundFormat = "%.2f";
}
- } else if (result < 100) {
+ } else { // 10 <= result < 100
if ((flags & FLAG_SHORTER) != 0) {
roundFactor = 1;
roundFormat = "%.0f";
@@ -150,9 +153,6 @@
roundFactor = 100;
roundFormat = "%.2f";
}
- } else {
- roundFactor = 1;
- roundFormat = "%.0f";
}
final String roundedString = String.format(roundFormat, result);
diff --git a/core/java/android/widget/CheckedTextView.java b/core/java/android/widget/CheckedTextView.java
index 6b4b2c7..c1d2756 100644
--- a/core/java/android/widget/CheckedTextView.java
+++ b/core/java/android/widget/CheckedTextView.java
@@ -152,13 +152,8 @@
return;
}
- mCheckMarkResource = resId;
-
- Drawable d = null;
- if (mCheckMarkResource != 0) {
- d = getContext().getDrawable(mCheckMarkResource);
- }
- setCheckMarkDrawable(d);
+ final Drawable d = resId != 0 ? getContext().getDrawable(resId) : null;
+ setCheckMarkDrawableInternal(d, resId);
}
/**
@@ -172,12 +167,18 @@
* @see #setCheckMarkDrawable(int)
* @see #getCheckMarkDrawable()
*/
- public void setCheckMarkDrawable(Drawable d) {
+ public void setCheckMarkDrawable(@Nullable Drawable d) {
+ setCheckMarkDrawableInternal(d, 0);
+ }
+
+ private void setCheckMarkDrawableInternal(@Nullable Drawable d, @DrawableRes int resId) {
if (mCheckMarkDrawable != null) {
mCheckMarkDrawable.setCallback(null);
unscheduleDrawable(mCheckMarkDrawable);
}
+
mNeedRequestlayout = (d != mCheckMarkDrawable);
+
if (d != null) {
d.setCallback(this);
d.setVisible(getVisibility() == VISIBLE, false);
@@ -190,7 +191,9 @@
} else {
mCheckMarkWidth = 0;
}
+
mCheckMarkDrawable = d;
+ mCheckMarkResource = resId;
// Do padding resolution. This will call internalSetPadding() and do a
// requestLayout() if needed.
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index 15353bb..a822a1d 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -3308,7 +3308,7 @@
mSelectionBounds.set(
primaryHorizontal,
layout.getLineTop(line),
- primaryHorizontal + 1,
+ primaryHorizontal,
layout.getLineTop(line + 1) + mHandleHeight);
}
// Take TextView's padding and scroll into account.
diff --git a/core/java/android/widget/Spinner.java b/core/java/android/widget/Spinner.java
index 6abd1293..f3cf61c 100644
--- a/core/java/android/widget/Spinner.java
+++ b/core/java/android/widget/Spinner.java
@@ -85,8 +85,10 @@
*/
private static final int MODE_THEME = -1;
+ private final Rect mTempRect = new Rect();
+
/** Context used to inflate the popup window or dialog. */
- private Context mPopupContext;
+ private final Context mPopupContext;
/** Forwarding listener used to implement drag-to-open. */
private ForwardingListener mForwardingListener;
@@ -100,26 +102,25 @@
private int mGravity;
private boolean mDisableChildrenWhenDisabled;
- private Rect mTempRect = new Rect();
-
/**
- * Construct a new spinner with the given context's theme.
+ * Constructs a new spinner with the given context's theme.
*
* @param context The Context the view is running in, through which it can
- * access the current theme, resources, etc.
+ * access the current theme, resources, etc.
*/
public Spinner(Context context) {
this(context, null);
}
/**
- * Construct a new spinner with the given context's theme and the supplied
+ * Constructs a new spinner with the given context's theme and the supplied
* mode of displaying choices. <code>mode</code> may be one of
* {@link #MODE_DIALOG} or {@link #MODE_DROPDOWN}.
*
* @param context The Context the view is running in, through which it can
- * access the current theme, resources, etc.
- * @param mode Constant describing how the user will select choices from the spinner.
+ * access the current theme, resources, etc.
+ * @param mode Constant describing how the user will select choices from
+ * the spinner.
*
* @see #MODE_DIALOG
* @see #MODE_DROPDOWN
@@ -129,10 +130,11 @@
}
/**
- * Construct a new spinner with the given context's theme and the supplied attribute set.
+ * Constructs a new spinner with the given context's theme and the supplied
+ * attribute set.
*
* @param context The Context the view is running in, through which it can
- * access the current theme, resources, etc.
+ * access the current theme, resources, etc.
* @param attrs The attributes of the XML tag that is inflating the view.
*/
public Spinner(Context context, AttributeSet attrs) {
@@ -140,32 +142,35 @@
}
/**
- * Construct a new spinner with the given context's theme, the supplied attribute set,
- * and default style attribute.
+ * Constructs a new spinner with the given context's theme, the supplied
+ * attribute set, and default style attribute.
*
* @param context The Context the view is running in, through which it can
- * access the current theme, resources, etc.
+ * access the current theme, resources, etc.
* @param attrs The attributes of the XML tag that is inflating the view.
* @param defStyleAttr An attribute in the current theme that contains a
- * reference to a style resource that supplies default values for
- * the view. Can be 0 to not look for defaults.
+ * reference to a style resource that supplies default
+ * values for the view. Can be 0 to not look for
+ * defaults.
*/
public Spinner(Context context, AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0, MODE_THEME);
}
/**
- * Construct a new spinner with the given context's theme, the supplied attribute set,
- * and default style. <code>mode</code> may be one of {@link #MODE_DIALOG} or
- * {@link #MODE_DROPDOWN} and determines how the user will select choices from the spinner.
+ * Constructs a new spinner with the given context's theme, the supplied
+ * attribute set, and default style attribute. <code>mode</code> may be one
+ * of {@link #MODE_DIALOG} or {@link #MODE_DROPDOWN} and determines how the
+ * user will select choices from the spinner.
*
* @param context The Context the view is running in, through which it can
- * access the current theme, resources, etc.
+ * access the current theme, resources, etc.
* @param attrs The attributes of the XML tag that is inflating the view.
* @param defStyleAttr An attribute in the current theme that contains a
- * reference to a style resource that supplies default values for
- * the view. Can be 0 to not look for defaults.
- * @param mode Constant describing how the user will select choices from the spinner.
+ * reference to a style resource that supplies default
+ * values for the view. Can be 0 to not look for defaults.
+ * @param mode Constant describing how the user will select choices from the
+ * spinner.
*
* @see #MODE_DIALOG
* @see #MODE_DROPDOWN
@@ -175,21 +180,24 @@
}
/**
- * Construct a new spinner with the given context's theme, the supplied attribute set,
- * and default style. <code>mode</code> may be one of {@link #MODE_DIALOG} or
- * {@link #MODE_DROPDOWN} and determines how the user will select choices from the spinner.
+ * Constructs a new spinner with the given context's theme, the supplied
+ * attribute set, and default styles. <code>mode</code> may be one of
+ * {@link #MODE_DIALOG} or {@link #MODE_DROPDOWN} and determines how the
+ * user will select choices from the spinner.
*
* @param context The Context the view is running in, through which it can
- * access the current theme, resources, etc.
+ * access the current theme, resources, etc.
* @param attrs The attributes of the XML tag that is inflating the view.
* @param defStyleAttr An attribute in the current theme that contains a
- * reference to a style resource that supplies default values for
- * the view. Can be 0 to not look for defaults.
+ * reference to a style resource that supplies default
+ * values for the view. Can be 0 to not look for
+ * defaults.
* @param defStyleRes A resource identifier of a style resource that
- * supplies default values for the view, used only if
- * defStyleAttr is 0 or can not be found in the theme. Can be 0
- * to not look for defaults.
- * @param mode Constant describing how the user will select choices from the spinner.
+ * supplies default values for the view, used only if
+ * defStyleAttr is 0 or can not be found in the theme.
+ * Can be 0 to not look for defaults.
+ * @param mode Constant describing how the user will select choices from
+ * the spinner.
*
* @see #MODE_DIALOG
* @see #MODE_DROPDOWN
@@ -200,10 +208,10 @@
}
/**
- * Constructs a new spinner with the given context's theme, the supplied
- * attribute set, default styles, popup mode (one of {@link #MODE_DIALOG}
- * or {@link #MODE_DROPDOWN}), and the context against which the popup
- * should be inflated.
+ * Constructs a new spinner with the given context, the supplied attribute
+ * set, default styles, popup mode (one of {@link #MODE_DIALOG} or
+ * {@link #MODE_DROPDOWN}), and the theme against which the popup should be
+ * inflated.
*
* @param context The context against which the view is inflated, which
* provides access to the current theme, resources, etc.
diff --git a/core/java/com/android/internal/content/PackageHelper.java b/core/java/com/android/internal/content/PackageHelper.java
index b04ddf4..de29a96 100644
--- a/core/java/com/android/internal/content/PackageHelper.java
+++ b/core/java/com/android/internal/content/PackageHelper.java
@@ -34,8 +34,10 @@
import android.os.storage.StorageResultCode;
import android.os.storage.StorageVolume;
import android.os.storage.VolumeInfo;
+import android.provider.Settings;
import android.util.ArraySet;
import android.util.Log;
+import android.util.Slog;
import libcore.io.IoUtils;
@@ -345,6 +347,8 @@
*/
public static String resolveInstallVolume(Context context, String packageName,
int installLocation, long sizeBytes) throws IOException {
+ final boolean forceAllowOnExternal = Settings.Global.getInt(
+ context.getContentResolver(), Settings.Global.FORCE_ALLOW_ON_EXTERNAL, 0) != 0;
// TODO: handle existing apps installed in ASEC; currently assumes
// they'll end up back on internal storage
ApplicationInfo existingInfo = null;
@@ -379,7 +383,8 @@
}
// If app expresses strong desire for internal space, honor it
- if (installLocation == PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY) {
+ if (!forceAllowOnExternal
+ && installLocation == PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY) {
if (fitsOnInternal) {
return null;
} else {
diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java
index 1068b51..6c37282 100644
--- a/core/java/com/android/internal/policy/PhoneWindow.java
+++ b/core/java/com/android/internal/policy/PhoneWindow.java
@@ -2925,13 +2925,18 @@
mLastHasRightStableInset = hasRightStableInset;
}
- updateColorViewInt(mStatusColorViewState, sysUiVisibility, mStatusBarColor,
- mLastTopInset, false /* matchVertical */, animate && !disallowAnimate);
-
boolean navBarToRightEdge = mLastBottomInset == 0 && mLastRightInset > 0;
int navBarSize = navBarToRightEdge ? mLastRightInset : mLastBottomInset;
updateColorViewInt(mNavigationColorViewState, sysUiVisibility, mNavigationBarColor,
- navBarSize, navBarToRightEdge, animate && !disallowAnimate);
+ navBarSize, navBarToRightEdge, 0 /* rightInset */,
+ animate && !disallowAnimate);
+
+ boolean statusBarNeedsRightInset = navBarToRightEdge
+ && mNavigationColorViewState.present;
+ int statusBarRightInset = statusBarNeedsRightInset ? mLastRightInset : 0;
+ updateColorViewInt(mStatusColorViewState, sysUiVisibility, mStatusBarColor,
+ mLastTopInset, false /* matchVertical */, statusBarRightInset,
+ animate && !disallowAnimate);
}
// When we expand the window with FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS, we still need
@@ -2984,15 +2989,17 @@
* @param size the current size in the non-parent-matching dimension.
* @param verticalBar if true the view is attached to a vertical edge, otherwise to a
* horizontal edge,
+ * @param rightMargin rightMargin for the color view.
* @param animate if true, the change will be animated.
*/
private void updateColorViewInt(final ColorViewState state, int sysUiVis, int color,
- int size, boolean verticalBar, boolean animate) {
- boolean show = size > 0 && (sysUiVis & state.systemUiHideFlag) == 0
+ int size, boolean verticalBar, int rightMargin, boolean animate) {
+ state.present = size > 0 && (sysUiVis & state.systemUiHideFlag) == 0
&& (getAttributes().flags & state.hideWindowFlag) == 0
- && (getAttributes().flags & state.translucentFlag) == 0
- && (color & Color.BLACK) != 0
&& (getAttributes().flags & FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) != 0;
+ boolean show = state.present
+ && (color & Color.BLACK) != 0
+ && (getAttributes().flags & state.translucentFlag) == 0;
boolean visibilityChanged = false;
View view = state.view;
@@ -3011,7 +3018,10 @@
view.setVisibility(INVISIBLE);
state.targetVisibility = VISIBLE;
- addView(view, new LayoutParams(resolvedWidth, resolvedHeight, resolvedGravity));
+ LayoutParams lp = new LayoutParams(resolvedWidth, resolvedHeight,
+ resolvedGravity);
+ lp.rightMargin = rightMargin;
+ addView(view, lp);
updateColorViewTranslations();
}
} else {
@@ -3021,10 +3031,11 @@
if (show) {
LayoutParams lp = (LayoutParams) view.getLayoutParams();
if (lp.height != resolvedHeight || lp.width != resolvedWidth
- || lp.gravity != resolvedGravity) {
+ || lp.gravity != resolvedGravity || lp.rightMargin != rightMargin) {
lp.height = resolvedHeight;
lp.width = resolvedWidth;
lp.gravity = resolvedGravity;
+ lp.rightMargin = rightMargin;
view.setLayoutParams(lp);
}
view.setBackgroundColor(color);
@@ -5108,6 +5119,7 @@
private static class ColorViewState {
View view = null;
int targetVisibility = View.INVISIBLE;
+ boolean present = false;
final int id;
final int systemUiHideFlag;
diff --git a/core/java/com/android/internal/view/FloatingActionMode.java b/core/java/com/android/internal/view/FloatingActionMode.java
index 41628d0..9761661 100644
--- a/core/java/com/android/internal/view/FloatingActionMode.java
+++ b/core/java/com/android/internal/view/FloatingActionMode.java
@@ -194,8 +194,16 @@
mContext.getResources().getDisplayMetrics().widthPixels,
mContext.getResources().getDisplayMetrics().heightPixels);
- return Rect.intersects(mContentRectOnScreen, mScreenRect)
- && Rect.intersects(mContentRectOnScreen, mViewRectOnScreen);
+ return intersectsClosed(mContentRectOnScreen, mScreenRect)
+ && intersectsClosed(mContentRectOnScreen, mViewRectOnScreen);
+ }
+
+ /*
+ * Same as Rect.intersects, but includes cases where the rectangles touch.
+ */
+ private static boolean intersectsClosed(Rect a, Rect b) {
+ return a.left <= b.right && b.left <= a.right
+ && a.top <= b.bottom && b.top <= a.bottom;
}
@Override
diff --git a/core/java/com/android/internal/widget/ExploreByTouchHelper.java b/core/java/com/android/internal/widget/ExploreByTouchHelper.java
index bdf17fc..4a23df8 100644
--- a/core/java/com/android/internal/widget/ExploreByTouchHelper.java
+++ b/core/java/com/android/internal/widget/ExploreByTouchHelper.java
@@ -20,7 +20,6 @@
import android.graphics.Rect;
import android.os.Bundle;
import android.util.IntArray;
-import android.view.accessibility.*;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewParent;
@@ -50,6 +49,9 @@
/** Virtual node identifier value for invalid nodes. */
public static final int INVALID_ID = Integer.MIN_VALUE;
+ /** Virtual node identifier value for the host view's node. */
+ public static final int HOST_ID = View.NO_ID;
+
/** Default class name used for virtual views. */
private static final String DEFAULT_CLASS_NAME = View.class.getName();
@@ -195,7 +197,7 @@
* parent view.
*/
public void invalidateRoot() {
- invalidateVirtualView(View.NO_ID);
+ invalidateVirtualView(HOST_ID, AccessibilityEvent.CONTENT_CHANGE_TYPE_SUBTREE);
}
/**
@@ -205,10 +207,43 @@
* You <b>must</b> call this method after changing any of the properties set
* in {@link #onPopulateNodeForVirtualView}.
*
- * @param virtualViewId The virtual view id to invalidate.
+ * @param virtualViewId The virtual view id to invalidate, or
+ * {@link #HOST_ID} to invalidate the root view.
+ * @see #invalidateVirtualView(int, int)
*/
public void invalidateVirtualView(int virtualViewId) {
- sendEventForVirtualView(virtualViewId, AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
+ invalidateVirtualView(virtualViewId,
+ AccessibilityEvent.CONTENT_CHANGE_TYPE_UNDEFINED);
+ }
+
+ /**
+ * Notifies the accessibility framework that the properties of a particular
+ * item have changed.
+ * <p>
+ * You <b>must</b> call this method after changing any of the properties set
+ * in {@link #onPopulateNodeForVirtualView}.
+ *
+ * @param virtualViewId The virtual view id to invalidate, or
+ * {@link #HOST_ID} to invalidate the root view.
+ * @param changeTypes The bit mask of change types. May be {@code 0} for the
+ * default (undefined) change type or one or more of:
+ * <ul>
+ * <li>{@link AccessibilityEvent#CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION}
+ * <li>{@link AccessibilityEvent#CONTENT_CHANGE_TYPE_SUBTREE}
+ * <li>{@link AccessibilityEvent#CONTENT_CHANGE_TYPE_TEXT}
+ * <li>{@link AccessibilityEvent#CONTENT_CHANGE_TYPE_UNDEFINED}
+ * </ul>
+ */
+ public void invalidateVirtualView(int virtualViewId, int changeTypes) {
+ if (virtualViewId != INVALID_ID && mManager.isEnabled()) {
+ final ViewParent parent = mView.getParent();
+ if (parent != null) {
+ final AccessibilityEvent event = createEvent(virtualViewId,
+ AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
+ event.setContentChangeTypes(changeTypes);
+ parent.requestSendAccessibilityEvent(mView, event);
+ }
+ }
}
/**
@@ -245,7 +280,7 @@
/**
* Constructs and returns an {@link AccessibilityEvent} for the specified
- * virtual view id, which includes the host view ({@link View#NO_ID}).
+ * virtual view id, which includes the host view ({@link #HOST_ID}).
*
* @param virtualViewId The virtual view id for the item for which to
* construct an event.
@@ -255,7 +290,7 @@
*/
private AccessibilityEvent createEvent(int virtualViewId, int eventType) {
switch (virtualViewId) {
- case View.NO_ID:
+ case HOST_ID:
return createEventForHost(eventType);
default:
return createEventForChild(virtualViewId, eventType);
@@ -309,7 +344,7 @@
/**
* Constructs and returns an {@link android.view.accessibility.AccessibilityNodeInfo} for the
* specified virtual view id, which includes the host view
- * ({@link View#NO_ID}).
+ * ({@link #HOST_ID}).
*
* @param virtualViewId The virtual view id for the item for which to
* construct a node.
@@ -318,7 +353,7 @@
*/
private AccessibilityNodeInfo createNode(int virtualViewId) {
switch (virtualViewId) {
- case View.NO_ID:
+ case HOST_ID:
return createNodeForHost();
default:
return createNodeForChild(virtualViewId);
@@ -457,7 +492,7 @@
private boolean performAction(int virtualViewId, int action, Bundle arguments) {
switch (virtualViewId) {
- case View.NO_ID:
+ case HOST_ID:
return performActionForHost(action, arguments);
default:
return performActionForChild(virtualViewId, action, arguments);
@@ -646,7 +681,7 @@
* <li>package name, set to the package of the host view's
* {@link Context}, see {@link AccessibilityEvent#setPackageName}
* <li>event source, set to the host view and virtual view identifier,
- * see {@link AccessibilityRecord#setSource(View, int)}
+ * see {@link android.view.accessibility.AccessibilityRecord#setSource(View, int)}
* </ul>
*
* @param virtualViewId The virtual view id for the item for which to
diff --git a/core/res/res/color/control_nodisable_material.xml b/core/res/res/color/control_nodisable_material.xml
new file mode 100644
index 0000000..4a73e93
--- /dev/null
+++ b/core/res/res/color/control_nodisable_material.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="?attr/colorControlNormal" />
+</selector>
diff --git a/core/res/res/drawable/seekbar_thumb_material_anim.xml b/core/res/res/drawable/seekbar_thumb_material_anim.xml
index 9726e73..b1119cd 100644
--- a/core/res/res/drawable/seekbar_thumb_material_anim.xml
+++ b/core/res/res/drawable/seekbar_thumb_material_anim.xml
@@ -25,7 +25,7 @@
android:opticalInsetLeft="3dp"
android:opticalInsetRight="3dp">
<solid
- android:color="#ff000000" />
+ android:color="@color/white" />
<size
android:width="18dp"
android:height="18dp" />
diff --git a/core/res/res/drawable/seekbar_track_material.xml b/core/res/res/drawable/seekbar_track_material.xml
index 01eb243..e88a73f 100644
--- a/core/res/res/drawable/seekbar_track_material.xml
+++ b/core/res/res/drawable/seekbar_track_material.xml
@@ -18,7 +18,7 @@
<item android:id="@id/background"
android:gravity="center_vertical|fill_horizontal">
<shape android:shape="rectangle"
- android:tint="?attr/colorControlNormal">
+ android:tint="@color/control_nodisable_material">
<size android:height="@dimen/seekbar_track_background_height_material" />
<solid android:color="@color/white_disabled_material" />
</shape>
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 84161e0..a08f040 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Sien alle"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Kies aktiwiteit"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Deel met"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Stuur tans…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Begin webblaaier?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Aanvaar oproep?"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 40c56cf..5d94a69 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"ሁሉንም ተመልከት"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"እንቅስቃሴ ምረጥ"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"ተጋራ ከ"</string>
- <string name="list_delimeter" msgid="3975117572185494152">"፣ "</string>
<string name="sending" msgid="3245653681008218030">"በመላክ ላይ…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"ማሰሺያን አስነሳ?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"ጥሪ ተቀበል?"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 8e4ffa5..209e1dc 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -1260,7 +1260,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"عرض الكل"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"اختيار نشاط"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"مشاركة مع"</string>
- <string name="list_delimeter" msgid="3975117572185494152">"، "</string>
<string name="sending" msgid="3245653681008218030">"جارٍ الإرسال..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"تشغيل المتصفح؟"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"هل تريد قبول المكالمة؟"</string>
diff --git a/core/res/res/values-az-rAZ/strings.xml b/core/res/res/values-az-rAZ/strings.xml
index 868849d..16d123b 100644
--- a/core/res/res/values-az-rAZ/strings.xml
+++ b/core/res/res/values-az-rAZ/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Hamısını seçın"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Fəaliyyəti seçin"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Bununla paylaşın"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Göndərilir..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Brauzer işə salınsın?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Zəngi qəbul edək?"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 110e677..5427659 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Вижте всички"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Избор на активност"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Споделяне със:"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Изпраща се..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Да се стартира ли браузърът?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Да се приеме ли обаждането?"</string>
diff --git a/core/res/res/values-bn-rBD/strings.xml b/core/res/res/values-bn-rBD/strings.xml
index fea800e..dde02d5 100644
--- a/core/res/res/values-bn-rBD/strings.xml
+++ b/core/res/res/values-bn-rBD/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"সবগুলো দেখুন"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"কার্যকলাপ চয়ন করুন"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"এর সাথে ভাগ করুন"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"পাঠানো হচ্ছে..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"ব্রাউজার লঞ্চ করতে চান?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"কল গ্রহণ করবেন?"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 34fb95e..38baab2 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Mostra-les totes"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Selecció de l\'activitat"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Comparteix amb"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"S\'està enviant…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Vols iniciar el navegador?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Vols acceptar la trucada?"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 3bebb9a..cd6bb4b 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -1244,7 +1244,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Zobrazit vše"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Vybrat aktivitu"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Sdílet s"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Odesílání..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Spustit prohlížeč?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Přijmout hovor?"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 9973585..e718935 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Se alle"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Vælg aktivitet"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Del med"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Sender..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Vil du starte browseren?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Vil du besvare opkaldet?"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 40519be..fcbd762 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Alle anzeigen"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Aktivität wählen"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Teilen mit"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Wird gesendet..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Browser starten?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Anruf annehmen?"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index e4b8aa4..f2bb1d5 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Εμφάνιση όλων"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Επιλογή δραστηριότητας"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Κοινή χρήση με"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Γίνεται αποστολή…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Εκκίνηση προγράμματος περιήγησης;"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Αποδοχή κλήσης;"</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 8062057..28d8eb4 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"See all"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Choose activity"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Share with"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Sending…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Launch Browser?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Accept call?"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 8062057..28d8eb4 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"See all"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Choose activity"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Share with"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Sending…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Launch Browser?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Accept call?"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 8062057..28d8eb4 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"See all"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Choose activity"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Share with"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Sending…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Launch Browser?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Accept call?"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index bfd1570..5782eab 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -629,7 +629,7 @@
<string name="relationTypeFriend" msgid="7313106762483391262">"Amigo"</string>
<string name="relationTypeManager" msgid="6365677861610137895">"Supervisor"</string>
<string name="relationTypeMother" msgid="4578571352962758304">"Madre"</string>
- <string name="relationTypeParent" msgid="4755635567562925226">"Padre"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"Padre/madre"</string>
<string name="relationTypePartner" msgid="7266490285120262781">"Socio"</string>
<string name="relationTypeReferredBy" msgid="101573059844135524">"Recomendado por"</string>
<string name="relationTypeRelative" msgid="1799819930085610271">"Pariente"</string>
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Ver todas"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Elige actividad"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Compartir con"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Enviando..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"¿Deseas iniciar el navegador?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"¿Aceptar la llamada?"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index b784cb3..9b65882 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Ver todo"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Seleccionar actividad"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Compartir con"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Enviando..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"¿Iniciar el navegador?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"¿Aceptar la llamada?"</string>
diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml
index 9a6924c..98818ad 100644
--- a/core/res/res/values-et-rEE/strings.xml
+++ b/core/res/res/values-et-rEE/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Kuva kõik"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Tegevuse valimine"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Jagamine rakendusega:"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Saatmine ..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Kas käivitada brauser?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Kas vastata kõnele?"</string>
diff --git a/core/res/res/values-eu-rES/strings.xml b/core/res/res/values-eu-rES/strings.xml
index 5ec09f9..2c7a64d 100644
--- a/core/res/res/values-eu-rES/strings.xml
+++ b/core/res/res/values-eu-rES/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Ikusi guztiak"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Aukeratu jarduera"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Partekatu hauekin:"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Bidaltzen…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Arakatzailea abiarazi nahi duzu?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Deia onartu nahi duzu?"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 586e25d..6422355 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"مشاهدهٔ همه"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"انتخاب فعالیت"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"اشتراکگذاری با"</string>
- <string name="list_delimeter" msgid="3975117572185494152">"، "</string>
<string name="sending" msgid="3245653681008218030">"در حال ارسال..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"مرورگر راهاندازی شود؟"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"تماس را میپذیرید؟"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 567c3ea..7298cba 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Näytä kaikki"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Valitse toiminto"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Jaa seuraavien kanssa"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Lähetetään…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Käynnistetäänkö selain?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Vastataanko puheluun?"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 36e406e..ba17051 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Tout afficher"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Sélectionnez une activité"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Partagez avec"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Envoi…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Lancer le navigateur?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Prendre l\'appel?"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index f2e0fa6..2510e03 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Tout afficher"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Sélectionnez une activité"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Partager avec"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Envoi en cours…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Lancer le navigateur ?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Prendre l\'appel ?"</string>
diff --git a/core/res/res/values-gl-rES/strings.xml b/core/res/res/values-gl-rES/strings.xml
index ce68d3e..9979d0f 100644
--- a/core/res/res/values-gl-rES/strings.xml
+++ b/core/res/res/values-gl-rES/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Ver todas"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Seleccionar actividade"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Compartir con"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Enviando..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Iniciar o navegador?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Aceptar chamada?"</string>
diff --git a/core/res/res/values-gu-rIN/strings.xml b/core/res/res/values-gu-rIN/strings.xml
index 638bf02..9392997 100644
--- a/core/res/res/values-gu-rIN/strings.xml
+++ b/core/res/res/values-gu-rIN/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"બધું જુઓ"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"પ્રવૃત્તિ પસંદ કરો"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"આની સાથે શેર કરો"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"મોકલી રહ્યાં છે…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"બ્રાઉઝર લોન્ચ કરીએ?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"કૉલ સ્વીકારીએ?"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index cfe2279..96eb95c 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"सभी देखें"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"गतिविधि चुनें"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"इसके साथ साझा करें:"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"भेजा जा रहा है…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"ब्राउज़र लॉन्च करें?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"कॉल स्वीकार करें?"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index febe600..9b741bc 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -1236,7 +1236,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Prikaži sve"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Odabir aktivnosti"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Dijeljenje s"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Slanje..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Pokrenuti preglednik?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Prihvatiti poziv?"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index e393a4a..b063f0c 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Összes megtekintése"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Tevékenység kiválasztása"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Megosztás"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Küldés…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Böngésző indítása?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Fogadja a hívást?"</string>
diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml
index 6d07aa4..a295306 100644
--- a/core/res/res/values-hy-rAM/strings.xml
+++ b/core/res/res/values-hy-rAM/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Տեսնել բոլորը"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Ընտրել գործունեությունը"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Տարածել"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Ուղարկվում է..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Գործարկե՞լ զննարկիչը:"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Ընդունե՞լ զանգը:"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index e93c91e4..27f26a2 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Lihat semua"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Pilih kegiatan"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Berbagi dengan"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Mengirim..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Luncurkan Browser?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Terima panggilan?"</string>
diff --git a/core/res/res/values-is-rIS/strings.xml b/core/res/res/values-is-rIS/strings.xml
index fdfdd72..c09914b 100644
--- a/core/res/res/values-is-rIS/strings.xml
+++ b/core/res/res/values-is-rIS/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Sjá allt"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Veldu aðgerð"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Deila með"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Sendir…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Opna vafra?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Samþykkja símtal?"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 7312f2b..4271287 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Mostra tutto"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Scegli attività"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Condividi con"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Invio..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Avviare l\'applicazione Browser?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Accettare la chiamata?"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index ab9a635..a56332c 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -1244,7 +1244,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"הצג הכל"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"בחר פעילות"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"שתף עם"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"שולח…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"להפעיל את הדפדפן?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"האם לקבל את השיחה?"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 67dc9de..2bb0972 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"すべて表示"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"操作の選択"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"共有"</string>
- <string name="list_delimeter" msgid="3975117572185494152">"、 "</string>
<string name="sending" msgid="3245653681008218030">"送信中..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"ブラウザを起動しますか?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"通話を受けますか?"</string>
diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml
index 40d91b4..df302f5 100644
--- a/core/res/res/values-ka-rGE/strings.xml
+++ b/core/res/res/values-ka-rGE/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"ყველას ნახვა"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"აქტივობის არჩევა"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"გაზიარება"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"იგზავნება..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"გსურთ ბრაუზერის გაშვება?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"უპასუხებთ ზარს?"</string>
diff --git a/core/res/res/values-kk-rKZ/strings.xml b/core/res/res/values-kk-rKZ/strings.xml
index 8d9e643f..d39ee05 100644
--- a/core/res/res/values-kk-rKZ/strings.xml
+++ b/core/res/res/values-kk-rKZ/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Барлығын көру"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Әрекет таңдау"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Бөлісу"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Жіберілуде..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Браузер қосылсын ба?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Қоңырауды қабылдау?"</string>
diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml
index 23d16d6..3a02e76 100644
--- a/core/res/res/values-km-rKH/strings.xml
+++ b/core/res/res/values-km-rKH/strings.xml
@@ -1230,7 +1230,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"មើលទាំងអស់"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"ជ្រើសសកម្មភាព"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"ចែករំលែកជាមួយ"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"កំពុងផ្ញើ..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"ចាប់ផ្ដើមកម្មវិធីអ៊ីនធឺណិត?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"ទទួលការហៅ?"</string>
diff --git a/core/res/res/values-kn-rIN/strings.xml b/core/res/res/values-kn-rIN/strings.xml
index 9fbd533..0e98430 100644
--- a/core/res/res/values-kn-rIN/strings.xml
+++ b/core/res/res/values-kn-rIN/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"ಎಲ್ಲವನ್ನೂ ನೋಡಿ"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"ಚಟುವಟಿಕೆಯನ್ನು ಆರಿಸಿ"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"ಹಂಚಿಕೊಳ್ಳಿ"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"ಕಳುಹಿಸಲಾಗುತ್ತಿದೆ..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"ಬ್ರೌಸರ್ ಪ್ರಾರಂಭಿಸುವುದೇ?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"ಕರೆ ಸ್ವೀಕರಿಸುವುದೇ?"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 353d6bb..1844214 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"전체 보기"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"작업 선택"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"공유 대상"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"전송 중..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"브라우저를 실행하시겠습니까?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"통화를 수락하시겠습니까?"</string>
diff --git a/core/res/res/values-ky-rKG/strings.xml b/core/res/res/values-ky-rKG/strings.xml
index aebe1c6..e7e43f0 100644
--- a/core/res/res/values-ky-rKG/strings.xml
+++ b/core/res/res/values-ky-rKG/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Бардыгын көрүү"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Аракетти тандаңыз"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Төмөнкү менен бөлүшүү"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Жөнөтүлүүдө…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Серепчи иштетилсинби?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Чалуу кабыл алынсынбы?"</string>
diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml
index 051833f..2e58b116 100644
--- a/core/res/res/values-lo-rLA/strings.xml
+++ b/core/res/res/values-lo-rLA/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"ເບິ່ງທັງຫມົດ"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"ເລືອກກິດຈະກຳ"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"ແບ່ງປັນກັບ"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"ກຳລັງສົ່ງ..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"ເປີດໂປຣແກຣມທ່ອງເວັບ?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"ຮັບການໂທບໍ່?"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 7189c4b..eb2903f3 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -1244,7 +1244,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Žr. viską"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Pasirinkti veiklą"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Bendrinti su"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Siunčiama…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Paleisti naršyklę?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Priimti skambutį?"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 63ad122..7f10900 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -1236,7 +1236,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Skatīt visu"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Darbības izvēle"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Kopīgošana ar:"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Notiek sūtīšana…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Vai palaist pārlūkprogrammu?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Vai atbildēt uz zvanu?"</string>
diff --git a/core/res/res/values-mk-rMK/strings.xml b/core/res/res/values-mk-rMK/strings.xml
index d818a9d..f10fb19 100644
--- a/core/res/res/values-mk-rMK/strings.xml
+++ b/core/res/res/values-mk-rMK/strings.xml
@@ -1230,7 +1230,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Види ги сите"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Избери активност"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Сподели со"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Се праќа..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Стартувај прелистувач?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Прифати повик?"</string>
diff --git a/core/res/res/values-ml-rIN/strings.xml b/core/res/res/values-ml-rIN/strings.xml
index dc4749f..43264a7 100644
--- a/core/res/res/values-ml-rIN/strings.xml
+++ b/core/res/res/values-ml-rIN/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"എല്ലാം കാണുക"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"പ്രവർത്തനം തിരഞ്ഞെടുക്കുക"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"ഇവരുമായി പങ്കിടുക"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"അയയ്ക്കുന്നു…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"ബ്രൗസർ സമാരംഭിക്കണോ?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"കോൾ സ്വീകരിക്കണോ?"</string>
diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml
index 4b568ec..3b5531d 100644
--- a/core/res/res/values-mn-rMN/strings.xml
+++ b/core/res/res/values-mn-rMN/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Бүгдийг харах"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Активити сонгох"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Хуваалцах"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Илгээж байна ..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Хөтөч ажиллуулах уу?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Дуудлагыг зөвшөөрөх үү?"</string>
diff --git a/core/res/res/values-mr-rIN/strings.xml b/core/res/res/values-mr-rIN/strings.xml
index 45e6358..5956634 100644
--- a/core/res/res/values-mr-rIN/strings.xml
+++ b/core/res/res/values-mr-rIN/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"सर्व पहा"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"क्रियाकलाप निवडा"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"यांच्यासह सामायिक करा"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"पाठवित आहे..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"ब्राउझर लाँच करायचा?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"कॉल स्वीकारायचा?"</string>
diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml
index dc30d38..b69010e 100644
--- a/core/res/res/values-ms-rMY/strings.xml
+++ b/core/res/res/values-ms-rMY/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Lihat semua"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Pilih aktiviti"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Kongsi dengan"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Menghantar…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Lancarkan Penyemak Imbas?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Terima panggilan?"</string>
diff --git a/core/res/res/values-my-rMM/strings.xml b/core/res/res/values-my-rMM/strings.xml
index 135605b..a547ca7 100644
--- a/core/res/res/values-my-rMM/strings.xml
+++ b/core/res/res/values-my-rMM/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"အားလုံးကို ကြည့်ရန်"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"လှုပ်ရှားမှုကို ရွေးရန်"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"...နှင့် မျှဝေရန်"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"ပေးပို့နေစဉ်…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"ဘရောက်ဇာ ဖွင့်မည်လား။"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"ဖုန်းခေါ်ဆိုမှုကို လက်ခံမလား?"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index ae43e25..b43314b 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Se alle"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Velg aktivitet"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Deling med"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Sender …"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Vil du starte nettleseren?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Vil du besvare anropet?"</string>
diff --git a/core/res/res/values-ne-rNP/strings.xml b/core/res/res/values-ne-rNP/strings.xml
index b0643ea..ac529114 100644
--- a/core/res/res/values-ne-rNP/strings.xml
+++ b/core/res/res/values-ne-rNP/strings.xml
@@ -1234,7 +1234,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"सबै हेर्नुहोस्"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"गतिविधि छनौट गर्नुहोस्"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"साझेदारी गर्नुहोस्..."</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"पठाउँदै..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"ब्राउजर सुरु गर्ने हो?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"कल स्वीकार गर्नुहुन्छ?"</string>
@@ -1501,7 +1500,7 @@
<string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB पेरिफेरल पोर्ट"</string>
<string name="floating_toolbar_open_overflow_description" msgid="4797287862999444631">"थप विकल्पहरू"</string>
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"ओभरफ्लो बन्द गर्नुहोस्"</string>
- <string name="maximize_button_text" msgid="7543285286182446254">"अधिकतम गर्नुहोस्"</string>
+ <string name="maximize_button_text" msgid="7543285286182446254">"ठूलो बनाउनुहोस्"</string>
<string name="close_button_text" msgid="3937902162644062866">"बन्द गर्नुहोस्"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> चयन गरियो</item>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 5be486a..cfdd69b 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Alles weergeven"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Een activiteit kiezen"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Delen met"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Verzenden..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Browser starten?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Oproep accepteren?"</string>
diff --git a/core/res/res/values-pa-rIN/strings.xml b/core/res/res/values-pa-rIN/strings.xml
index 7306582..e1276f1 100644
--- a/core/res/res/values-pa-rIN/strings.xml
+++ b/core/res/res/values-pa-rIN/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"ਸਭ ਦੇਖੋ"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"ਗਤੀਵਿਧੀ ਚੁਣੋ"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"ਇਸ ਨਾਲ ਸ਼ੇਅਰ ਕਰੋ"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"ਭੇਜ ਰਿਹਾ ਹੈ..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"ਕੀ ਬ੍ਰਾਊਜ਼ਰ ਲੌਂਚ ਕਰਨਾ ਹੈ?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"ਕੀ ਕਾਲ ਸਵੀਕਾਰ ਕਰਨੀ ਹੈ?"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index f220b25..1086601 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -1244,7 +1244,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Zobacz wszystkie"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Wybierz działanie"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Udostępnij przez:"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Wysyłanie..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Uruchomić przeglądarkę?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Odebrać połączenie?"</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index bd0c90c..d203a6a 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Ver tudo"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Selecione a atividade"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Compartilhar com"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Enviando..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Abrir Navegador?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Aceitar chamada?"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 7eb3809..e14303d 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Ver tudo"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Escolher atividade"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Partilhar com"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"A enviar..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Iniciar Navegador?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Aceitar chamada?"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index bd0c90c..d203a6a 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Ver tudo"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Selecione a atividade"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Compartilhar com"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Enviando..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Abrir Navegador?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Aceitar chamada?"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 515d23c..637ade49 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -1236,7 +1236,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Afişaţi-le pe toate"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Alegeţi activitatea"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Distribuiţi pentru"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Se trimite..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Lansaţi browserul?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Acceptați apelul?"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index c3e7411..e0ea9c0f0 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -1244,7 +1244,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Показать все"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Выберите"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Открыть доступ"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Отправка..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Запустить браузер?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Ответить?"</string>
diff --git a/core/res/res/values-si-rLK/strings.xml b/core/res/res/values-si-rLK/strings.xml
index c8fae8f..d5bafd25 100644
--- a/core/res/res/values-si-rLK/strings.xml
+++ b/core/res/res/values-si-rLK/strings.xml
@@ -1230,7 +1230,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"සියල්ල බලන්න"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"ක්රියාකාරකම තෝරන්න"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"සමඟ බෙදාගන්න"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"යවමින්..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"බ්රවුසරය දියත් කරන්නද?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"ඇමතුම පිළිගන්නවාද?"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index fc17568..8432348 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -1244,7 +1244,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Zobraziť všetky"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Vybrať aktivitu"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Zdieľať s"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Odosielanie..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Spustiť prehliadač?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Prijať hovor?"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 941f3a1..cf87e2a 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -1244,7 +1244,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Pokaži vse"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Izberite dejavnost"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Delite z"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Pošiljanje ..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Ali želite odpreti brskalnik?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Ali želite sprejeti klic?"</string>
diff --git a/core/res/res/values-sq-rAL/strings.xml b/core/res/res/values-sq-rAL/strings.xml
index 65d4d19..86f9d11 100644
--- a/core/res/res/values-sq-rAL/strings.xml
+++ b/core/res/res/values-sq-rAL/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Shikoji të gjitha"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Zgjidh aktivitetin"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Shpërnda publikisht me"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Po dërgon…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Të hapet shfletuesi?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Dëshiron ta pranosh telefonatën?"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 0b5be6b..a3a4b32 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -1236,7 +1236,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Прикажи све"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Избор активности"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Дели са"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Слање..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Желите ли да покренете прегледач?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Желите ли да прихватите позив?"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index f5bd759..237afe7 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Visa alla"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Välj aktivitet"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Dela med"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Skickar ..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Vill du öppna webbläsaren?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Vill du ta emot samtal?"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index b34c115..6445f6a 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -1230,7 +1230,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Angalia zote"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Chagua shughuli"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Shiriki na"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Inatuma…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Zindua Kivinjari?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Kubali simu?"</string>
diff --git a/core/res/res/values-ta-rIN/strings.xml b/core/res/res/values-ta-rIN/strings.xml
index 14d0c35..569fe82 100644
--- a/core/res/res/values-ta-rIN/strings.xml
+++ b/core/res/res/values-ta-rIN/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"எல்லாம் காட்டு"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"செயல்பாட்டைத் தேர்வுசெய்க"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"இதனுடன் பகிர்"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"அனுப்புகிறது…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"உலாவியைத் துவக்கவா?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"அழைப்பை ஏற்கவா?"</string>
diff --git a/core/res/res/values-te-rIN/strings.xml b/core/res/res/values-te-rIN/strings.xml
index d15148c..77588b3 100644
--- a/core/res/res/values-te-rIN/strings.xml
+++ b/core/res/res/values-te-rIN/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"అన్నీ చూడండి"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"కార్యాచరణను ఎంచుకోండి"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"వీటితో భాగస్వామ్యం చేయండి"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"పంపుతోంది..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"బ్రౌజర్ను ప్రారంభించాలా?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"కాల్ను ఆమోదించాలా?"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 78d1c2e..9804f99 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"ดูทั้งหมด"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"เลือกกิจกรรม"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"แชร์กับ"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"กำลังส่ง…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"เปิดเบราว์เซอร์หรือไม่"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"รับสายหรือไม่"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index b8a82eb..78c9358c 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Tingnan lahat"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Pumili ng aktibidad"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Ibahagi sa"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Ipinapadala..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Ilunsad ang Browser?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Tanggapin ang tawag?"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 8140caf..37d9bac 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Tümünü göster"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Etkinlik seçin"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Şununla paylaş:"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Gönderiliyor…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Tarayıcı Başlatılsın mı?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Çağrı kabul edilsin mi?"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index d3b6500..1aa1a51 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -1244,7 +1244,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Переглянути всі"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Вибрати дію"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Спільний доступ для:"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Надсилання…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Запустити веб-переглядач?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Прийняти виклик?"</string>
diff --git a/core/res/res/values-ur-rPK/strings.xml b/core/res/res/values-ur-rPK/strings.xml
index 21e9e03..aa46949 100644
--- a/core/res/res/values-ur-rPK/strings.xml
+++ b/core/res/res/values-ur-rPK/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"سبھی دیکھیں"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"سرگرمی منتخب کریں"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"اس کے ساتھ اشتراک کریں"</string>
- <string name="list_delimeter" msgid="3975117572185494152">"، "</string>
<string name="sending" msgid="3245653681008218030">"بھیج رہا ہے…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"براؤزر شروع کریں؟"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"کال قبول کریں؟"</string>
diff --git a/core/res/res/values-uz-rUZ/strings.xml b/core/res/res/values-uz-rUZ/strings.xml
index 68a5d9d..492f3d7 100644
--- a/core/res/res/values-uz-rUZ/strings.xml
+++ b/core/res/res/values-uz-rUZ/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Barchasini ko‘rish"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Harakat turini tanlang"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Ulashish"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Jo‘natilmoqda…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Brauzer ishga tushirilsinmi?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Qo‘ng‘iroqni qabul qilasizmi?"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 886bbec..439b9f2 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Xem tất cả"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Chọn hoạt động"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Chia sẻ với"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Đang gửi…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Chạy trình duyệt?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Chấp nhận cuộc gọi?"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index dc44593..c13ef14 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"查看全部"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"选择活动"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"分享方式"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"正在发送..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"要启动浏览器吗?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"要接听电话吗?"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index cfeb274..4c713c9 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"查看全部"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"選擇活動"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"分享活動"</string>
- <string name="list_delimeter" msgid="3975117572185494152">"、 "</string>
<string name="sending" msgid="3245653681008218030">"正在傳送..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"要啟動「瀏覽器」嗎?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"接聽電話嗎?"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 1ac240f..46f0d2c 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"全部顯示"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"選擇活動"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"分享活動"</string>
- <string name="list_delimeter" msgid="3975117572185494152">"、 "</string>
<string name="sending" msgid="3245653681008218030">"傳送中…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"啟動「瀏覽器」嗎?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"接聽電話嗎?"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index e8c7ca3..0ecd571 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -1228,7 +1228,6 @@
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Buka konke"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Khetha okwenziwayo"</string>
<string name="share_action_provider_share_with" msgid="5247684435979149216">"Yabelana no"</string>
- <string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Iyathumela..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Qala Isiphequluli?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Amukela ucingo?"</string>
diff --git a/graphics/java/android/graphics/Color.java b/graphics/java/android/graphics/Color.java
index 666dbd8..2e3eec5 100644
--- a/graphics/java/android/graphics/Color.java
+++ b/graphics/java/android/graphics/Color.java
@@ -54,7 +54,6 @@
* Return the alpha component of a color int. This is the same as saying
* color >>> 24
*/
- @ColorInt
public static int alpha(int color) {
return color >>> 24;
}
@@ -63,7 +62,6 @@
* Return the red component of a color int. This is the same as saying
* (color >> 16) & 0xFF
*/
- @ColorInt
public static int red(int color) {
return (color >> 16) & 0xFF;
}
@@ -72,7 +70,6 @@
* Return the green component of a color int. This is the same as saying
* (color >> 8) & 0xFF
*/
- @ColorInt
public static int green(int color) {
return (color >> 8) & 0xFF;
}
@@ -81,7 +78,6 @@
* Return the blue component of a color int. This is the same as saying
* color & 0xFF
*/
- @ColorInt
public static int blue(int color) {
return color & 0xFF;
}
@@ -236,89 +232,6 @@
}
/**
- * Convert HSB components to an ARGB color. Alpha set to 0xFF.
- * hsv[0] is Hue [0 .. 1)
- * hsv[1] is Saturation [0...1]
- * hsv[2] is Value [0...1]
- * If hsv values are out of range, they are pinned.
- * @param hsb 3 element array which holds the input HSB components.
- * @return the resulting argb color
- *
- * @hide Pending API council
- */
- @ColorInt
- public static int HSBtoColor(@Size(3) float[] hsb) {
- return HSBtoColor(hsb[0], hsb[1], hsb[2]);
- }
-
- /**
- * Convert HSB components to an ARGB color. Alpha set to 0xFF.
- * hsv[0] is Hue [0 .. 1)
- * hsv[1] is Saturation [0...1]
- * hsv[2] is Value [0...1]
- * If hsv values are out of range, they are pinned.
- * @param h Hue component
- * @param s Saturation component
- * @param b Brightness component
- * @return the resulting argb color
- *
- * @hide Pending API council
- */
- @ColorInt
- public static int HSBtoColor(float h, float s, float b) {
- h = MathUtils.constrain(h, 0.0f, 1.0f);
- s = MathUtils.constrain(s, 0.0f, 1.0f);
- b = MathUtils.constrain(b, 0.0f, 1.0f);
-
- float red = 0.0f;
- float green = 0.0f;
- float blue = 0.0f;
-
- final float hf = (h - (int) h) * 6.0f;
- final int ihf = (int) hf;
- final float f = hf - ihf;
- final float pv = b * (1.0f - s);
- final float qv = b * (1.0f - s * f);
- final float tv = b * (1.0f - s * (1.0f - f));
-
- switch (ihf) {
- case 0: // Red is the dominant color
- red = b;
- green = tv;
- blue = pv;
- break;
- case 1: // Green is the dominant color
- red = qv;
- green = b;
- blue = pv;
- break;
- case 2:
- red = pv;
- green = b;
- blue = tv;
- break;
- case 3: // Blue is the dominant color
- red = pv;
- green = qv;
- blue = b;
- break;
- case 4:
- red = tv;
- green = pv;
- blue = b;
- break;
- case 5: // Red is the dominant color
- red = b;
- green = pv;
- blue = qv;
- break;
- }
-
- return 0xFF000000 | (((int) (red * 255.0f)) << 16) |
- (((int) (green * 255.0f)) << 8) | ((int) (blue * 255.0f));
- }
-
- /**
* Convert RGB components to HSV.
* hsv[0] is Hue [0 .. 360)
* hsv[1] is Saturation [0...1]
diff --git a/libs/androidfw/AssetManager.cpp b/libs/androidfw/AssetManager.cpp
index 1c39ffe..623ea89 100644
--- a/libs/androidfw/AssetManager.cpp
+++ b/libs/androidfw/AssetManager.cpp
@@ -34,7 +34,7 @@
#include <utils/String8.h>
#include <utils/threads.h>
#include <utils/Timers.h>
-#ifdef HAVE_ANDROID_OS
+#ifdef __ANDROID__
#include <cutils/trace.h>
#endif
@@ -54,7 +54,7 @@
_rc; })
#endif
-#ifdef HAVE_ANDROID_OS
+#ifdef __ANDROID__
#define MY_TRACE_BEGIN(x) ATRACE_BEGIN(x)
#define MY_TRACE_END() ATRACE_END()
#else
@@ -229,7 +229,7 @@
*cookie = static_cast<int32_t>(mAssetPaths.size());
}
-#ifdef HAVE_ANDROID_OS
+#ifdef __ANDROID__
// Load overlays, if any
asset_path oap;
for (size_t idx = 0; mZipSet.getOverlay(ap.path, idx, &oap); idx++) {
@@ -657,7 +657,7 @@
ALOGV("Creating shared resources for %s", ap.path.string());
sharedRes = new ResTable();
sharedRes->add(ass, idmap, nextEntryIdx + 1, false);
-#ifdef HAVE_ANDROID_OS
+#ifdef __ANDROID__
const char* data = getenv("ANDROID_DATA");
LOG_ALWAYS_FATAL_IF(data == NULL, "ANDROID_DATA not set");
String8 overlaysListPath(data);
diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp
index 9e04964..37de89a 100644
--- a/libs/androidfw/ResourceTypes.cpp
+++ b/libs/androidfw/ResourceTypes.cpp
@@ -727,7 +727,7 @@
AutoMutex lock(mDecodeLock);
if (mCache == NULL) {
-#ifndef HAVE_ANDROID_OS
+#ifndef __ANDROID__
if (kDebugStringPoolNoisy) {
ALOGI("CREATING STRING CACHE OF %zu bytes",
mHeader->stringCount*sizeof(char16_t**));
diff --git a/libs/hwui/DamageAccumulator.cpp b/libs/hwui/DamageAccumulator.cpp
index 9bd3bdc..c2e14a2 100644
--- a/libs/hwui/DamageAccumulator.cpp
+++ b/libs/hwui/DamageAccumulator.cpp
@@ -121,7 +121,14 @@
static inline void mapRect(const Matrix4* matrix, const SkRect& in, SkRect* out) {
if (in.isEmpty()) return;
Rect temp(in);
- matrix->mapRect(temp);
+ if (CC_LIKELY(!matrix->isPerspective())) {
+ matrix->mapRect(temp);
+ } else {
+ // Don't attempt to calculate damage for a perspective transform
+ // as the numbers this works with can break the perspective
+ // calculations. Just give up and expand to DIRTY_MIN/DIRTY_MAX
+ temp.set(DIRTY_MIN, DIRTY_MIN, DIRTY_MAX, DIRTY_MAX);
+ }
out->join(RECT_ARGS(temp));
}
@@ -134,7 +141,14 @@
const SkMatrix* transform = props.getTransformMatrix();
SkRect temp(in);
if (transform && !transform->isIdentity()) {
- transform->mapRect(&temp);
+ if (CC_LIKELY(!transform->hasPerspective())) {
+ transform->mapRect(&temp);
+ } else {
+ // Don't attempt to calculate damage for a perspective transform
+ // as the numbers this works with can break the perspective
+ // calculations. Just give up and expand to DIRTY_MIN/DIRTY_MAX
+ temp.set(DIRTY_MIN, DIRTY_MIN, DIRTY_MAX, DIRTY_MAX);
+ }
}
temp.offset(props.getLeft(), props.getTop());
out->join(temp);
diff --git a/libs/hwui/DamageAccumulator.h b/libs/hwui/DamageAccumulator.h
index dd3365a..e44fc20 100644
--- a/libs/hwui/DamageAccumulator.h
+++ b/libs/hwui/DamageAccumulator.h
@@ -24,6 +24,11 @@
#include "utils/Macros.h"
+// Smaller than INT_MIN/INT_MAX because we offset these values
+// and thus don't want to be adding offsets to INT_MAX, that's bad
+#define DIRTY_MIN (-0x7ffffff-1)
+#define DIRTY_MAX (0x7ffffff)
+
namespace android {
namespace uirenderer {
diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp
index af8aaa20..6cf894e 100644
--- a/libs/hwui/RenderNode.cpp
+++ b/libs/hwui/RenderNode.cpp
@@ -134,7 +134,7 @@
} else {
// Hope this is big enough?
// TODO: Get this from the display list ops or something
- info.damageAccumulator->dirty(INT_MIN, INT_MIN, INT_MAX, INT_MAX);
+ info.damageAccumulator->dirty(DIRTY_MIN, DIRTY_MIN, DIRTY_MAX, DIRTY_MAX);
}
}
}
diff --git a/libs/hwui/unit_tests/DamageAccumulatorTests.cpp b/libs/hwui/unit_tests/DamageAccumulatorTests.cpp
index c8d6004..29354a7 100644
--- a/libs/hwui/unit_tests/DamageAccumulatorTests.cpp
+++ b/libs/hwui/unit_tests/DamageAccumulatorTests.cpp
@@ -18,6 +18,7 @@
#include <DamageAccumulator.h>
#include <Matrix.h>
+#include <RenderNode.h>
#include <utils/LinearAllocator.h>
#include <SkRect.h>
@@ -35,10 +36,12 @@
identity.loadIdentity();
da.pushTransform(&identity);
da.dirty(50, 50, 100, 100);
- da.pushTransform(&identity);
- da.peekAtDirty(&curDirty);
- ASSERT_EQ(SkRect(), curDirty);
- da.popTransform();
+ {
+ da.pushTransform(&identity);
+ da.peekAtDirty(&curDirty);
+ ASSERT_EQ(SkRect(), curDirty);
+ da.popTransform();
+ }
da.peekAtDirty(&curDirty);
ASSERT_EQ(SkRect::MakeLTRB(50, 50, 100, 100), curDirty);
da.popTransform();
@@ -69,13 +72,62 @@
SkRect curDirty;
identity.loadIdentity();
da.pushTransform(&identity);
- da.pushTransform(&identity);
- da.dirty(50, 50, 100, 100);
- da.popTransform();
- da.pushTransform(&identity);
- da.dirty(150, 50, 200, 125);
- da.popTransform();
+ {
+ da.pushTransform(&identity);
+ da.dirty(50, 50, 100, 100);
+ da.popTransform();
+ da.pushTransform(&identity);
+ da.dirty(150, 50, 200, 125);
+ da.popTransform();
+ }
da.popTransform();
da.finish(&curDirty);
ASSERT_EQ(SkRect::MakeLTRB(50, 50, 200, 125), curDirty);
}
+
+TEST(DamageAccumulator, basicRenderNode) {
+ DamageAccumulator da;
+ RenderNode node1;
+ node1.animatorProperties().setLeftTopRightBottom(50, 50, 500, 500);
+ node1.animatorProperties().updateMatrix();
+ da.pushTransform(&node1);
+ {
+ RenderNode node2;
+ node2.animatorProperties().setLeftTopRightBottom(50, 50, 100, 100);
+ node2.animatorProperties().updateMatrix();
+ da.pushTransform(&node2);
+ da.dirty(0, 0, 25, 25);
+ da.popTransform();
+ }
+ da.popTransform();
+ SkRect dirty;
+ da.finish(&dirty);
+ ASSERT_EQ(SkRect::MakeLTRB(100, 100, 125, 125), dirty);
+}
+
+TEST(DamageAccumulator, perspectiveTransform) {
+ DamageAccumulator da;
+ RenderNode node1;
+ node1.animatorProperties().setLeftTopRightBottom(50, 50, 500, 500);
+ node1.animatorProperties().setClipToBounds(true);
+ node1.animatorProperties().updateMatrix();
+ da.pushTransform(&node1);
+ {
+ RenderNode node2;
+ node2.animatorProperties().setLeftTopRightBottom(50, 50, 100, 100);
+ node2.animatorProperties().setClipToBounds(false);
+ node2.animatorProperties().setRotationX(1.0f);
+ node2.animatorProperties().setRotationY(1.0f);
+ node2.animatorProperties().setRotation(20.0f);
+ node2.animatorProperties().setCameraDistance(500.0f);
+ node2.animatorProperties().setTranslationZ(30.0f);
+ node2.animatorProperties().updateMatrix();
+ da.pushTransform(&node2);
+ da.dirty(DIRTY_MIN, DIRTY_MIN, DIRTY_MAX, DIRTY_MAX);
+ da.popTransform();
+ }
+ da.popTransform();
+ SkRect dirty;
+ da.finish(&dirty);
+ ASSERT_EQ(SkRect::MakeLTRB(50, 50, 500, 500), dirty);
+}
diff --git a/media/java/android/media/ImageReader.java b/media/java/android/media/ImageReader.java
index c97de5d..2164eec 100644
--- a/media/java/android/media/ImageReader.java
+++ b/media/java/android/media/ImageReader.java
@@ -679,17 +679,31 @@
@Override
public int getWidth() {
throwISEIfImageIsInvalid();
- mWidth = (getFormat() == ImageFormat.JPEG) ? ImageReader.this.getWidth() :
- nativeGetWidth(mFormat);
- return mWidth;
+ int width;
+ switch(getFormat()) {
+ case ImageFormat.JPEG:
+ case ImageFormat.DEPTH_POINT_CLOUD:
+ width = ImageReader.this.getWidth();
+ break;
+ default:
+ width = nativeGetWidth(mFormat);
+ }
+ return width;
}
@Override
public int getHeight() {
throwISEIfImageIsInvalid();
- mHeight = (getFormat() == ImageFormat.JPEG) ? ImageReader.this.getHeight() :
- nativeGetHeight(mFormat);
- return mHeight;
+ int height;
+ switch(getFormat()) {
+ case ImageFormat.JPEG:
+ case ImageFormat.DEPTH_POINT_CLOUD:
+ height = ImageReader.this.getHeight();
+ break;
+ default:
+ height = nativeGetHeight(mFormat);
+ }
+ return height;
}
@Override
@@ -826,8 +840,6 @@
private long mTimestamp;
private SurfacePlane[] mPlanes;
- private int mHeight = -1;
- private int mWidth = -1;
private int mFormat = ImageFormat.UNKNOWN;
// If this image is detached from the ImageReader.
private AtomicBoolean mIsDetached = new AtomicBoolean(false);
diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java
index bbd4c30..bc1aeda 100644
--- a/media/java/android/media/MediaPlayer.java
+++ b/media/java/android/media/MediaPlayer.java
@@ -2243,10 +2243,14 @@
final InputStream fIs = is;
final MediaFormat fFormat = format;
- // Ensure all input streams are closed. It is also a handy
- // way to implement timeouts in the future.
- synchronized(mOpenSubtitleSources) {
- mOpenSubtitleSources.add(is);
+ if (is != null) {
+ // Ensure all input streams are closed. It is also a handy
+ // way to implement timeouts in the future.
+ synchronized(mOpenSubtitleSources) {
+ mOpenSubtitleSources.add(is);
+ }
+ } else {
+ Log.w(TAG, "addSubtitleSource called with null InputStream");
}
// process each subtitle in its own thread
diff --git a/packages/Keyguard/res/values/strings.xml b/packages/Keyguard/res/values/strings.xml
index 41b1059..d1e84f5 100644
--- a/packages/Keyguard/res/values/strings.xml
+++ b/packages/Keyguard/res/values/strings.xml
@@ -316,6 +316,15 @@
<!-- An explanation text that the password needs to be entered since the device has just been restarted. [CHAR LIMIT=80] -->
<string name="kg_prompt_reason_restart_password">Password required when you restart device.</string>
+ <!-- An explanation text that the pattern needs to be solved since the user hasn't used strong authentication since quite some time. [CHAR LIMIT=80] -->
+ <string name="kg_prompt_reason_timeout_pattern">Pattern required for additional security.</string>
+
+ <!-- An explanation text that the pin needs to be entered since the user hasn't used strong authentication since quite some time. [CHAR LIMIT=80] -->
+ <string name="kg_prompt_reason_timeout_pin">PIN required for additional security.</string>
+
+ <!-- An explanation text that the password needs to be entered since the user hasn't used strong authentication since quite some time. [CHAR LIMIT=80] -->
+ <string name="kg_prompt_reason_timeout_password">Password required for additional security.</string>
+
<!-- An explanation text that the pattern needs to be solved since profiles have just been switched. [CHAR LIMIT=80] -->
<string name="kg_prompt_reason_switch_profiles_pattern">Pattern required when you switch profiles.</string>
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java
index 32892cf..ec2a173 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java
@@ -163,8 +163,9 @@
* Show a string explaining why the security view needs to be solved.
*
* @param reason a flag indicating which string should be shown, see
- * {@link KeyguardSecurityView#PROMPT_REASON_NONE}
- * and {@link KeyguardSecurityView#PROMPT_REASON_RESTART}
+ * {@link KeyguardSecurityView#PROMPT_REASON_NONE},
+ * {@link KeyguardSecurityView#PROMPT_REASON_RESTART} and
+ * {@link KeyguardSecurityView#PROMPT_REASON_TIMEOUT}.
*/
public void showPromptReason(int reason) {
mSecurityContainer.showPromptReason(reason);
@@ -213,9 +214,12 @@
/**
* Authentication has happened and it's time to dismiss keyguard. This function
* should clean up and inform KeyguardViewMediator.
+ *
+ * @param strongAuth whether the user has authenticated with strong authentication like
+ * pattern, password or PIN but not by trust agents or fingerprint
*/
@Override
- public void finish() {
+ public void finish(boolean strongAuth) {
// If there's a pending runnable because the user interacted with a widget
// and we're leaving keyguard, then run it.
boolean deferKeyguardDone = false;
@@ -226,9 +230,9 @@
}
if (mViewMediatorCallback != null) {
if (deferKeyguardDone) {
- mViewMediatorCallback.keyguardDonePending();
+ mViewMediatorCallback.keyguardDonePending(strongAuth);
} else {
- mViewMediatorCallback.keyguardDone(true);
+ mViewMediatorCallback.keyguardDone(strongAuth);
}
}
}
@@ -285,32 +289,6 @@
}
/**
- * Verify that the user can get past the keyguard securely. This is called,
- * for example, when the phone disables the keyguard but then wants to launch
- * something else that requires secure access.
- *
- * The result will be propogated back via {@link KeyguardViewCallback#keyguardDone(boolean)}
- */
- public void verifyUnlock() {
- SecurityMode securityMode = mSecurityContainer.getSecurityMode();
- if (securityMode == KeyguardSecurityModel.SecurityMode.None) {
- if (mViewMediatorCallback != null) {
- mViewMediatorCallback.keyguardDone(true);
- }
- } else if (securityMode != KeyguardSecurityModel.SecurityMode.Pattern
- && securityMode != KeyguardSecurityModel.SecurityMode.PIN
- && securityMode != KeyguardSecurityModel.SecurityMode.Password) {
- // can only verify unlock when in pattern/password mode
- if (mViewMediatorCallback != null) {
- mViewMediatorCallback.keyguardDone(false);
- }
- } else {
- // otherwise, go to the unlock screen, see if they can verify it
- mSecurityContainer.verifyUnlock();
- }
- }
-
- /**
* Called before this view is being removed.
*/
public void cleanUp() {
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardPasswordView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardPasswordView.java
index 2db87b3..3a7e6d0 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardPasswordView.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardPasswordView.java
@@ -115,6 +115,8 @@
switch (reason) {
case PROMPT_REASON_RESTART:
return R.string.kg_prompt_reason_restart_password;
+ case PROMPT_REASON_TIMEOUT:
+ return R.string.kg_prompt_reason_timeout_password;
default:
return 0;
}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java
index a96c79f..9a91ca4 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java
@@ -332,7 +332,12 @@
mSecurityMessageDisplay.setMessage(R.string.kg_prompt_reason_restart_pattern,
true /* important */);
break;
+ case PROMPT_REASON_TIMEOUT:
+ mSecurityMessageDisplay.setMessage(R.string.kg_prompt_reason_timeout_pattern,
+ true /* important */);
+ break;
default:
+ break;
}
}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardPinBasedInputView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardPinBasedInputView.java
index 07947b1..4cd4845 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardPinBasedInputView.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardPinBasedInputView.java
@@ -98,6 +98,8 @@
switch (reason) {
case PROMPT_REASON_RESTART:
return R.string.kg_prompt_reason_restart_pin;
+ case PROMPT_REASON_TIMEOUT:
+ return R.string.kg_prompt_reason_timeout_pin;
default:
return 0;
}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityContainer.java
index 8fc3cde..77215a7 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityContainer.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityContainer.java
@@ -54,7 +54,12 @@
public boolean dismiss(boolean authenticated);
public void userActivity();
public void onSecurityModeChanged(SecurityMode securityMode, boolean needsInput);
- public void finish();
+
+ /**
+ * @param strongAuth wheher the user has authenticated with strong authentication like
+ * pattern, password or PIN but not by trust agents or fingerprint
+ */
+ public void finish(boolean strongAuth);
public void reset();
}
@@ -282,7 +287,7 @@
showWipeDialog(failedAttempts, userType);
}
}
- monitor.reportFailedUnlockAttempt();
+ monitor.reportFailedStrongAuthUnlockAttempt();
mLockPatternUtils.reportFailedPasswordAttempt(KeyguardUpdateMonitor.getCurrentUser());
if (timeoutMs > 0) {
showTimeoutDialog(timeoutMs);
@@ -308,6 +313,7 @@
boolean showNextSecurityScreenOrFinish(boolean authenticated) {
if (DEBUG) Log.d(TAG, "showNextSecurityScreenOrFinish(" + authenticated + ")");
boolean finish = false;
+ boolean strongAuth = false;
if (mUpdateMonitor.getUserCanSkipBouncer(
KeyguardUpdateMonitor.getCurrentUser())) {
finish = true;
@@ -323,6 +329,7 @@
case Pattern:
case Password:
case PIN:
+ strongAuth = true;
finish = true;
break;
@@ -346,7 +353,7 @@
}
}
if (finish) {
- mSecurityCallback.finish();
+ mSecurityCallback.finish(strongAuth);
}
return finish;
}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityView.java
index 7e82c63..38302fb 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityView.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityView.java
@@ -22,9 +22,18 @@
static public final int VIEW_REVEALED = 2;
int PROMPT_REASON_NONE = 0;
+
+ /**
+ * Strong auth is required because the device has just booted.
+ */
int PROMPT_REASON_RESTART = 1;
/**
+ * Strong auth is required because the user hasn't used strong auth since a while.
+ */
+ int PROMPT_REASON_TIMEOUT = 2;
+
+ /**
* Interface back to keyguard to tell it when security
* @param callback
*/
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java
index 0ee68fd..3232f65 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -64,6 +64,7 @@
import android.telephony.SubscriptionManager;
import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
import android.telephony.TelephonyManager;
+import android.util.ArraySet;
import android.util.Log;
import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
@@ -103,6 +104,12 @@
= "com.android.facelock.FACE_UNLOCK_STOPPED";
private static final String FINGERPRINT_WAKE_LOCK_NAME = "wake-and-unlock wakelock";
+ private static final String ACTION_STRONG_AUTH_TIMEOUT =
+ "com.android.systemui.ACTION_STRONG_AUTH_TIMEOUT";
+ private static final String USER_ID = "com.android.systemui.USER_ID";
+
+ private static final String PERMISSION_SELF = "com.android.systemui.permission.SELF";
+
/**
* Mode in which we don't need to wake up the device when we get a fingerprint.
*/
@@ -126,6 +133,12 @@
* */
private static final int FP_ONLY_WAKE = 3;
+ /**
+ * Milliseconds after unlocking with fingerprint times out, i.e. the user has to use a
+ * strong auth method like password, PIN or pattern.
+ */
+ private static final long FINGERPRINT_UNLOCK_TIMEOUT_MS = 72 * 60 * 60 * 1000;
+
// Callback messages
private static final int MSG_TIME_UPDATE = 301;
private static final int MSG_BATTERY_UPDATE = 302;
@@ -173,7 +186,8 @@
// Password attempts
private SparseIntArray mFailedAttempts = new SparseIntArray();
- private boolean mClockVisible;
+ /** Tracks whether strong authentication hasn't been used since quite some time per user. */
+ private ArraySet<Integer> mStrongAuthTimedOut = new ArraySet<>();
private final ArrayList<WeakReference<KeyguardUpdateMonitorCallback>>
mCallbacks = Lists.newArrayList();
@@ -184,6 +198,7 @@
private boolean mDeviceInteractive;
private boolean mScreenOn;
private SubscriptionManager mSubscriptionManager;
+ private AlarmManager mAlarmManager;
private List<SubscriptionInfo> mSubscriptionInfo;
private boolean mFingerprintDetectionRunning;
private TrustManager mTrustManager;
@@ -549,7 +564,39 @@
}
public boolean isUnlockingWithFingerprintAllowed() {
- return mUserHasAuthenticatedSinceBoot;
+ return mUserHasAuthenticatedSinceBoot && !hasFingerprintUnlockTimedOut(sCurrentUser);
+ }
+
+ /**
+ * @return true if the user hasn't use strong authentication (pattern, PIN, password) since a
+ * while and thus can't unlock with fingerprint, false otherwise
+ */
+ public boolean hasFingerprintUnlockTimedOut(int userId) {
+ return mStrongAuthTimedOut.contains(userId);
+ }
+
+ public void reportSuccessfulStrongAuthUnlockAttempt() {
+ mStrongAuthTimedOut.remove(sCurrentUser);
+ scheduleStrongAuthTimeout();
+ }
+
+ private void scheduleStrongAuthTimeout() {
+ long when = SystemClock.elapsedRealtime() + FINGERPRINT_UNLOCK_TIMEOUT_MS;
+ Intent intent = new Intent(ACTION_STRONG_AUTH_TIMEOUT);
+ intent.putExtra(USER_ID, sCurrentUser);
+ PendingIntent sender = PendingIntent.getBroadcast(mContext,
+ sCurrentUser, intent, PendingIntent.FLAG_CANCEL_CURRENT);
+ mAlarmManager.set(AlarmManager.ELAPSED_REALTIME, when, sender);
+ notifyStrongAuthTimedOutChanged(sCurrentUser);
+ }
+
+ private void notifyStrongAuthTimedOutChanged(int userId) {
+ for (int i = 0; i < mCallbacks.size(); i++) {
+ KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
+ if (cb != null) {
+ cb.onStrongAuthTimeoutExpiredChanged(userId);
+ }
+ }
}
static class DisplayClientState {
@@ -639,6 +686,17 @@
}
};
+ private final BroadcastReceiver mStrongAuthTimeoutReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (ACTION_STRONG_AUTH_TIMEOUT.equals(intent.getAction())) {
+ int userId = intent.getIntExtra(USER_ID, -1);
+ mStrongAuthTimedOut.add(userId);
+ notifyStrongAuthTimedOutChanged(userId);
+ }
+ }
+ };
+
private FingerprintManager.AuthenticationCallback mAuthenticationCallback
= new AuthenticationCallback() {
@@ -871,7 +929,9 @@
mContext = context;
mSubscriptionManager = SubscriptionManager.from(context);
mPowerManager = context.getSystemService(PowerManager.class);
+ mAlarmManager = context.getSystemService(AlarmManager.class);
mDeviceProvisioned = isDeviceProvisionedInSettingsDb();
+
// Since device can't be un-provisioned, we only need to register a content observer
// to update mDeviceProvisioned when we are...
if (!mDeviceProvisioned) {
@@ -932,6 +992,10 @@
e.printStackTrace();
}
+ IntentFilter strongAuthTimeoutFilter = new IntentFilter();
+ strongAuthTimeoutFilter.addAction(ACTION_STRONG_AUTH_TIMEOUT);
+ context.registerReceiver(mStrongAuthTimeoutReceiver, strongAuthTimeoutFilter,
+ PERMISSION_SELF, null /* handler */);
mTrustManager = (TrustManager) context.getSystemService(Context.TRUST_SERVICE);
mTrustManager.registerTrustListener(this);
@@ -955,7 +1019,7 @@
private void startListeningForFingerprint() {
if (DEBUG) Log.v(TAG, "startListeningForFingerprint()");
int userId = ActivityManager.getCurrentUser();
- if (isUnlockWithFingerPrintPossible(userId)) {
+ if (isUnlockWithFingerprintPossible(userId)) {
mUserHasAuthenticatedSinceBoot = mTrustManager.hasUserAuthenticatedSinceBoot(
ActivityManager.getCurrentUser());
if (mFingerprintCancelSignal != null) {
@@ -967,7 +1031,7 @@
}
}
- public boolean isUnlockWithFingerPrintPossible(int userId) {
+ public boolean isUnlockWithFingerprintPossible(int userId) {
return mFpm != null && mFpm.isHardwareDetected() && !isFingerprintDisabled(userId)
&& mFpm.getEnrolledFingerprints(userId).size() > 0;
}
@@ -1433,7 +1497,7 @@
return mFailedAttempts.get(sCurrentUser, 0);
}
- public void reportFailedUnlockAttempt() {
+ public void reportFailedStrongAuthUnlockAttempt() {
mFailedAttempts.put(sCurrentUser, getFailedUnlockAttempts() + 1);
}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java
index 6cda2b7..52412f7 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java
@@ -217,4 +217,10 @@
* Called when the fingerprint running state changed.
*/
public void onFingerprintRunningStateChanged(boolean running) { }
+
+ /**
+ * Called when the state that the user hasn't used strong authentication since quite some time
+ * has changed.
+ */
+ public void onStrongAuthTimeoutExpiredChanged(int userId) { }
}
diff --git a/packages/Keyguard/src/com/android/keyguard/ViewMediatorCallback.java b/packages/Keyguard/src/com/android/keyguard/ViewMediatorCallback.java
index ff463c6..8ab3011 100644
--- a/packages/Keyguard/src/com/android/keyguard/ViewMediatorCallback.java
+++ b/packages/Keyguard/src/com/android/keyguard/ViewMediatorCallback.java
@@ -28,12 +28,11 @@
/**
* Report that the keyguard is done.
- * @param authenticated Whether the user securely got past the keyguard.
- * the only reason for this to be false is if the keyguard was instructed
- * to appear temporarily to verify the user is supposed to get past the
- * keyguard, and the user fails to do so.
+ *
+ * @param strongAuth whether the user has authenticated with strong authentication like
+ * pattern, password or PIN but not by trust agents or fingerprint
*/
- void keyguardDone(boolean authenticated);
+ void keyguardDone(boolean strongAuth);
/**
* Report that the keyguard is done drawing.
@@ -48,8 +47,11 @@
/**
* Report that the keyguard is dismissable, pending the next keyguardDone call.
+ *
+ * @param strongAuth whether the user has authenticated with strong authentication like
+ * pattern, password or PIN but not by trust agents or fingerprint
*/
- void keyguardDonePending();
+ void keyguardDonePending(boolean strongAuth);
/**
* Report when keyguard is actually gone
@@ -85,8 +87,9 @@
/**
* @return one of the reasons why the bouncer needs to be shown right now and the user can't use
* his normal unlock method like fingerprint or trust agents. See
- * {@link KeyguardSecurityView#PROMPT_REASON_NONE}
- * and {@link KeyguardSecurityView#PROMPT_REASON_RESTART}.
+ * {@link KeyguardSecurityView#PROMPT_REASON_NONE},
+ * {@link KeyguardSecurityView#PROMPT_REASON_RESTART} and
+ * {@link KeyguardSecurityView#PROMPT_REASON_TIMEOUT}.
*/
int getBouncerPromptReason();
}
diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/DocumentLoader.java b/packages/MtpDocumentsProvider/src/com/android/mtp/DocumentLoader.java
new file mode 100644
index 0000000..2353205
--- /dev/null
+++ b/packages/MtpDocumentsProvider/src/com/android/mtp/DocumentLoader.java
@@ -0,0 +1,222 @@
+/*
+ * 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.mtp;
+
+import android.content.ContentResolver;
+import android.database.Cursor;
+import android.database.MatrixCursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Process;
+import android.provider.DocumentsContract;
+import android.util.Log;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.LinkedList;
+
+class DocumentLoader {
+ static final int NUM_INITIAL_ENTRIES = 10;
+ static final int NUM_LOADING_ENTRIES = 20;
+ static final int NOTIFY_PERIOD_MS = 500;
+
+ private final MtpManager mMtpManager;
+ private final ContentResolver mResolver;
+ private final LinkedList<LoaderTask> mTasks = new LinkedList<LoaderTask>();
+ private boolean mHasBackgroundThread = false;
+
+ DocumentLoader(MtpManager mtpManager, ContentResolver resolver) {
+ mMtpManager = mtpManager;
+ mResolver = resolver;
+ }
+
+ private static MtpDocument[] loadDocuments(MtpManager manager, int deviceId, int[] handles)
+ throws IOException {
+ final MtpDocument[] documents = new MtpDocument[handles.length];
+ for (int i = 0; i < handles.length; i++) {
+ documents[i] = manager.getDocument(deviceId, handles[i]);
+ }
+ return documents;
+ }
+
+ synchronized Cursor queryChildDocuments(String[] columnNames, Identifier parent)
+ throws IOException {
+ LoaderTask task = findTask(parent);
+ if (task == null) {
+ int parentHandle = parent.mObjectHandle;
+ // Need to pass the special value MtpManager.OBJECT_HANDLE_ROOT_CHILDREN to
+ // getObjectHandles if we would like to obtain children under the root.
+ if (parentHandle == MtpDocument.DUMMY_HANDLE_FOR_ROOT) {
+ parentHandle = MtpManager.OBJECT_HANDLE_ROOT_CHILDREN;
+ }
+ task = new LoaderTask(parent, mMtpManager.getObjectHandles(
+ parent.mDeviceId, parent.mStorageId, parentHandle));
+ task.fillDocuments(loadDocuments(
+ mMtpManager,
+ parent.mDeviceId,
+ task.getUnloadedObjectHandles(NUM_INITIAL_ENTRIES)));
+ }
+
+ // Move this task to the head of the list to prioritize it.
+ mTasks.remove(task);
+ mTasks.addFirst(task);
+ if (!task.completed() && !mHasBackgroundThread) {
+ mHasBackgroundThread = true;
+ new BackgroundLoaderThread().start();
+ }
+
+ return task.createCursor(mResolver, columnNames);
+ }
+
+ synchronized void clearCache(int deviceId) {
+ int i = 0;
+ while (i < mTasks.size()) {
+ if (mTasks.get(i).mIdentifier.mDeviceId == deviceId) {
+ mTasks.remove(i);
+ } else {
+ i++;
+ }
+ }
+ }
+
+ synchronized void clearCache() {
+ int i = 0;
+ while (i < mTasks.size()) {
+ if (mTasks.get(i).completed()) {
+ mTasks.remove(i);
+ } else {
+ i++;
+ }
+ }
+ }
+
+ private LoaderTask findTask(Identifier parent) {
+ for (int i = 0; i < mTasks.size(); i++) {
+ if (mTasks.get(i).mIdentifier.equals(parent))
+ return mTasks.get(i);
+ }
+ return null;
+ }
+
+ private LoaderTask findUncompletedTask() {
+ for (int i = 0; i < mTasks.size(); i++) {
+ if (!mTasks.get(i).completed())
+ return mTasks.get(i);
+ }
+ return null;
+ }
+
+ private class BackgroundLoaderThread extends Thread {
+ @Override
+ public void run() {
+ Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
+ while (true) {
+ LoaderTask task;
+ int deviceId;
+ int[] handles;
+ synchronized (DocumentLoader.this) {
+ task = findUncompletedTask();
+ if (task == null) {
+ mHasBackgroundThread = false;
+ return;
+ }
+ deviceId = task.mIdentifier.mDeviceId;
+ handles = task.getUnloadedObjectHandles(NUM_LOADING_ENTRIES);
+ }
+ MtpDocument[] documents;
+ try {
+ documents = loadDocuments(mMtpManager, deviceId, handles);
+ } catch (IOException exception) {
+ documents = null;
+ Log.d(MtpDocumentsProvider.TAG, exception.getMessage());
+ }
+ synchronized (DocumentLoader.this) {
+ if (documents != null) {
+ task.fillDocuments(documents);
+ final boolean shouldNotify =
+ task.mLastNotified.getTime() <
+ new Date().getTime() - NOTIFY_PERIOD_MS ||
+ task.completed();
+ if (shouldNotify) {
+ task.notify(mResolver);
+ }
+ } else {
+ mTasks.remove(task);
+ }
+ }
+ }
+ }
+ }
+
+ private static class LoaderTask {
+ final Identifier mIdentifier;
+ final int[] mObjectHandles;
+ final MtpDocument[] mDocuments;
+ Date mLastNotified;
+ int mNumLoaded;
+
+ LoaderTask(Identifier identifier, int[] objectHandles) {
+ mIdentifier = identifier;
+ mObjectHandles = objectHandles;
+ mDocuments = new MtpDocument[mObjectHandles.length];
+ mNumLoaded = 0;
+ mLastNotified = new Date();
+ }
+
+ Cursor createCursor(ContentResolver resolver, String[] columnNames) {
+ final MatrixCursor cursor = new MatrixCursor(columnNames);
+ final Identifier rootIdentifier = new Identifier(
+ mIdentifier.mDeviceId, mIdentifier.mStorageId);
+ for (int i = 0; i < mNumLoaded; i++) {
+ mDocuments[i].addToCursor(rootIdentifier, cursor.newRow());
+ }
+ final Bundle extras = new Bundle();
+ extras.putBoolean(DocumentsContract.EXTRA_LOADING, !completed());
+ cursor.setNotificationUri(resolver, createUri());
+ cursor.respond(extras);
+ return cursor;
+ }
+
+ boolean completed() {
+ return mNumLoaded == mDocuments.length;
+ }
+
+ int[] getUnloadedObjectHandles(int count) {
+ return Arrays.copyOfRange(
+ mObjectHandles,
+ mNumLoaded,
+ Math.min(mNumLoaded + count, mObjectHandles.length));
+ }
+
+ void notify(ContentResolver resolver) {
+ resolver.notifyChange(createUri(), null, false);
+ mLastNotified = new Date();
+ }
+
+ void fillDocuments(MtpDocument[] documents) {
+ for (int i = 0; i < documents.length; i++) {
+ mDocuments[mNumLoaded++] = documents[i];
+ }
+ }
+
+ private Uri createUri() {
+ return DocumentsContract.buildChildDocumentsUri(
+ MtpDocumentsProvider.AUTHORITY, mIdentifier.toDocumentId());
+ }
+ }
+}
diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java
index 32882c8..bcdfb71 100644
--- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java
+++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java
@@ -40,12 +40,12 @@
public class MtpDocumentsProvider extends DocumentsProvider {
static final String AUTHORITY = "com.android.mtp.documents";
static final String TAG = "MtpDocumentsProvider";
- private static final String[] DEFAULT_ROOT_PROJECTION = new String[] {
+ static final String[] DEFAULT_ROOT_PROJECTION = new String[] {
Root.COLUMN_ROOT_ID, Root.COLUMN_FLAGS, Root.COLUMN_ICON,
Root.COLUMN_TITLE, Root.COLUMN_DOCUMENT_ID,
Root.COLUMN_AVAILABLE_BYTES,
};
- private static final String[] DEFAULT_DOCUMENT_PROJECTION = new String[] {
+ static final String[] DEFAULT_DOCUMENT_PROJECTION = new String[] {
Document.COLUMN_DOCUMENT_ID, Document.COLUMN_MIME_TYPE,
Document.COLUMN_DISPLAY_NAME, Document.COLUMN_LAST_MODIFIED,
Document.COLUMN_FLAGS, Document.COLUMN_SIZE,
@@ -56,6 +56,7 @@
private MtpManager mMtpManager;
private ContentResolver mResolver;
private PipeManager mPipeManager;
+ private DocumentLoader mDocumentLoader;
/**
* Provides singleton instance to MtpDocumentsService.
@@ -70,14 +71,15 @@
mMtpManager = new MtpManager(getContext());
mResolver = getContext().getContentResolver();
mPipeManager = new PipeManager();
-
+ mDocumentLoader = new DocumentLoader(mMtpManager, mResolver);
return true;
}
@VisibleForTesting
void onCreateForTesting(MtpManager mtpManager, ContentResolver resolver) {
- this.mMtpManager = mtpManager;
- this.mResolver = resolver;
+ mMtpManager = mtpManager;
+ mResolver = resolver;
+ mDocumentLoader = new DocumentLoader(mMtpManager, mResolver);
}
@Override
@@ -152,7 +154,6 @@
return cursor;
}
- // TODO: Support background loading for large number of files.
@Override
public Cursor queryChildDocuments(String parentDocumentId,
String[] projection, String sortOrder) throws FileNotFoundException {
@@ -160,29 +161,8 @@
projection = MtpDocumentsProvider.DEFAULT_DOCUMENT_PROJECTION;
}
final Identifier parentIdentifier = Identifier.createFromDocumentId(parentDocumentId);
- int parentHandle = parentIdentifier.mObjectHandle;
- // Need to pass the special value MtpManager.OBJECT_HANDLE_ROOT_CHILDREN to
- // getObjectHandles if we would like to obtain children under the root.
- if (parentHandle == MtpDocument.DUMMY_HANDLE_FOR_ROOT) {
- parentHandle = MtpManager.OBJECT_HANDLE_ROOT_CHILDREN;
- }
try {
- final MatrixCursor cursor = new MatrixCursor(projection);
- final Identifier rootIdentifier = new Identifier(
- parentIdentifier.mDeviceId, parentIdentifier.mStorageId);
- final int[] objectHandles = mMtpManager.getObjectHandles(
- parentIdentifier.mDeviceId, parentIdentifier.mStorageId, parentHandle);
- for (int i = 0; i < objectHandles.length; i++) {
- try {
- final MtpDocument document = mMtpManager.getDocument(
- parentIdentifier.mDeviceId, objectHandles[i]);
- document.addToCursor(rootIdentifier, cursor.newRow());
- } catch (IOException error) {
- cursor.close();
- throw new FileNotFoundException(error.getMessage());
- }
- }
- return cursor;
+ return mDocumentLoader.queryChildDocuments(projection, parentIdentifier);
} catch (IOException exception) {
throw new FileNotFoundException(exception.getMessage());
}
@@ -234,6 +214,11 @@
}
}
+ @Override
+ public void onTrimMemory(int level) {
+ mDocumentLoader.clearCache();
+ }
+
void openDevice(int deviceId) throws IOException {
mMtpManager.openDevice(deviceId);
notifyRootsChange();
@@ -241,6 +226,7 @@
void closeDevice(int deviceId) throws IOException {
mMtpManager.closeDevice(deviceId);
+ mDocumentLoader.clearCache(deviceId);
notifyRootsChange();
}
@@ -249,6 +235,7 @@
for (int deviceId : mMtpManager.getOpenedDeviceIds()) {
try {
mMtpManager.closeDevice(deviceId);
+ mDocumentLoader.clearCache(deviceId);
closed = true;
} catch (IOException d) {
Log.d(TAG, "Failed to close the MTP device: " + deviceId);
diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/DocumentLoaderTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/DocumentLoaderTest.java
new file mode 100644
index 0000000..49fcddd
--- /dev/null
+++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/DocumentLoaderTest.java
@@ -0,0 +1,127 @@
+/*
+ * 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.mtp;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.net.Uri;
+import android.provider.DocumentsContract;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import java.io.IOException;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.CountDownLatch;
+
+@SmallTest
+public class DocumentLoaderTest extends AndroidTestCase {
+ private BlockableTestMtpMaanger mManager;
+ private TestContentResolver mResolver;
+ private DocumentLoader mLoader;
+ final private Identifier mParentIdentifier = new Identifier(0, 0, 0);
+
+ @Override
+ public void setUp() {
+ mManager = new BlockableTestMtpMaanger(getContext());
+ mResolver = new TestContentResolver();
+ mLoader = new DocumentLoader(mManager, mResolver);
+ }
+
+ public void testBasic() throws IOException, InterruptedException {
+ final Uri uri = DocumentsContract.buildChildDocumentsUri(
+ MtpDocumentsProvider.AUTHORITY, mParentIdentifier.toDocumentId());
+ setUpDocument(mManager, 40);
+ mManager.blockDocument(0, 15);
+ mManager.blockDocument(0, 35);
+
+ {
+ final Cursor cursor = mLoader.queryChildDocuments(
+ MtpDocumentsProvider.DEFAULT_DOCUMENT_PROJECTION, mParentIdentifier);
+ assertEquals(DocumentLoader.NUM_INITIAL_ENTRIES, cursor.getCount());
+ }
+
+ Thread.sleep(DocumentLoader.NOTIFY_PERIOD_MS);
+ mManager.unblockDocument(0, 15);
+ mResolver.waitForNotification(uri, 1);
+
+ {
+ final Cursor cursor = mLoader.queryChildDocuments(
+ MtpDocumentsProvider.DEFAULT_DOCUMENT_PROJECTION, mParentIdentifier);
+ assertEquals(
+ DocumentLoader.NUM_INITIAL_ENTRIES + DocumentLoader.NUM_LOADING_ENTRIES,
+ cursor.getCount());
+ }
+
+ mManager.unblockDocument(0, 35);
+ mResolver.waitForNotification(uri, 2);
+
+ {
+ final Cursor cursor = mLoader.queryChildDocuments(
+ MtpDocumentsProvider.DEFAULT_DOCUMENT_PROJECTION, mParentIdentifier);
+ assertEquals(40, cursor.getCount());
+ }
+
+ assertEquals(2, mResolver.getChangeCount(uri));
+ }
+
+ private void setUpDocument(TestMtpManager manager, int count) {
+ int[] childDocuments = new int[count];
+ for (int i = 0; i < childDocuments.length; i++) {
+ final int objectHandle = i + 1;
+ childDocuments[i] = objectHandle;
+ manager.setDocument(0, objectHandle, new MtpDocument(
+ objectHandle,
+ 0 /* format */,
+ "file" + objectHandle,
+ new Date(),
+ 1024,
+ 0 /* thumbnail size */));
+ }
+ manager.setObjectHandles(0, 0, MtpManager.OBJECT_HANDLE_ROOT_CHILDREN, childDocuments);
+ }
+
+ private static class BlockableTestMtpMaanger extends TestMtpManager {
+ final private Map<String, CountDownLatch> blockedDocuments = new HashMap<>();
+
+ BlockableTestMtpMaanger(Context context) {
+ super(context);
+ }
+
+ void blockDocument(int deviceId, int objectHandle) {
+ blockedDocuments.put(pack(deviceId, objectHandle), new CountDownLatch(1));
+ }
+
+ void unblockDocument(int deviceId, int objectHandle) {
+ blockedDocuments.get(pack(deviceId, objectHandle)).countDown();
+ }
+
+ @Override
+ MtpDocument getDocument(int deviceId, int objectHandle) throws IOException {
+ final CountDownLatch latch = blockedDocuments.get(pack(deviceId, objectHandle));
+ if (latch != null) {
+ try {
+ latch.await();
+ } catch(InterruptedException e) {
+ fail();
+ }
+ }
+ return super.getDocument(deviceId, objectHandle);
+ }
+ }
+}
diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java
index 1031d8a..e0e3ce6 100644
--- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java
+++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java
@@ -16,30 +16,26 @@
package com.android.mtp;
-import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.provider.DocumentsContract;
import android.provider.DocumentsContract.Root;
import android.test.AndroidTestCase;
-import android.test.mock.MockContentResolver;
import android.test.suitebuilder.annotation.SmallTest;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
@SmallTest
public class MtpDocumentsProviderTest extends AndroidTestCase {
- private ContentResolver mResolver;
+ private TestContentResolver mResolver;
private MtpDocumentsProvider mProvider;
private TestMtpManager mMtpManager;
@Override
public void setUp() {
- mResolver = new ContentResolver();
+ mResolver = new TestContentResolver();
mMtpManager = new TestMtpManager(getContext());
mProvider = new MtpDocumentsProvider();
mProvider.onCreateForTesting(mMtpManager, mResolver);
@@ -291,21 +287,4 @@
DocumentsContract.buildChildDocumentsUri(
MtpDocumentsProvider.AUTHORITY, "0_0_2")));
}
-
- private static class ContentResolver extends MockContentResolver {
- final Map<Uri, Integer> mChangeCounts = new HashMap<Uri, Integer>();
-
- @Override
- public void notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork) {
- mChangeCounts.put(uri, getChangeCount(uri) + 1);
- }
-
- int getChangeCount(Uri uri) {
- if (mChangeCounts.containsKey(uri)) {
- return mChangeCounts.get(uri);
- } else {
- return 0;
- }
- }
- }
}
diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestContentResolver.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestContentResolver.java
new file mode 100644
index 0000000..33e559f
--- /dev/null
+++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestContentResolver.java
@@ -0,0 +1,57 @@
+/*
+ * 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.mtp;
+
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.test.mock.MockContentResolver;
+
+import junit.framework.Assert;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.Phaser;
+
+class TestContentResolver extends MockContentResolver {
+ final private Map<Uri, Phaser> mPhasers = new HashMap<>();
+
+ @Override
+ public void notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork) {
+ getPhaser(uri).arrive();
+ }
+
+ void waitForNotification(Uri uri, int count) {
+ Assert.assertEquals(count, getPhaser(uri).awaitAdvance(count - 1));
+ }
+
+ int getChangeCount(Uri uri) {
+ if (mPhasers.containsKey(uri)) {
+ return mPhasers.get(uri).getPhase();
+ } else {
+ return 0;
+ }
+ }
+
+ private synchronized Phaser getPhaser(Uri uri) {
+ Phaser phaser = mPhasers.get(uri);
+ if (phaser == null) {
+ phaser = new Phaser(1);
+ mPhasers.put(uri, phaser);
+ }
+ return phaser;
+ }
+}
diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestMtpManager.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestMtpManager.java
index 7f81686..40de7b4 100644
--- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestMtpManager.java
+++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestMtpManager.java
@@ -28,7 +28,7 @@
import java.util.TreeSet;
public class TestMtpManager extends MtpManager {
- private static String pack(int... args) {
+ protected static String pack(int... args) {
return Arrays.toString(args);
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
index d78800f..d2c60ef 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
@@ -80,7 +80,8 @@
@Override // Binder interface
public void keyguardDone(boolean authenticated, boolean wakeup) {
checkPermission();
- mKeyguardViewMediator.keyguardDone(authenticated, wakeup);
+ // TODO: Remove wakeup
+ mKeyguardViewMediator.keyguardDone(authenticated);
}
@Override // Binder interface
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index e44d109..428ceca 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -465,14 +465,15 @@
mUpdateMonitor.isUnlockingWithFingerprintAllowed();
if (mStatusBarKeyguardViewManager.isBouncerShowing()) {
if (unlockingWithFingerprintAllowed) {
- mStatusBarKeyguardViewManager.notifyKeyguardAuthenticated();
+ mStatusBarKeyguardViewManager.notifyKeyguardAuthenticated(
+ false /* strongAuth */);
}
} else {
if (wakeAndUnlocking && mShowing && unlockingWithFingerprintAllowed) {
mWakeAndUnlocking = true;
mStatusBarKeyguardViewManager.setWakeAndUnlocking();
- keyguardDone(true, true);
- } else if (mShowing && mDeviceInteractive) {
+ keyguardDone(true);
+ } else if (mShowing) {
if (wakeAndUnlocking) {
mStatusBarKeyguardViewManager.notifyDeviceWakeUpRequested();
}
@@ -490,9 +491,12 @@
KeyguardViewMediator.this.userActivity();
}
- public void keyguardDone(boolean authenticated) {
+ public void keyguardDone(boolean strongAuth) {
if (!mKeyguardDonePending) {
- KeyguardViewMediator.this.keyguardDone(authenticated, true);
+ KeyguardViewMediator.this.keyguardDone(true /* authenticated */);
+ }
+ if (strongAuth) {
+ mUpdateMonitor.reportSuccessfulStrongAuthUnlockAttempt();
}
}
@@ -506,12 +510,15 @@
}
@Override
- public void keyguardDonePending() {
+ public void keyguardDonePending(boolean strongAuth) {
mKeyguardDonePending = true;
mHideAnimationRun = true;
mStatusBarKeyguardViewManager.startPreHideAnimation(null /* finishRunnable */);
mHandler.sendEmptyMessageDelayed(KEYGUARD_DONE_PENDING_TIMEOUT,
KEYGUARD_DONE_PENDING_TIMEOUT_MS);
+ if (strongAuth) {
+ mUpdateMonitor.reportSuccessfulStrongAuthUnlockAttempt();
+ }
}
@Override
@@ -524,7 +531,7 @@
if (mKeyguardDonePending) {
// Somebody has called keyguardDonePending before, which means that we are
// authenticated
- KeyguardViewMediator.this.keyguardDone(true /* authenticated */, true /* wakeUp */);
+ KeyguardViewMediator.this.keyguardDone(true /* authenticated */);
}
}
@@ -552,9 +559,12 @@
public int getBouncerPromptReason() {
int currentUser = ActivityManager.getCurrentUser();
if ((mUpdateMonitor.getUserTrustIsManaged(currentUser)
- || mUpdateMonitor.isUnlockWithFingerPrintPossible(currentUser))
+ || mUpdateMonitor.isUnlockWithFingerprintPossible(currentUser))
&& !mTrustManager.hasUserAuthenticatedSinceBoot(currentUser)) {
return KeyguardSecurityView.PROMPT_REASON_RESTART;
+ } else if (mUpdateMonitor.isUnlockWithFingerprintPossible(currentUser)
+ && mUpdateMonitor.hasFingerprintUnlockTimedOut(currentUser)) {
+ return KeyguardSecurityView.PROMPT_REASON_TIMEOUT;
}
return KeyguardSecurityView.PROMPT_REASON_NONE;
}
@@ -1194,10 +1204,10 @@
}
};
- public void keyguardDone(boolean authenticated, boolean wakeup) {
- if (DEBUG) Log.d(TAG, "keyguardDone(" + authenticated + ")");
+ public void keyguardDone(boolean authenticated) {
+ if (DEBUG) Log.d(TAG, "keyguardDone(" + authenticated +")");
EventLog.writeEvent(70000, 2);
- Message msg = mHandler.obtainMessage(KEYGUARD_DONE, authenticated ? 1 : 0, wakeup ? 1 : 0);
+ Message msg = mHandler.obtainMessage(KEYGUARD_DONE, authenticated ? 1 : 0);
mHandler.sendMessage(msg);
}
@@ -1240,14 +1250,11 @@
handleNotifyStartedWakingUp();
break;
case KEYGUARD_DONE:
- handleKeyguardDone(msg.arg1 != 0, msg.arg2 != 0);
+ handleKeyguardDone(msg.arg1 != 0);
break;
case KEYGUARD_DONE_DRAWING:
handleKeyguardDoneDrawing();
break;
- case KEYGUARD_DONE_AUTHENTICATING:
- keyguardDone(true, true);
- break;
case SET_OCCLUDED:
handleSetOccluded(msg.arg1 != 0);
break;
@@ -1277,7 +1284,7 @@
* @see #keyguardDone
* @see #KEYGUARD_DONE
*/
- private void handleKeyguardDone(boolean authenticated, boolean wakeup) {
+ private void handleKeyguardDone(boolean authenticated) {
if (DEBUG) Log.d(TAG, "handleKeyguardDone");
synchronized (this) {
resetKeyguardDonePendingLocked();
@@ -1599,6 +1606,7 @@
synchronized (this) {
if (DEBUG) Log.d(TAG, "handleNotifyScreenTurnedOff");
mStatusBarKeyguardViewManager.onScreenTurnedOff();
+ mWakeAndUnlocking = false;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/UsageTracker.java b/packages/SystemUI/src/com/android/systemui/qs/UsageTracker.java
index f36019b..e64f6a0 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/UsageTracker.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/UsageTracker.java
@@ -21,7 +21,6 @@
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
-import android.content.SharedPreferences;
import com.android.systemui.Prefs;
import com.android.systemui.R;
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
index b47fb304..d0876fa 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
@@ -33,7 +33,6 @@
import android.view.ViewStub;
import android.widget.Toast;
-import com.android.internal.logging.MetricsConstants;
import com.android.internal.logging.MetricsLogger;
import com.android.systemui.Prefs;
import com.android.systemui.R;
diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
index afa32cbdf..89aeabc 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
@@ -20,10 +20,8 @@
import android.app.ActivityManagerNative;
import android.app.ActivityOptions;
import android.app.AppGlobals;
-import android.app.IActivityContainer;
import android.app.IActivityManager;
import android.app.ITaskStackListener;
-import android.app.SearchManager;
import android.appwidget.AppWidgetHost;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProviderInfo;
@@ -54,15 +52,12 @@
import android.os.RemoteException;
import android.os.SystemProperties;
import android.os.UserHandle;
-import android.os.UserManager;
import android.provider.Settings;
import android.util.Log;
import android.util.MutableBoolean;
import android.util.Pair;
import android.util.SparseArray;
import android.view.Display;
-import android.view.DisplayInfo;
-import android.view.SurfaceControl;
import android.view.WindowManager;
import android.view.accessibility.AccessibilityManager;
@@ -71,7 +66,6 @@
import com.android.systemui.R;
import com.android.systemui.recents.Constants;
import com.android.systemui.recents.Recents;
-import com.android.systemui.recents.RecentsAppWidgetHost;
import com.android.systemui.recents.RecentsConfiguration;
import java.io.IOException;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
index 4878cd92..f1b8873 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
@@ -647,6 +647,11 @@
public void onFingerprintRunningStateChanged(boolean running) {
mLockIcon.update();
}
+
+ @Override
+ public void onStrongAuthTimeoutExpiredChanged(int userId) {
+ mLockIcon.update();
+ }
};
public void setKeyguardIndicationController(
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
index 37f563e..8b96e5f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
@@ -26,6 +26,8 @@
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardHostView;
import com.android.keyguard.KeyguardSecurityView;
+import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.keyguard.R;
import com.android.keyguard.ViewMediatorCallback;
import com.android.systemui.DejankUtils;
@@ -47,6 +49,13 @@
private ViewGroup mRoot;
private boolean mShowingSoon;
private int mBouncerPromptReason;
+ private KeyguardUpdateMonitorCallback mUpdateMonitorCallback =
+ new KeyguardUpdateMonitorCallback() {
+ @Override
+ public void onStrongAuthTimeoutExpiredChanged(int userId) {
+ mBouncerPromptReason = mCallback.getBouncerPromptReason();
+ }
+ };
public KeyguardBouncer(Context context, ViewMediatorCallback callback,
LockPatternUtils lockPatternUtils, StatusBarWindowManager windowManager,
@@ -56,6 +65,7 @@
mLockPatternUtils = lockPatternUtils;
mContainer = container;
mWindowManager = windowManager;
+ KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitorCallback);
}
public void show(boolean resetSecuritySelection) {
@@ -247,8 +257,8 @@
return mKeyguardView.interceptMediaKey(event);
}
- public void notifyKeyguardAuthenticated() {
+ public void notifyKeyguardAuthenticated(boolean strongAuth) {
ensureView();
- mKeyguardView.finish();
+ mKeyguardView.finish(strongAuth);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index 1bdcf03..3c1272d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -480,8 +480,8 @@
* Notifies that the user has authenticated by other means than using the bouncer, for example,
* fingerprint.
*/
- public void notifyKeyguardAuthenticated() {
- mBouncer.notifyKeyguardAuthenticated();
+ public void notifyKeyguardAuthenticated(boolean strongAuth) {
+ mBouncer.notifyKeyguardAuthenticated(strongAuth);
}
public void setWakeAndUnlocking() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java
index bd537f7..d646d0d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java
@@ -143,6 +143,11 @@
public void onFaceUnlockStateChanged(boolean running, int userId) {
update(false /* updateAlways */);
}
+
+ @Override
+ public void onStrongAuthTimeoutExpiredChanged(int userId) {
+ update(false /* updateAlways */);
+ }
};
public boolean isTrustManaged() {
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerService.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerService.java
index d3f33ab..50234b2 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/TunerService.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerService.java
@@ -16,7 +16,6 @@
package com.android.systemui.tuner;
import android.app.ActivityManager;
-import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentResolver;
@@ -25,10 +24,12 @@
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
+import android.os.UserHandle;
import android.provider.Settings;
import android.util.ArrayMap;
@@ -169,6 +170,7 @@
public static final void showResetRequest(final Context context, final Runnable onDisabled) {
SystemUIDialog dialog = new SystemUIDialog(context);
+ dialog.setShowForAllUsers(true);
dialog.setMessage(R.string.remove_from_settings_prompt);
dialog.setButton(DialogInterface.BUTTON_NEGATIVE, context.getString(R.string.cancel),
(OnClickListener) null);
@@ -192,7 +194,7 @@
}
public static final void setTunerEnabled(Context context, boolean enabled) {
- context.getPackageManager().setComponentEnabledSetting(
+ userContext(context).getPackageManager().setComponentEnabledSetting(
new ComponentName(context, TunerActivity.class),
enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
: PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
@@ -200,11 +202,20 @@
}
public static final boolean isTunerEnabled(Context context) {
- return context.getPackageManager().getComponentEnabledSetting(
+ return userContext(context).getPackageManager().getComponentEnabledSetting(
new ComponentName(context, TunerActivity.class))
== PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
}
+ private static Context userContext(Context context) {
+ try {
+ return context.createPackageContextAsUser(context.getPackageName(), 0,
+ new UserHandle(ActivityManager.getCurrentUser()));
+ } catch (NameNotFoundException e) {
+ return context;
+ }
+ }
+
private class Observer extends ContentObserver {
public Observer() {
super(new Handler(Looper.getMainLooper()));
diff --git a/services/core/java/com/android/server/ServiceWatcher.java b/services/core/java/com/android/server/ServiceWatcher.java
index 9274295..6062137 100644
--- a/services/core/java/com/android/server/ServiceWatcher.java
+++ b/services/core/java/com/android/server/ServiceWatcher.java
@@ -165,7 +165,7 @@
intent.setPackage(justCheckThisPackage);
}
List<ResolveInfo> rInfos = mPm.queryIntentServicesAsUser(intent,
- PackageManager.GET_META_DATA, UserHandle.USER_OWNER);
+ PackageManager.GET_META_DATA, UserHandle.USER_SYSTEM);
int bestVersion = Integer.MIN_VALUE;
String bestPackage = null;
boolean bestIsMultiuser = false;
@@ -242,7 +242,7 @@
if (D) Log.d(mTag, "binding " + packageName + " (version " + version + ") ("
+ (isMultiuser ? "multi" : "single") + "-user)");
mContext.bindServiceAsUser(intent, this, Context.BIND_AUTO_CREATE | Context.BIND_NOT_FOREGROUND
- | Context.BIND_NOT_VISIBLE, mIsMultiuser ? UserHandle.OWNER : UserHandle.CURRENT);
+ | Context.BIND_NOT_VISIBLE, mIsMultiuser ? UserHandle.SYSTEM : UserHandle.CURRENT);
}
public static boolean isSignatureMatch(Signature[] signatures,
diff --git a/services/core/java/com/android/server/fingerprint/FingerprintService.java b/services/core/java/com/android/server/fingerprint/FingerprintService.java
index 2c9d82b..ffad69d 100644
--- a/services/core/java/com/android/server/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/fingerprint/FingerprintService.java
@@ -589,10 +589,14 @@
result = true; // client not listening
}
if (fpId == 0) {
- FingerprintUtils.vibrateFingerprintError(getContext());
+ if (receiver != null) {
+ FingerprintUtils.vibrateFingerprintError(getContext());
+ }
result |= handleFailedAttempt(this);
} else {
- FingerprintUtils.vibrateFingerprintSuccess(getContext());
+ if (receiver != null) {
+ FingerprintUtils.vibrateFingerprintSuccess(getContext());
+ }
result |= true; // we have a valid fingerprint
mLockoutReset.run();
}
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index 7d16a35..e69dda1 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -1772,7 +1772,7 @@
maybeRefreshTrustedTime();
synchronized (mRulesLock) {
mRestrictBackground = restrictBackground;
- updateRulesForGlobalChangeLocked(false);
+ updateRulesForGlobalChangeLocked(true);
updateNotificationsLocked();
writePolicyLocked();
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index dc6e17d..c0a3097 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -481,12 +481,21 @@
new ArrayMap<String, ArrayMap<String, PackageParser.Package>>();
/**
- * Tracks new system packages [receiving in an OTA] that we expect to
+ * Tracks new system packages [received in an OTA] that we expect to
* find updated user-installed versions. Keys are package name, values
* are package location.
*/
final private ArrayMap<String, File> mExpectingBetter = new ArrayMap<>();
+ /**
+ * Tracks existing system packages prior to receiving an OTA. Keys are package name.
+ */
+ final private ArraySet<String> mExistingSystemPackages = new ArraySet<>();
+ /**
+ * Whether or not system app permissions should be promoted from install to runtime.
+ */
+ boolean mPromoteSystemApps;
+
final Settings mSettings;
boolean mRestoredSettings;
@@ -2047,6 +2056,24 @@
}
}
+ final VersionInfo ver = mSettings.getInternalVersion();
+ mIsUpgrade = !Build.FINGERPRINT.equals(ver.fingerprint);
+ // when upgrading from pre-M, promote system app permissions from install to runtime
+ mPromoteSystemApps =
+ mIsUpgrade && ver.sdkVersion <= Build.VERSION_CODES.LOLLIPOP_MR1;
+
+ // save off the names of pre-existing system packages prior to scanning; we don't
+ // want to automatically grant runtime permissions for new system apps
+ if (mPromoteSystemApps) {
+ Iterator<PackageSetting> pkgSettingIter = mSettings.mPackages.values().iterator();
+ while (pkgSettingIter.hasNext()) {
+ PackageSetting ps = pkgSettingIter.next();
+ if (isSystemApp(ps)) {
+ mExistingSystemPackages.add(ps.name);
+ }
+ }
+ }
+
// Collect vendor overlay packages.
// (Do this before scanning any apps.)
// For security and version matching reason, only consider
@@ -2266,8 +2293,6 @@
// cases get permissions that the user didn't initially explicitly
// allow... it would be nice to have some better way to handle
// this situation.
- final VersionInfo ver = mSettings.getInternalVersion();
-
int updateFlags = UPDATE_PERMISSIONS_ALL;
if (ver.sdkVersion != mSdkVersion) {
Slog.i(TAG, "Platform changed from " + ver.sdkVersion + " to "
@@ -2276,6 +2301,9 @@
}
updatePermissionsLPw(null, null, updateFlags);
ver.sdkVersion = mSdkVersion;
+ // clear only after permissions have been updated
+ mExistingSystemPackages.clear();
+ mPromoteSystemApps = false;
// If this is the first boot, and it is a normal boot, then
// we need to initialize the default preferred apps.
@@ -2287,7 +2315,6 @@
// If this is first boot after an OTA, and a normal boot, then
// we need to clear code cache directories.
- mIsUpgrade = !Build.FINGERPRINT.equals(ver.fingerprint);
if (mIsUpgrade && !onlyCore) {
Slog.i(TAG, "Build fingerprint changed; clearing code caches");
for (int i = 0; i < mSettings.mPackages.size(); i++) {
@@ -8422,6 +8449,13 @@
} else if (origPermissions.hasInstallPermission(bp.name)) {
// For legacy apps that became modern, install becomes runtime.
grant = GRANT_UPGRADE;
+ } else if (mPromoteSystemApps
+ && isSystemApp(ps)
+ && mExistingSystemPackages.contains(ps.name)) {
+ // For legacy system apps, install becomes runtime.
+ // We cannot check hasInstallPermission() for system apps since those
+ // permissions were granted implicitly and not persisted pre-M.
+ grant = GRANT_UPGRADE;
} else {
// For modern apps keep runtime permissions unchanged.
grant = GRANT_RUNTIME;
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 454cdcf..eb98a37 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -3646,7 +3646,8 @@
// We currently want to hide the navigation UI.
mNavigationBarController.setBarShowingLw(false);
}
- if (navVisible && !navTranslucent && !mNavigationBar.isAnimatingLw()
+ if (navVisible && !navTranslucent && !navAllowedHidden
+ && !mNavigationBar.isAnimatingLw()
&& !mNavigationBarController.wasRecentlyTranslucent()) {
// If the nav bar is currently requested to be visible,
// and not in the process of animating on or off, then
@@ -5521,10 +5522,6 @@
// may happen in a future call to goToSleep.
synchronized (mLock) {
mAwake = true;
- if (mKeyguardDelegate != null) {
- mHandler.removeMessages(MSG_KEYGUARD_DRAWN_TIMEOUT);
- mHandler.sendEmptyMessageDelayed(MSG_KEYGUARD_DRAWN_TIMEOUT, 1000);
- }
updateWakeGestureListenerLp();
updateOrientationListenerLp();
@@ -5614,6 +5611,8 @@
mScreenOnListener = screenOnListener;
if (mKeyguardDelegate != null) {
+ mHandler.removeMessages(MSG_KEYGUARD_DRAWN_TIMEOUT);
+ mHandler.sendEmptyMessageDelayed(MSG_KEYGUARD_DRAWN_TIMEOUT, 1000);
mKeyguardDelegate.onScreenTurningOn(mKeyguardDrawnCallback);
} else {
if (DEBUG_WAKEUP) Slog.d(TAG,
diff --git a/services/core/java/com/android/server/policy/WindowOrientationListener.java b/services/core/java/com/android/server/policy/WindowOrientationListener.java
index 147efdd..c71b48f 100644
--- a/services/core/java/com/android/server/policy/WindowOrientationListener.java
+++ b/services/core/java/com/android/server/policy/WindowOrientationListener.java
@@ -465,6 +465,9 @@
pw.println(prefix + "mLastFilteredX=" + mLastFilteredX);
pw.println(prefix + "mLastFilteredY=" + mLastFilteredY);
pw.println(prefix + "mLastFilteredZ=" + mLastFilteredZ);
+ final long delta = SystemClock.elapsedRealtimeNanos() - mLastFilteredTimestampNanos;
+ pw.println(prefix + "mLastFilteredTimestampNanos=" + mLastFilteredTimestampNanos
+ + " (" + (delta * 0.000001f) + "ms ago)");
pw.println(prefix + "mTiltHistory={last: " + getLastTiltLocked() + "}");
pw.println(prefix + "mFlat=" + mFlat);
pw.println(prefix + "mSwinging=" + mSwinging);
diff --git a/services/core/java/com/android/server/updates/SELinuxPolicyInstallReceiver.java b/services/core/java/com/android/server/updates/SELinuxPolicyInstallReceiver.java
index 4e53687..c81398f 100644
--- a/services/core/java/com/android/server/updates/SELinuxPolicyInstallReceiver.java
+++ b/services/core/java/com/android/server/updates/SELinuxPolicyInstallReceiver.java
@@ -36,7 +36,7 @@
private static final String TAG = "SELinuxPolicyInstallReceiver";
private static final String sepolicyPath = "sepolicy";
- private static final String fileContextsPath = "file_contexts";
+ private static final String fileContextsPath = "file_contexts.bin";
private static final String propertyContextsPath = "property_contexts";
private static final String seappContextsPath = "seapp_contexts";
private static final String versionPath = "selinux_version";
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index b5e4342..3054422 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -342,6 +342,14 @@
"ci_action_on_sys_update_extra_val_string";
/**
+ * Specifies the amount of gap to be added in millis between DTMF tones. When a non-zero value
+ * is specified, the UE shall wait for the specified amount of time before it sends out
+ * successive DTMF tones on the network.
+ * @hide
+ */
+ public static final String KEY_IMS_DTMF_TONE_DELAY_INT = "ims_dtmf_tone_delay_int";
+
+ /**
* If this is true, the SIM card (through Customer Service Profile EF file) will be able to
* prevent manual operator selection. If false, this SIM setting will be ignored and manual
* operator selection will always be available. See CPHS4_2.WW6, CPHS B.4.7.1 for more
@@ -439,6 +447,7 @@
sDefaults.putStringArray(KEY_CDMA_ROAMING_NETWORKS_STRING_ARRAY, null);
sDefaults.putStringArray(KEY_CDMA_NONROAMING_NETWORKS_STRING_ARRAY, null);
sDefaults.putBoolean(KEY_FORCE_HOME_NETWORK_BOOL, false);
+ sDefaults.putInt(KEY_IMS_DTMF_TONE_DELAY_INT, 0);
// MMS defaults
sDefaults.putBoolean(KEY_MMS_ALIAS_ENABLED_BOOL, false);
diff --git a/tools/aapt/Command.cpp b/tools/aapt/Command.cpp
index 8a0a39c..d12ab3b 100644
--- a/tools/aapt/Command.cpp
+++ b/tools/aapt/Command.cpp
@@ -215,7 +215,7 @@
goto bail;
}
-#ifdef HAVE_ANDROID_OS
+#ifdef __ANDROID__
static const bool kHaveAndroidOs = true;
#else
static const bool kHaveAndroidOs = false;
@@ -633,7 +633,7 @@
Asset* asset = NULL;
if (strcmp("resources", option) == 0) {
-#ifndef HAVE_ANDROID_OS
+#ifndef __ANDROID__
res.print(bundle->getValues());
#endif