diff options
117 files changed, 1005 insertions, 646 deletions
diff --git a/api/current.txt b/api/current.txt index 96ecad617a91..bb751cc99b44 100644 --- a/api/current.txt +++ b/api/current.txt @@ -9920,6 +9920,7 @@ package android.content.res { public static class Resources.NotFoundException extends java.lang.RuntimeException { ctor public Resources.NotFoundException(); ctor public Resources.NotFoundException(java.lang.String); + ctor public Resources.NotFoundException(java.lang.String, java.lang.Exception); } public final class Resources.Theme { diff --git a/api/system-current.txt b/api/system-current.txt index 0605851f058d..65ecdc139777 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -10261,6 +10261,7 @@ package android.content.res { public static class Resources.NotFoundException extends java.lang.RuntimeException { ctor public Resources.NotFoundException(); ctor public Resources.NotFoundException(java.lang.String); + ctor public Resources.NotFoundException(java.lang.String, java.lang.Exception); } public final class Resources.Theme { diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index 9c880d3591c3..52ec4ccfd8f3 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -479,6 +479,14 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { public static final int PRIVATE_FLAG_ENCRYPTION_AWARE = 1 << 6; /** + * Value for {@link #privateFlags}: set to {@code true} if the application + * is AutoPlay. + * + * {@hide} + */ + public static final int PRIVATE_FLAG_AUTOPLAY = 1<<6; + + /** * Private/hidden flags. See {@code PRIVATE_FLAG_...} constants. * {@hide} */ @@ -1049,6 +1057,13 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { /** * @hide */ + public boolean isAutoPlayApp() { + return (privateFlags & ApplicationInfo.PRIVATE_FLAG_AUTOPLAY) != 0; + } + + /** + * @hide + */ @Override protected ApplicationInfo getApplicationInfo() { return this; } diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java index 0606e35a081e..7b3dde4262f4 100644 --- a/core/java/android/content/res/Resources.java +++ b/core/java/android/content/res/Resources.java @@ -48,7 +48,6 @@ import android.icu.text.PluralRules; import android.os.Build; import android.os.Bundle; import android.os.Trace; -import android.util.ArrayMap; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.LocaleList; @@ -68,7 +67,6 @@ import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; import java.io.InputStream; -import java.lang.ref.WeakReference; import java.util.Locale; /** @@ -120,9 +118,6 @@ public class Resources { private static final LongSparseArray<android.content.res.ConstantState<ColorStateList>> sPreloadedColorStateLists = new LongSparseArray<>(); - private static final String CACHE_NOT_THEMED = ""; - private static final String CACHE_NULL_THEME = "null_theme"; - // Pool of TypedArrays targeted to this Resources object. final SynchronizedPool<TypedArray> mTypedArrayPool = new SynchronizedPool<>(5); @@ -130,10 +125,11 @@ public class Resources { static Resources mSystem = null; private static boolean sPreloaded; - private static int sPreloadedDensity; - // These are protected by mAccessLock. + /** Lock object used to protect access to caches and configuration. */ private final Object mAccessLock = new Object(); + + // These are protected by mAccessLock. private final Configuration mTmpConfig = new Configuration(); private final DrawableCache mDrawableCache = new DrawableCache(this); private final DrawableCache mColorDrawableCache = new DrawableCache(this); @@ -147,7 +143,12 @@ public class Resources { /** Used to inflate drawable objects from XML. */ private DrawableInflater mDrawableInflater; + /** Lock object used to protect access to {@link #mTmpValue}. */ + private final Object mTmpValueLock = new Object(); + + /** Single-item pool used to minimize TypedValue allocations. */ private TypedValue mTmpValue = new TypedValue(); + private boolean mPreloading; private int mLastCachedXmlBlockIndex = -1; @@ -249,6 +250,10 @@ public class Resources { public NotFoundException(String name) { super(name); } + + public NotFoundException(String name, Exception cause) { + super(name, cause); + } } /** @@ -621,18 +626,15 @@ public class Resources { * @see #getDimensionPixelSize */ public float getDimension(@DimenRes int id) throws NotFoundException { - synchronized (mAccessLock) { - TypedValue value = mTmpValue; - if (value == null) { - mTmpValue = value = new TypedValue(); - } - getValue(id, value, true); + final TypedValue value = obtainTempTypedValue(id); + try { if (value.type == TypedValue.TYPE_DIMENSION) { return TypedValue.complexToDimension(value.data, mMetrics); } - throw new NotFoundException( - "Resource ID #0x" + Integer.toHexString(id) + " type #0x" - + Integer.toHexString(value.type) + " is not valid"); + throw new NotFoundException("Resource ID #0x" + Integer.toHexString(id) + + " type #0x" + Integer.toHexString(value.type) + " is not valid"); + } finally { + releaseTempTypedValue(value); } } @@ -656,19 +658,15 @@ public class Resources { * @see #getDimensionPixelSize */ public int getDimensionPixelOffset(@DimenRes int id) throws NotFoundException { - synchronized (mAccessLock) { - TypedValue value = mTmpValue; - if (value == null) { - mTmpValue = value = new TypedValue(); - } - getValue(id, value, true); + final TypedValue value = obtainTempTypedValue(id); + try { if (value.type == TypedValue.TYPE_DIMENSION) { - return TypedValue.complexToDimensionPixelOffset( - value.data, mMetrics); + return TypedValue.complexToDimensionPixelOffset(value.data, mMetrics); } - throw new NotFoundException( - "Resource ID #0x" + Integer.toHexString(id) + " type #0x" - + Integer.toHexString(value.type) + " is not valid"); + throw new NotFoundException("Resource ID #0x" + Integer.toHexString(id) + + " type #0x" + Integer.toHexString(value.type) + " is not valid"); + } finally { + releaseTempTypedValue(value); } } @@ -693,19 +691,15 @@ public class Resources { * @see #getDimensionPixelOffset */ public int getDimensionPixelSize(@DimenRes int id) throws NotFoundException { - synchronized (mAccessLock) { - TypedValue value = mTmpValue; - if (value == null) { - mTmpValue = value = new TypedValue(); - } - getValue(id, value, true); + final TypedValue value = obtainTempTypedValue(id); + try { if (value.type == TypedValue.TYPE_DIMENSION) { - return TypedValue.complexToDimensionPixelSize( - value.data, mMetrics); + return TypedValue.complexToDimensionPixelSize(value.data, mMetrics); } - throw new NotFoundException( - "Resource ID #0x" + Integer.toHexString(id) + " type #0x" - + Integer.toHexString(value.type) + " is not valid"); + throw new NotFoundException("Resource ID #0x" + Integer.toHexString(id) + + " type #0x" + Integer.toHexString(value.type) + " is not valid"); + } finally { + releaseTempTypedValue(value); } } @@ -727,18 +721,15 @@ public class Resources { * @throws NotFoundException Throws NotFoundException if the given ID does not exist. */ public float getFraction(@FractionRes int id, int base, int pbase) { - synchronized (mAccessLock) { - TypedValue value = mTmpValue; - if (value == null) { - mTmpValue = value = new TypedValue(); - } - getValue(id, value, true); + final TypedValue value = obtainTempTypedValue(id); + try { if (value.type == TypedValue.TYPE_FRACTION) { return TypedValue.complexToFraction(value.data, base, pbase); } - throw new NotFoundException( - "Resource ID #0x" + Integer.toHexString(id) + " type #0x" - + Integer.toHexString(value.type) + " is not valid"); + throw new NotFoundException("Resource ID #0x" + Integer.toHexString(id) + + " type #0x" + Integer.toHexString(value.type) + " is not valid"); + } finally { + releaseTempTypedValue(value); } } @@ -801,24 +792,14 @@ public class Resources { * not exist. */ @Nullable - public Drawable getDrawable(@DrawableRes int id, @Nullable Theme theme) throws NotFoundException { - TypedValue value; - synchronized (mAccessLock) { - value = mTmpValue; - if (value == null) { - value = new TypedValue(); - } else { - mTmpValue = null; - } - getValue(id, value, true); - } - final Drawable res = loadDrawable(value, id, theme); - synchronized (mAccessLock) { - if (mTmpValue == null) { - mTmpValue = value; - } + public Drawable getDrawable(@DrawableRes int id, @Nullable Theme theme) + throws NotFoundException { + final TypedValue value = obtainTempTypedValue(id); + try { + return loadDrawable(value, id, theme); + } finally { + releaseTempTypedValue(value); } - return res; } /** @@ -849,7 +830,8 @@ public class Resources { */ @Deprecated @Nullable - public Drawable getDrawableForDensity(@DrawableRes int id, int density) throws NotFoundException { + public Drawable getDrawableForDensity(@DrawableRes int id, int density) + throws NotFoundException { return getDrawableForDensity(id, density, null); } @@ -869,14 +851,8 @@ public class Resources { */ @Nullable public Drawable getDrawableForDensity(@DrawableRes int id, int density, @Nullable Theme theme) { - TypedValue value; - synchronized (mAccessLock) { - value = mTmpValue; - if (value == null) { - value = new TypedValue(); - } else { - mTmpValue = null; - } + final TypedValue value = obtainTempTypedValue(id); + try { getValueForDensity(id, density, value, true); /* @@ -893,15 +869,11 @@ public class Resources { value.density = (value.density * mMetrics.densityDpi) / density; } } - } - final Drawable res = loadDrawable(value, id, theme); - synchronized (mAccessLock) { - if (mTmpValue == null) { - mTmpValue = value; - } + return loadDrawable(value, id, theme); + } finally { + releaseTempTypedValue(value); } - return res; } /** @@ -963,33 +935,21 @@ public class Resources { */ @ColorInt public int getColor(@ColorRes int id, @Nullable Theme theme) throws NotFoundException { - TypedValue value; - synchronized (mAccessLock) { - value = mTmpValue; - if (value == null) { - value = new TypedValue(); - } - getValue(id, value, true); + final TypedValue value = obtainTempTypedValue(id); + try { if (value.type >= TypedValue.TYPE_FIRST_INT && value.type <= TypedValue.TYPE_LAST_INT) { - mTmpValue = value; return value.data; } else if (value.type != TypedValue.TYPE_STRING) { - throw new NotFoundException( - "Resource ID #0x" + Integer.toHexString(id) + " type #0x" - + Integer.toHexString(value.type) + " is not valid"); + throw new NotFoundException("Resource ID #0x" + Integer.toHexString(id) + + " type #0x" + Integer.toHexString(value.type) + " is not valid"); } - mTmpValue = null; - } - final ColorStateList csl = loadColorStateList(value, id, theme); - synchronized (mAccessLock) { - if (mTmpValue == null) { - mTmpValue = value; - } + final ColorStateList csl = loadColorStateList(value, id, theme); + return csl.getDefaultColor(); + } finally { + releaseTempTypedValue(value); } - - return csl.getDefaultColor(); } /** @@ -1043,25 +1003,12 @@ public class Resources { @Nullable public ColorStateList getColorStateList(@ColorRes int id, @Nullable Theme theme) throws NotFoundException { - TypedValue value; - synchronized (mAccessLock) { - value = mTmpValue; - if (value == null) { - value = new TypedValue(); - } else { - mTmpValue = null; - } - getValue(id, value, true); - } - - final ColorStateList res = loadColorStateList(value, id, theme); - synchronized (mAccessLock) { - if (mTmpValue == null) { - mTmpValue = value; - } + final TypedValue value = obtainTempTypedValue(id); + try { + return loadColorStateList(value, id, theme); + } finally { + releaseTempTypedValue(value); } - - return res; } /** @@ -1078,19 +1025,16 @@ public class Resources { * @return Returns the boolean value contained in the resource. */ public boolean getBoolean(@BoolRes int id) throws NotFoundException { - synchronized (mAccessLock) { - TypedValue value = mTmpValue; - if (value == null) { - mTmpValue = value = new TypedValue(); - } - getValue(id, value, true); + final TypedValue value = obtainTempTypedValue(id); + try { if (value.type >= TypedValue.TYPE_FIRST_INT - && value.type <= TypedValue.TYPE_LAST_INT) { + && value.type <= TypedValue.TYPE_LAST_INT) { return value.data != 0; } - throw new NotFoundException( - "Resource ID #0x" + Integer.toHexString(id) + " type #0x" - + Integer.toHexString(value.type) + " is not valid"); + throw new NotFoundException("Resource ID #0x" + Integer.toHexString(id) + + " type #0x" + Integer.toHexString(value.type) + " is not valid"); + } finally { + releaseTempTypedValue(value); } } @@ -1106,19 +1050,16 @@ public class Resources { * @return Returns the integer value contained in the resource. */ public int getInteger(@IntegerRes int id) throws NotFoundException { - synchronized (mAccessLock) { - TypedValue value = mTmpValue; - if (value == null) { - mTmpValue = value = new TypedValue(); - } - getValue(id, value, true); + final TypedValue value = obtainTempTypedValue(id); + try { if (value.type >= TypedValue.TYPE_FIRST_INT - && value.type <= TypedValue.TYPE_LAST_INT) { + && value.type <= TypedValue.TYPE_LAST_INT) { return value.data; } - throw new NotFoundException( - "Resource ID #0x" + Integer.toHexString(id) + " type #0x" - + Integer.toHexString(value.type) + " is not valid"); + throw new NotFoundException("Resource ID #0x" + Integer.toHexString(id) + + " type #0x" + Integer.toHexString(value.type) + " is not valid"); + } finally { + releaseTempTypedValue(value); } } @@ -1136,17 +1077,15 @@ public class Resources { * @hide Pending API council approval. */ public float getFloat(int id) { - synchronized (mAccessLock) { - TypedValue value = mTmpValue; - if (value == null) { - mTmpValue = value = new TypedValue(); - } - getValue(id, value, true); + final TypedValue value = obtainTempTypedValue(id); + try { if (value.type == TypedValue.TYPE_FLOAT) { return value.getFloat(); } - throw new NotFoundException("Resource ID #0x" + Integer.toHexString(id) + " type #0x" - + Integer.toHexString(value.type) + " is not valid"); + throw new NotFoundException("Resource ID #0x" + Integer.toHexString(id) + + " type #0x" + Integer.toHexString(value.type) + " is not valid"); + } finally { + releaseTempTypedValue(value); } } @@ -1238,22 +1177,60 @@ public class Resources { * */ public InputStream openRawResource(@RawRes int id) throws NotFoundException { - TypedValue value; - synchronized (mAccessLock) { - value = mTmpValue; - if (value == null) { - value = new TypedValue(); - } else { + final TypedValue value = obtainTempTypedValue(); + try { + return openRawResource(id, value); + } finally { + releaseTempTypedValue(value); + } + } + + /** + * Returns a TypedValue populated with data for the specified resource ID + * that's suitable for temporary use. The obtained TypedValue should be + * released using {@link #releaseTempTypedValue(TypedValue)}. + * + * @param id the resource ID for which data should be obtained + * @return a populated typed value suitable for temporary use + */ + private TypedValue obtainTempTypedValue(@AnyRes int id) { + final TypedValue value = obtainTempTypedValue(); + getValue(id, value, true); + return value; + } + + /** + * Returns a TypedValue suitable for temporary use. The obtained TypedValue + * should be released using {@link #releaseTempTypedValue(TypedValue)}. + * + * @return a typed value suitable for temporary use + */ + private TypedValue obtainTempTypedValue() { + TypedValue tmpValue = null; + synchronized (mTmpValueLock) { + if (mTmpValue != null) { + tmpValue = mTmpValue; mTmpValue = null; } } - InputStream res = openRawResource(id, value); - synchronized (mAccessLock) { + if (tmpValue == null) { + return new TypedValue(); + } + return tmpValue; + } + + /** + * Returns a TypedValue to the pool. After calling this method, the + * specified TypedValue should no longer be accessed. + * + * @param value the typed value to return to the pool + */ + private void releaseTempTypedValue(TypedValue value) { + synchronized (mTmpValueLock) { if (mTmpValue == null) { mTmpValue = value; } } - return res; } /** @@ -1307,32 +1284,14 @@ public class Resources { */ public AssetFileDescriptor openRawResourceFd(@RawRes int id) throws NotFoundException { - TypedValue value; - synchronized (mAccessLock) { - value = mTmpValue; - if (value == null) { - value = new TypedValue(); - } else { - mTmpValue = null; - } - getValue(id, value, true); - } + final TypedValue value = obtainTempTypedValue(id); try { - return mAssets.openNonAssetFd( - value.assetCookie, value.string.toString()); + return mAssets.openNonAssetFd(value.assetCookie, value.string.toString()); } catch (Exception e) { - NotFoundException rnf = new NotFoundException( - "File " + value.string.toString() - + " from drawable resource ID #0x" - + Integer.toHexString(id)); - rnf.initCause(e); - throw rnf; + throw new NotFoundException("File " + value.string.toString() + " from drawable " + + "resource ID #0x" + Integer.toHexString(id), e); } finally { - synchronized (mAccessLock) { - if (mTmpValue == null) { - mTmpValue = value; - } - } + releaseTempTypedValue(value); } } @@ -2015,8 +1974,8 @@ public class Resources { Build.VERSION.RESOURCES_SDK_INT); if (DEBUG_CONFIG) { - Slog.i(TAG, "**** Updating config of " + this + ": final config is " + mConfiguration - + " final compat is " + mCompatibilityInfo); + Slog.i(TAG, "**** Updating config of " + this + ": final config is " + + mConfiguration + " final compat is " + mCompatibilityInfo); } mDrawableCache.onConfigurationChange(configChanges); @@ -2402,8 +2361,7 @@ public class Resources { } sPreloaded = true; mPreloading = true; - sPreloadedDensity = DisplayMetrics.DENSITY_DEVICE; - mConfiguration.densityDpi = sPreloadedDensity; + mConfiguration.densityDpi = DisplayMetrics.DENSITY_DEVICE; updateConfiguration(null, null); } } @@ -2740,19 +2698,16 @@ public class Resources { /*package*/ XmlResourceParser loadXmlResourceParser(int id, String type) throws NotFoundException { - synchronized (mAccessLock) { - TypedValue value = mTmpValue; - if (value == null) { - mTmpValue = value = new TypedValue(); - } - getValue(id, value, true); + final TypedValue value = obtainTempTypedValue(id); + try { if (value.type == TypedValue.TYPE_STRING) { return loadXmlResourceParser(value.string.toString(), id, value.assetCookie, type); } - throw new NotFoundException( - "Resource ID #0x" + Integer.toHexString(id) + " type #0x" - + Integer.toHexString(value.type) + " is not valid"); + throw new NotFoundException("Resource ID #0x" + Integer.toHexString(id) + + " type #0x" + Integer.toHexString(value.type) + " is not valid"); + } finally { + releaseTempTypedValue(value); } } diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java index ee0680689412..122b83ad8a89 100644 --- a/core/java/android/view/inputmethod/InputMethodManager.java +++ b/core/java/android/view/inputmethod/InputMethodManager.java @@ -443,30 +443,18 @@ public final class InputMethodManager { if (DEBUG) { Log.i(TAG, "handleMessage: MSG_UNBIND " + sequence); } - boolean startInput = false; + final boolean startInput; synchronized (mH) { - if (mBindSequence == sequence) { - if (false) { - // XXX the server has already unbound! - if (mCurMethod != null && mCurrentTextBoxAttribute != null) { - try { - mCurMethod.finishInput(); - } catch (RemoteException e) { - Log.w(TAG, "IME died: " + mCurId, e); - } - } - } - clearBindingLocked(); - - // If we were actively using the last input method, then - // we would like to re-connect to the next input method. - if (mServedView != null && mServedView.isFocused()) { - mServedConnecting = true; - } - if (mActive) { - startInput = true; - } + if (mBindSequence != sequence) { + return; + } + clearBindingLocked(); + // If we were actively using the last input method, then + // we would like to re-connect to the next input method. + if (mServedView != null && mServedView.isFocused()) { + mServedConnecting = true; } + startInput = mActive; } if (startInput) { startInputInner(null, 0, 0, 0); diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp index 703a9bd2fcd5..a805b6d1d151 100755 --- a/core/jni/android/graphics/Bitmap.cpp +++ b/core/jni/android/graphics/Bitmap.cpp @@ -1006,6 +1006,7 @@ static jobject Bitmap_createFromParcel(JNIEnv* env, jobject, jobject parcel) { // is disposed. int dupFd = dup(blob.fd()); if (dupFd < 0) { + ALOGE("Error allocating dup fd. Error:%d", errno); blob.release(); SkSafeUnref(ctable); doThrowRE(env, "Could not allocate dup blob fd."); diff --git a/core/jni/android_util_Log.cpp b/core/jni/android_util_Log.cpp index c89f293c05a2..2d23cda5ff15 100644 --- a/core/jni/android_util_Log.cpp +++ b/core/jni/android_util_Log.cpp @@ -42,9 +42,7 @@ struct levels_t { static levels_t levels; static jboolean isLoggable(const char* tag, jint level) { - return __android_log_is_loggable(level, tag, - ANDROID_LOG_INFO | - ANDROID_LOGGABLE_FLAG_NOT_WITHIN_SIGNAL); + return __android_log_is_loggable(level, tag, ANDROID_LOG_INFO); } static jboolean android_util_Log_isLoggable(JNIEnv* env, jobject clazz, jstring tag, jint level) diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index f900301c61d5..6f6d1b0b43df 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -420,7 +420,7 @@ <string name="permdesc_useFingerprint" msgid="9165097460730684114">"指紋ハードウェアを認証に使用することをアプリに許可します"</string> <string name="fingerprint_acquired_partial" msgid="735082772341716043">"指紋を一部しか検出できませんでした。もう一度お試しください。"</string> <string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"指紋を処理できませんでした。もう一度お試しください。"</string> - <string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"指紋センサーに汚れがあります。汚れを落としてもう一度お試しください。"</string> + <string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"指紋認証センサーに汚れがあります。汚れを落としてもう一度お試しください。"</string> <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"指の動きが速すぎました。もう一度お試しください。"</string> <string name="fingerprint_acquired_too_slow" msgid="59250885689661653">"指の動きが遅すぎました。もう一度お試しください。"</string> <string-array name="fingerprint_acquired_vendor"> diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java index 64f269886c70..a50c945ca4f6 100644 --- a/graphics/java/android/graphics/drawable/Drawable.java +++ b/graphics/java/android/graphics/drawable/Drawable.java @@ -1240,30 +1240,54 @@ public abstract class Drawable { */ public static abstract class ConstantState { /** - * Create a new drawable without supplying resources the caller - * is running in. Note that using this means the density-dependent - * drawables (like bitmaps) will not be able to update their target - * density correctly. One should use {@link #newDrawable(Resources)} - * instead to provide a resource. + * Creates a new Drawable instance from its constant state. + * <p> + * <strong>Note:</strong> Using this method means density-dependent + * properties, such as pixel dimensions or bitmap images, will not be + * updated to match the density of the target display. To ensure + * correct scaling, use {@link #newDrawable(Resources)} instead to + * provide an appropriate Resources object. + * + * @return a new drawable object based on this constant state + * @see {@link #newDrawable(Resources)} */ + @NonNull public abstract Drawable newDrawable(); /** - * Create a new Drawable instance from its constant state. This - * must be implemented for drawables that change based on the target - * density of their caller (that is depending on whether it is - * in compatibility mode). + * Creates a new Drawable instance from its constant state using the + * specified resources. This method should be implemented for drawables + * that have density-dependent properties. + * <p> + * The default implementation for this method calls through to + * {@link #newDrawable()}. + * + * @param res the resources of the context in which the drawable will + * be displayed + * @return a new drawable object based on this constant state */ - public Drawable newDrawable(Resources res) { + @NonNull + public Drawable newDrawable(@Nullable Resources res) { return newDrawable(); } /** - * Create a new Drawable instance from its constant state. This must be - * implemented for drawables that can have a theme applied. + * Creates a new Drawable instance from its constant state using the + * specified resources and theme. This method should be implemented for + * drawables that have theme-dependent properties. + * <p> + * The default implementation for this method calls through to + * {@link #newDrawable(Resources)}. + * + * @param res the resources of the context in which the drawable will + * be displayed + * @param theme the theme of the context in which the drawable will be + * displayed + * @return a new drawable object based on this constant state */ - public Drawable newDrawable(Resources res, Theme theme) { - return newDrawable(null); + @NonNull + public Drawable newDrawable(@Nullable Resources res, @Nullable Theme theme) { + return newDrawable(res); } /** diff --git a/libs/hwui/Caches.cpp b/libs/hwui/Caches.cpp index 94a11f131229..a327614a50ef 100644 --- a/libs/hwui/Caches.cpp +++ b/libs/hwui/Caches.cpp @@ -79,6 +79,7 @@ bool Caches::init() { } void Caches::initExtensions() { + mExtensions.load(); if (mExtensions.hasDebugMarker()) { eventMark = glInsertEventMarkerEXT; diff --git a/media/java/android/media/browse/MediaBrowser.java b/media/java/android/media/browse/MediaBrowser.java index e0a8026221e7..41b8ab2d3c40 100644 --- a/media/java/android/media/browse/MediaBrowser.java +++ b/media/java/android/media/browse/MediaBrowser.java @@ -44,7 +44,6 @@ import android.util.Log; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.ref.WeakReference; -import java.util.Collections; import java.util.List; /** @@ -519,13 +518,10 @@ public final class MediaBrowser { return; } - List<MediaItem> data = list.getList(); + List<MediaItem> data = list == null ? null : list.getList(); if (DBG) { Log.d(TAG, "onLoadChildren for " + mServiceComponent + " id=" + parentId); } - if (data == null) { - data = Collections.emptyList(); - } // Check that the subscription is still subscribed. final Subscription subscription = mSubscriptions.get(parentId); @@ -730,10 +726,9 @@ public final class MediaBrowser { * Called when the list of children is loaded or updated. * * @param parentId The media id of the parent media item. - * @param children The children which were loaded. + * @param children The children which were loaded, or null if the id is invalid. */ - public void onChildrenLoaded(@NonNull String parentId, - @NonNull List<MediaItem> children) { + public void onChildrenLoaded(@NonNull String parentId, List<MediaItem> children) { } /** diff --git a/media/java/android/service/media/MediaBrowserService.java b/media/java/android/service/media/MediaBrowserService.java index 1bb99ff864ae..f2c6a6cafaef 100644 --- a/media/java/android/service/media/MediaBrowserService.java +++ b/media/java/android/service/media/MediaBrowserService.java @@ -469,10 +469,6 @@ public abstract class MediaBrowserService extends Service { = new Result<List<MediaBrowser.MediaItem>>(parentId) { @Override void onResultSent(List<MediaBrowser.MediaItem> list) { - if (list == null) { - throw new IllegalStateException("onLoadChildren sent null list for id " - + parentId); - } if (mConnections.get(connection.callbacks.asBinder()) != connection) { if (DBG) { Log.d(TAG, "Not sending onLoadChildren result for connection that has" @@ -481,7 +477,8 @@ public abstract class MediaBrowserService extends Service { return; } - final ParceledListSlice<MediaBrowser.MediaItem> pls = new ParceledListSlice(list); + final ParceledListSlice<MediaBrowser.MediaItem> pls = + list == null ? null : new ParceledListSlice(list); try { connection.callbacks.onLoadChildren(parentId, pls); } catch (RemoteException ex) { diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/CopyTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/CopyTest.java index 6f1a89baf525..369ab7dc59ea 100644 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/CopyTest.java +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/CopyTest.java @@ -32,6 +32,8 @@ import android.provider.DocumentsContract.Document; import android.test.MoreAsserts; import android.test.ServiceTestCase; import android.test.mock.MockContentResolver; +import android.test.suitebuilder.annotation.MediumTest; +import android.test.suitebuilder.annotation.SmallTest; import android.util.Log; import com.android.documentsui.model.DocumentInfo; @@ -52,6 +54,7 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +@MediumTest public class CopyTest extends ServiceTestCase<CopyService> { public CopyTest() { @@ -89,9 +92,6 @@ public class CopyTest extends ServiceTestCase<CopyService> { super.tearDown(); } - /** - * Test copying a single file. - */ public void testCopyFile() throws Exception { String srcPath = "/test0.txt"; Uri testFile = mStorage.createFile(SRC_ROOT, srcPath, "text/plain", @@ -131,9 +131,6 @@ public class CopyTest extends ServiceTestCase<CopyService> { MoreAsserts.assertEquals("Moved file contents differ", testContent.getBytes(), dstContent); } - /** - * Test copying multiple files. - */ public void testCopyMultipleFiles() throws Exception { String testContent[] = { "The five boxing wizards jump quickly", diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/FilesActivityUiTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/FilesActivityUiTest.java index 906051640c6a..ba91c83b95e8 100644 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/FilesActivityUiTest.java +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/FilesActivityUiTest.java @@ -31,11 +31,13 @@ import android.support.test.uiautomator.Configurator; import android.support.test.uiautomator.UiDevice; import android.support.test.uiautomator.Until; import android.test.InstrumentationTestCase; +import android.test.suitebuilder.annotation.LargeTest; import android.util.Log; import android.view.MotionEvent; import com.android.documentsui.model.RootInfo; +@LargeTest public class FilesActivityUiTest extends InstrumentationTestCase { private static final int TIMEOUT = 5000; diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/DirectoryFragmentModelTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/DirectoryFragmentModelTest.java index 746e2117dc02..b250e5d344c4 100644 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/DirectoryFragmentModelTest.java +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/DirectoryFragmentModelTest.java @@ -25,6 +25,7 @@ import android.provider.DocumentsContract.Document; import android.support.v7.widget.RecyclerView; import android.test.AndroidTestCase; import android.test.mock.MockContentResolver; +import android.test.suitebuilder.annotation.SmallTest; import android.view.ViewGroup; import com.android.documentsui.DirectoryResult; @@ -34,6 +35,7 @@ import com.android.documentsui.model.DocumentInfo; import java.util.List; +@SmallTest public class DirectoryFragmentModelTest extends AndroidTestCase { private static final int ITEM_COUNT = 5; diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/MultiSelectManagerTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/MultiSelectManagerTest.java index d1ce56457a87..b3d45aee48b1 100644 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/MultiSelectManagerTest.java +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/MultiSelectManagerTest.java @@ -18,6 +18,7 @@ package com.android.documentsui.dirlist; import android.support.v7.widget.RecyclerView; import android.test.AndroidTestCase; +import android.test.suitebuilder.annotation.SmallTest; import android.util.SparseBooleanArray; import android.view.View; import android.view.ViewGroup; @@ -32,6 +33,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +@SmallTest public class MultiSelectManagerTest extends AndroidTestCase { private static final List<String> items; @@ -163,7 +165,6 @@ public class MultiSelectManagerTest extends AndroidTestCase { assertRangeSelection(14, 17); } - public void testSingleTapUp_ShiftReversesSelectionDirection() { longPress(7); shiftTap(17); diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/MultiSelectManager_GridModelTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/MultiSelectManager_GridModelTest.java index c4b6ce5c7f87..c856b2290ea1 100644 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/MultiSelectManager_GridModelTest.java +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/MultiSelectManager_GridModelTest.java @@ -20,11 +20,13 @@ import android.graphics.Point; import android.graphics.Rect; import android.support.v7.widget.RecyclerView.OnScrollListener; import android.test.AndroidTestCase; +import android.test.suitebuilder.annotation.SmallTest; import android.util.SparseBooleanArray; import android.view.View; import com.android.documentsui.dirlist.MultiSelectManager.GridModel; +@SmallTest public class MultiSelectManager_GridModelTest extends AndroidTestCase { private static final int VIEW_PADDING_PX = 5; diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/MultiSelectManager_SelectionTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/MultiSelectManager_SelectionTest.java index 64da750b1306..72fc10814e72 100644 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/MultiSelectManager_SelectionTest.java +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/MultiSelectManager_SelectionTest.java @@ -17,10 +17,11 @@ package com.android.documentsui.dirlist; import android.test.AndroidTestCase; +import android.test.suitebuilder.annotation.SmallTest; import com.android.documentsui.dirlist.MultiSelectManager.Selection; - +@SmallTest public class MultiSelectManager_SelectionTest extends AndroidTestCase{ private Selection selection; diff --git a/packages/Keyguard/res/values-ja/strings.xml b/packages/Keyguard/res/values-ja/strings.xml index cea4319b2fd4..3230bebea83a 100644 --- a/packages/Keyguard/res/values-ja/strings.xml +++ b/packages/Keyguard/res/values-ja/strings.xml @@ -110,8 +110,8 @@ <string name="keyguard_carrier_default" msgid="8700650403054042153">"通信サービスはありません。"</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"入力方法の切り替えボタン。"</string> <string name="airplane_mode" msgid="3122107900897202805">"機内モード"</string> - <string name="kg_prompt_reason_restart_pattern" msgid="489430505491862444">"端末を再起動するにはパターンが必要です。"</string> - <string name="kg_prompt_reason_restart_pin" msgid="994878216570694974">"端末を再起動するにはPINが必要です。"</string> + <string name="kg_prompt_reason_restart_pattern" msgid="489430505491862444">"端末を再起動した時にはパターンが必要です。"</string> + <string name="kg_prompt_reason_restart_pin" msgid="994878216570694974">"端末を再起動した時にはPINが必要です。"</string> <string name="kg_prompt_reason_restart_password" msgid="2375742919528461664">"端末を再起動した時にはパスワードが必要です。"</string> <string name="kg_prompt_reason_timeout_pattern" msgid="8930047492617900785">"セキュリティを強化するため、パターンが必要です。"</string> <string name="kg_prompt_reason_timeout_pin" msgid="7470468607947726377">"セキュリティを強化するため、PINが必要です。"</string> diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java index e3be534b35ce..3151ccb3c9cd 100644 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java @@ -71,6 +71,11 @@ import java.util.Map; @VisibleForTesting class MtpDatabase { private final MtpDatabaseInternal mDatabase; + + /** + * Mapping mode for roots/documents where we start adding child documents. + * Methods operate the state needs to be synchronized. + */ private final Map<String, Integer> mMappingMode = new HashMap<>(); @VisibleForTesting @@ -78,23 +83,49 @@ class MtpDatabase { mDatabase = new MtpDatabaseInternal(context); } + /** + * Closes the database. + */ @VisibleForTesting + void close() { + mDatabase.close(); + } + + /** + * {@link MtpDatabaseInternal#queryRoots} + */ Cursor queryRoots(String[] columnNames) { return mDatabase.queryRoots(columnNames); } + /** + * {@link MtpDatabaseInternal#queryRootDocuments} + */ @VisibleForTesting Cursor queryRootDocuments(String[] columnNames) { return mDatabase.queryRootDocuments(columnNames); } + /** + * {@link MtpDatabaseInternal#queryChildDocuments} + */ @VisibleForTesting Cursor queryChildDocuments(String[] columnNames, String parentDocumentId) { return mDatabase.queryChildDocuments(columnNames, parentDocumentId); } - @VisibleForTesting - void startAddingRootDocuments(int deviceId) { + /** + * {@link MtpDatabaseInternal#removeDeviceRows} + */ + void removeDeviceRows(int deviceId) { + mDatabase.removeDeviceRows(deviceId); + } + + /** + * Invokes {@link MtpDatabaseInternal#startAddingDocuments} for root documents. + * @param deviceId Device ID. + */ + synchronized void startAddingRootDocuments(int deviceId) { final String mappingStateKey = getRootDocumentsMappingStateKey(deviceId); if (mMappingMode.containsKey(mappingStateKey)) { throw new Error("Mapping for the root has already started."); @@ -105,8 +136,12 @@ class MtpDatabase { SELECTION_ROOT_DOCUMENTS, Integer.toString(deviceId))); } + /** + * Invokes {@link MtpDatabaseInternal#startAddingDocuments} for child of specific documents. + * @param parentDocumentId Document ID for parent document. + */ @VisibleForTesting - void startAddingChildDocuments(String parentDocumentId) { + synchronized void startAddingChildDocuments(String parentDocumentId) { final String mappingStateKey = getChildDocumentsMappingStateKey(parentDocumentId); if (mMappingMode.containsKey(mappingStateKey)) { throw new Error("Mapping for the root has already started."); @@ -116,20 +151,18 @@ class MtpDatabase { mDatabase.startAddingDocuments(SELECTION_CHILD_DOCUMENTS, parentDocumentId)); } - @VisibleForTesting - void putRootDocuments(int deviceId, Resources resources, MtpRoot[] roots) { + /** + * Puts root information to database. + * @param deviceId Device ID + * @param resources Resources required to localize root name. + * @param roots List of root information. + * @return If roots are added or removed from the database. + */ + synchronized boolean putRootDocuments(int deviceId, Resources resources, MtpRoot[] roots) { mDatabase.beginTransaction(); try { - final ContentValues[] valuesList = new ContentValues[roots.length]; - for (int i = 0; i < roots.length; i++) { - if (roots[i].mDeviceId != deviceId) { - throw new IllegalArgumentException(); - } - valuesList[i] = new ContentValues(); - getRootDocumentValues(valuesList[i], resources, roots[i]); - } - boolean heuristic; - String mapColumn; + final boolean heuristic; + final String mapColumn; switch (mMappingMode.get(getRootDocumentsMappingStateKey(deviceId))) { case MAP_BY_MTP_IDENTIFIER: heuristic = false; @@ -142,7 +175,15 @@ class MtpDatabase { default: throw new Error("Unexpected map mode."); } - final long[] documentIds = mDatabase.putDocuments( + final ContentValues[] valuesList = new ContentValues[roots.length]; + for (int i = 0; i < roots.length; i++) { + if (roots[i].mDeviceId != deviceId) { + throw new IllegalArgumentException(); + } + valuesList[i] = new ContentValues(); + getRootDocumentValues(valuesList[i], resources, roots[i]); + } + final boolean changed = mDatabase.putDocuments( valuesList, SELECTION_ROOT_DOCUMENTS, Integer.toString(deviceId), @@ -152,33 +193,38 @@ class MtpDatabase { int i = 0; for (final MtpRoot root : roots) { // Use the same value for the root ID and the corresponding document ID. - values.put(Root.COLUMN_ROOT_ID, documentIds[i++]); values.put( - Root.COLUMN_FLAGS, Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE); + Root.COLUMN_ROOT_ID, + valuesList[i++].getAsString(Document.COLUMN_DOCUMENT_ID)); + values.put( + Root.COLUMN_FLAGS, + Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE); values.put(Root.COLUMN_AVAILABLE_BYTES, root.mFreeSpace); values.put(Root.COLUMN_CAPACITY_BYTES, root.mMaxCapacity); values.put(Root.COLUMN_MIME_TYPES, ""); mDatabase.putRootExtra(values); } mDatabase.setTransactionSuccessful(); + return changed; } finally { mDatabase.endTransaction(); } } + /** + * Puts document information to database. + * @param deviceId Device ID + * @param parentId Parent document ID. + * @param documents List of document information. + */ @VisibleForTesting - void putChildDocuments(int deviceId, String parentId, MtpObjectInfo[] documents) { - final ContentValues[] valuesList = new ContentValues[documents.length]; - for (int i = 0; i < documents.length; i++) { - valuesList[i] = new ContentValues(); - getChildDocumentValues(valuesList[i], deviceId, parentId, documents[i]); - } - boolean heuristic; - String mapColumn; + synchronized void putChildDocuments(int deviceId, String parentId, MtpObjectInfo[] documents) { + final boolean heuristic; + final String mapColumn; switch (mMappingMode.get(getChildDocumentsMappingStateKey(parentId))) { case MAP_BY_MTP_IDENTIFIER: heuristic = false; - mapColumn = COLUMN_STORAGE_ID; + mapColumn = COLUMN_OBJECT_HANDLE; break; case MAP_BY_NAME: heuristic = true; @@ -187,40 +233,55 @@ class MtpDatabase { default: throw new Error("Unexpected map mode."); } + final ContentValues[] valuesList = new ContentValues[documents.length]; + for (int i = 0; i < documents.length; i++) { + valuesList[i] = new ContentValues(); + getChildDocumentValues(valuesList[i], deviceId, parentId, documents[i]); + } mDatabase.putDocuments( valuesList, SELECTION_CHILD_DOCUMENTS, parentId, heuristic, mapColumn); } + /** + * Clears mapping between MTP identifier and document/root ID. + */ @VisibleForTesting - void clearMapping() { + synchronized void clearMapping() { mDatabase.clearMapping(); mMappingMode.clear(); } - @VisibleForTesting - void stopAddingRootDocuments(int deviceId) { + /** + * Stops adding root documents. + * @param deviceId Device ID. + * @return True if new rows are added/removed. + */ + synchronized boolean stopAddingRootDocuments(int deviceId) { final String mappingModeKey = getRootDocumentsMappingStateKey(deviceId); switch (mMappingMode.get(mappingModeKey)) { case MAP_BY_MTP_IDENTIFIER: - mDatabase.stopAddingDocuments( + mMappingMode.remove(mappingModeKey); + return mDatabase.stopAddingDocuments( SELECTION_ROOT_DOCUMENTS, Integer.toString(deviceId), COLUMN_STORAGE_ID); - break; case MAP_BY_NAME: - mDatabase.stopAddingDocuments( + mMappingMode.remove(mappingModeKey); + return mDatabase.stopAddingDocuments( SELECTION_ROOT_DOCUMENTS, Integer.toString(deviceId), Document.COLUMN_DISPLAY_NAME); - break; default: throw new Error("Unexpected mapping state."); } - mMappingMode.remove(mappingModeKey); } + /** + * Stops adding documents under the parent. + * @param parentId Document ID of the parent. + */ @VisibleForTesting - void stopAddingChildDocuments(String parentId) { + synchronized void stopAddingChildDocuments(String parentId) { final String mappingModeKey = getChildDocumentsMappingStateKey(parentId); switch (mMappingMode.get(mappingModeKey)) { case MAP_BY_MTP_IDENTIFIER: @@ -303,11 +364,19 @@ class MtpDatabase { values.put(Document.COLUMN_SIZE, info.getCompressedSize()); } - private String getRootDocumentsMappingStateKey(int deviceId) { + /** + * @param deviceId Device ID. + * @return Key for {@link #mMappingMode}. + */ + private static String getRootDocumentsMappingStateKey(int deviceId) { return "RootDocuments/" + deviceId; } - private String getChildDocumentsMappingStateKey(String parentDocumentId) { + /** + * @param parentDocumentId Document ID for the parent document. + * @return Key for {@link #mMappingMode}. + */ + private static String getChildDocumentsMappingStateKey(String parentDocumentId) { return "ChildDocuments/" + parentDocumentId; } } diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabaseConstants.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabaseConstants.java index 5fb16ec840e0..977b12ed7366 100644 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabaseConstants.java +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabaseConstants.java @@ -126,7 +126,11 @@ class MtpDatabaseConstants { Root.COLUMN_TITLE + "," + TABLE_DOCUMENTS + "." + Document.COLUMN_SUMMARY + " AS " + Root.COLUMN_SUMMARY + "," + + // Temporary replace COLUMN_DOCUMENT_ID with old format. TABLE_DOCUMENTS + "." + Document.COLUMN_DOCUMENT_ID + " AS " + + Root.COLUMN_DOCUMENT_ID + "_," + + TABLE_DOCUMENTS + "." + COLUMN_DEVICE_ID + "|| '_' ||" + + TABLE_DOCUMENTS + "." + COLUMN_STORAGE_ID + "||'_0' AS " + Root.COLUMN_DOCUMENT_ID + "," + TABLE_ROOT_EXTRA + "." + Root.COLUMN_AVAILABLE_BYTES + "," + TABLE_ROOT_EXTRA + "." + Root.COLUMN_CAPACITY_BYTES + "," + diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabaseInternal.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabaseInternal.java index 730012d678b6..7328f054b16d 100644 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabaseInternal.java +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabaseInternal.java @@ -59,6 +59,15 @@ class MtpDatabaseInternal { mDatabase = helper.getWritableDatabase(); } + void close() { + mDatabase.close(); + } + + /** + * Queries roots information. + * @param columnNames Column names defined in {@link android.provider.DocumentsContract.Root}. + * @return Database cursor. + */ Cursor queryRoots(String[] columnNames) { return mDatabase.query( VIEW_ROOTS, @@ -70,6 +79,12 @@ class MtpDatabaseInternal { null); } + /** + * Queries root documents information. + * @param columnNames Column names defined in + * {@link android.provider.DocumentsContract.Document}. + * @return Database cursor. + */ Cursor queryRootDocuments(String[] columnNames) { return mDatabase.query( TABLE_DOCUMENTS, @@ -81,6 +96,12 @@ class MtpDatabaseInternal { null); } + /** + * Queries documents information. + * @param columnNames Column names defined in + * {@link android.provider.DocumentsContract.Document}. + * @return Database cursor. + */ Cursor queryChildDocuments(String[] columnNames, String parentDocumentId) { return mDatabase.query( TABLE_DOCUMENTS, @@ -93,6 +114,14 @@ class MtpDatabaseInternal { } /** + * Remove all rows belong to a device. + * @param deviceId Device ID. + */ + void removeDeviceRows(int deviceId) { + deleteDocumentsAndRoots(COLUMN_DEVICE_ID + "=?", strings(deviceId)); + } + + /** * Starts adding new documents. * The methods decides mapping mode depends on if all documents under the given parent have MTP * identifier or not. If all the documents have MTP identifier, it uses the identifier to find @@ -133,24 +162,23 @@ class MtpDatabaseInternal { * existing rows with the new values. If the mapping mode is heuristic, it adds some new rows as * 'pending' state when that rows may be corresponding to existing 'invalidated' rows. Then * {@link #stopAddingDocuments(String, String, String)} turns the pending rows into 'valid' - * rows. + * rows. If the methods adds rows to database, it updates valueList with correct document ID. * * @param valuesList Values that are stored in the database. * @param selection SQL where closure to select rows that shares the same parent. * @param arg Argument for selection SQL. * @param heuristic Whether the mapping mode is heuristic. - * @return List of Document ID inserted to the table. + * @return Whether the method adds new rows. */ - long[] putDocuments( + boolean putDocuments( ContentValues[] valuesList, String selection, String arg, boolean heuristic, String mappingKey) { + boolean added = false; mDatabase.beginTransaction(); try { - final long[] documentIds = new long[valuesList.length]; - int i = 0; for (final ContentValues values : valuesList) { final Cursor candidateCursor = mDatabase.query( TABLE_DOCUMENTS, @@ -166,6 +194,7 @@ class MtpDatabaseInternal { final long rowId; if (candidateCursor.getCount() == 0) { rowId = mDatabase.insert(TABLE_DOCUMENTS, null, values); + added = true; } else if (!heuristic) { candidateCursor.moveToNext(); final String documentId = candidateCursor.getString(0); @@ -177,17 +206,21 @@ class MtpDatabaseInternal { } // Document ID is a primary integer key of the table. So the returned row // IDs should be same with the document ID. - documentIds[i++] = rowId; + values.put(Document.COLUMN_DOCUMENT_ID, rowId); candidateCursor.close(); } mDatabase.setTransactionSuccessful(); - return documentIds; + return added; } finally { mDatabase.endTransaction(); } } + /** + * Puts extra information for root documents. + * @param values Values containing extra information. + */ void putRootExtra(ContentValues values) { mDatabase.replace(TABLE_ROOT_EXTRA, null, values); } @@ -199,8 +232,9 @@ class MtpDatabaseInternal { * @param selection Query to select rows for resolving. * @param arg Argument for selection SQL. * @param groupKey Column name used to find corresponding rows. + * @return Whether the methods adds or removed visible rows. */ - void stopAddingDocuments(String selection, String arg, String groupKey) { + boolean stopAddingDocuments(String selection, String arg, String groupKey) { mDatabase.beginTransaction(); try { // Get 1-to-1 mapping of invalidated document and pending document. @@ -265,22 +299,29 @@ class MtpDatabaseInternal { } mergingCursor.close(); + boolean changed = false; + // Delete all invalidated rows that cannot be mapped. - deleteDocumentsAndRoots( + if (deleteDocumentsAndRoots( COLUMN_ROW_STATE + " = ? AND " + selection, - strings(ROW_STATE_INVALIDATED, arg)); + strings(ROW_STATE_INVALIDATED, arg))) { + changed = true; + } // The database cannot find old document ID for the pending rows. // Turn the all pending rows into valid state, which means the rows become to be // valid with new document ID. values.clear(); values.put(COLUMN_ROW_STATE, ROW_STATE_VALID); - mDatabase.update( + if (mDatabase.update( TABLE_DOCUMENTS, values, COLUMN_ROW_STATE + " = ? AND " + selection, - strings(ROW_STATE_PENDING, arg)); + strings(ROW_STATE_PENDING, arg)) != 0) { + changed = true; + } mDatabase.setTransactionSuccessful(); + return changed; } finally { mDatabase.endTransaction(); } @@ -307,14 +348,23 @@ class MtpDatabaseInternal { } } + /** + * {@link android.database.sqlite.SQLiteDatabase#beginTransaction()} + */ void beginTransaction() { mDatabase.beginTransaction(); } + /** + * {@link android.database.sqlite.SQLiteDatabase#setTransactionSuccessful()} + */ void setTransactionSuccessful() { mDatabase.setTransactionSuccessful(); } + /** + * {@link android.database.sqlite.SQLiteDatabase#endTransaction()} + */ void endTransaction() { mDatabase.endTransaction(); } @@ -323,11 +373,13 @@ class MtpDatabaseInternal { * Deletes a document, and its root information if the document is a root document. * @param selection Query to select documents. * @param args Arguments for selection. + * @return Whether the method deletes rows. */ - private void deleteDocumentsAndRoots(String selection, String[] args) { + private boolean deleteDocumentsAndRoots(String selection, String[] args) { mDatabase.beginTransaction(); try { - mDatabase.delete( + int deleted = 0; + deleted += mDatabase.delete( TABLE_ROOT_EXTRA, Root.COLUMN_ROOT_ID + " IN (" + SQLiteQueryBuilder.buildQueryString( false, @@ -339,8 +391,9 @@ class MtpDatabaseInternal { null, null) + ")", args); - mDatabase.delete(TABLE_DOCUMENTS, selection, args); + deleted += mDatabase.delete(TABLE_DOCUMENTS, selection, args); mDatabase.setTransactionSuccessful(); + return deleted != 0; } finally { mDatabase.endTransaction(); } diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java index 7883e6198bbf..0931445b1035 100644 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java @@ -62,6 +62,7 @@ public class MtpDocumentsProvider extends DocumentsProvider { private Map<Integer, DeviceToolkit> mDeviceToolkits; private RootScanner mRootScanner; private Resources mResources; + private MtpDatabase mDatabase; /** * Provides singleton instance to MtpDocumentsService. @@ -77,17 +78,23 @@ public class MtpDocumentsProvider extends DocumentsProvider { mMtpManager = new MtpManager(getContext()); mResolver = getContext().getContentResolver(); mDeviceToolkits = new HashMap<Integer, DeviceToolkit>(); - mRootScanner = new RootScanner(mResolver, mMtpManager); + mDatabase = new MtpDatabase(getContext()); + mRootScanner = new RootScanner(mResolver, mResources, mMtpManager, mDatabase); return true; } @VisibleForTesting - void onCreateForTesting(Resources resources, MtpManager mtpManager, ContentResolver resolver) { + void onCreateForTesting( + Resources resources, + MtpManager mtpManager, + ContentResolver resolver, + MtpDatabase database) { mResources = resources; mMtpManager = mtpManager; mResolver = resolver; mDeviceToolkits = new HashMap<Integer, DeviceToolkit>(); - mRootScanner = new RootScanner(mResolver, mMtpManager); + mDatabase = database; + mRootScanner = new RootScanner(mResolver, mResources, mMtpManager, mDatabase); } @Override @@ -95,17 +102,7 @@ public class MtpDocumentsProvider extends DocumentsProvider { if (projection == null) { projection = MtpDocumentsProvider.DEFAULT_ROOT_PROJECTION; } - final MatrixCursor cursor = new MatrixCursor(projection); - final MtpRoot[] roots = mRootScanner.getRoots(); - for (final MtpRoot root : roots) { - final Identifier rootIdentifier = new Identifier(root.mDeviceId, root.mStorageId); - final MatrixCursor.RowBuilder builder = cursor.newRow(); - builder.add(Root.COLUMN_ROOT_ID, rootIdentifier.toRootId()); - builder.add(Root.COLUMN_FLAGS, Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE); - builder.add(Root.COLUMN_TITLE, root.getRootName(mResources)); - builder.add(Root.COLUMN_DOCUMENT_ID, rootIdentifier.toDocumentId()); - builder.add(Root.COLUMN_AVAILABLE_BYTES , root.mFreeSpace); - } + final Cursor cursor = mDatabase.queryRoots(projection); cursor.setNotificationUri( mResolver, DocumentsContract.buildRootsUri(MtpDocumentsProvider.AUTHORITY)); return cursor; @@ -266,14 +263,16 @@ public class MtpDocumentsProvider extends DocumentsProvider { // TODO: Flush the device before closing (if not closed externally). getDeviceToolkit(deviceId).mDocumentLoader.clearTasks(); mDeviceToolkits.remove(deviceId); + mDatabase.removeDeviceRows(deviceId); mMtpManager.closeDevice(deviceId); - mRootScanner.scanNow(); + mRootScanner.notifyChange(); } - void closeAllDevices() { + void close() throws InterruptedException { boolean closed = false; for (int deviceId : mMtpManager.getOpenedDeviceIds()) { try { + mDatabase.removeDeviceRows(deviceId); mMtpManager.closeDevice(deviceId); getDeviceToolkit(deviceId).mDocumentLoader.clearTasks(); closed = true; @@ -282,8 +281,10 @@ public class MtpDocumentsProvider extends DocumentsProvider { } } if (closed) { - mRootScanner.scanNow(); + mRootScanner.notifyChange(); } + mRootScanner.close(); + mDatabase.close(); } boolean hasOpenedDevices() { diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsService.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsService.java index 328f618e4b39..2d1af26ba3d2 100644 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsService.java +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsService.java @@ -79,9 +79,13 @@ public class MtpDocumentsService extends Service { @Override public void onDestroy() { final MtpDocumentsProvider provider = MtpDocumentsProvider.getInstance(); - provider.closeAllDevices(); unregisterReceiver(mReceiver); mReceiver = null; + try { + provider.close(); + } catch (InterruptedException e) { + Log.e(MtpDocumentsProvider.TAG, e.getMessage()); + } super.onDestroy(); } diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/RootScanner.java b/packages/MtpDocumentsProvider/src/com/android/mtp/RootScanner.java index ffab1766705a..415f89e4acab 100644 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/RootScanner.java +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/RootScanner.java @@ -1,14 +1,13 @@ package com.android.mtp; import android.content.ContentResolver; +import android.content.res.Resources; import android.net.Uri; import android.os.Process; import android.provider.DocumentsContract; import android.util.Log; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; final class RootScanner { /** @@ -28,18 +27,28 @@ final class RootScanner { private final static long SHORT_POLLING_TIMES = 10; final ContentResolver mResolver; + final Resources mResources; final MtpManager mManager; - MtpRoot[] mLastRoots = new MtpRoot[0]; + final MtpDatabase mDatabase; + boolean mClosed = false; int mPollingCount; - boolean mHasBackgroundTask = false; + Thread mBackgroundThread; - RootScanner(ContentResolver resolver, MtpManager manager) { + RootScanner( + ContentResolver resolver, + Resources resources, + MtpManager manager, + MtpDatabase database) { mResolver = resolver; + mResources = resources; mManager = manager; + mDatabase = database; } - synchronized MtpRoot[] getRoots() { - return mLastRoots; + void notifyChange() { + final Uri uri = + DocumentsContract.buildRootsUri(MtpDocumentsProvider.AUTHORITY); + mResolver.notifyChange(uri, null, false); } /** @@ -47,26 +56,29 @@ final class RootScanner { * If the background thread has already gone, it restarts another background thread. */ synchronized void scanNow() { + if (mClosed) { + return; + } mPollingCount = 0; - if (!mHasBackgroundTask) { - mHasBackgroundTask = true; - new BackgroundLoaderThread().start(); + if (mBackgroundThread == null) { + mBackgroundThread = new BackgroundLoaderThread(); + mBackgroundThread.start(); } else { notify(); } } - private MtpRoot[] createRoots(int[] deviceIds) { - final ArrayList<MtpRoot> roots = new ArrayList<>(); - for (final int deviceId : deviceIds) { - try { - roots.addAll(Arrays.asList(mManager.getRoots(deviceId))); - } catch (IOException error) { - // Skip device that return error. - Log.d(MtpDocumentsProvider.TAG, error.getMessage()); + void close() throws InterruptedException { + Thread thread; + synchronized (this) { + mClosed = true; + thread = mBackgroundThread; + if (mBackgroundThread == null) { + return; } + notify(); } - return roots.toArray(new MtpRoot[roots.size()]); + thread.join(); } private final class BackgroundLoaderThread extends Thread { @@ -74,18 +86,28 @@ final class RootScanner { public void run() { Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); synchronized (RootScanner.this) { - while (true) { + while (!mClosed) { final int[] deviceIds = mManager.getOpenedDeviceIds(); - final MtpRoot[] newRoots = createRoots(deviceIds); - if (!Arrays.equals(mLastRoots, newRoots)) { - final Uri uri = - DocumentsContract.buildRootsUri(MtpDocumentsProvider.AUTHORITY); - mResolver.notifyChange(uri, null, false); - mLastRoots = newRoots; - } if (deviceIds.length == 0) { break; } + boolean changed = false; + for (int deviceId : deviceIds) { + try { + mDatabase.startAddingRootDocuments(deviceId); + changed = mDatabase.putRootDocuments( + deviceId, mResources, mManager.getRoots(deviceId)) || changed; + changed = mDatabase.stopAddingRootDocuments(deviceId) || changed; + } catch (IOException exp) { + // The error may happen on the device. We would like to continue getting + // roots for other devices. + Log.e(MtpDocumentsProvider.TAG, exp.getMessage()); + continue; + } + } + if (changed) { + notifyChange(); + } mPollingCount++; try { // Use SHORT_POLLING_PERIOD for the first SHORT_POLLING_TIMES because it is @@ -99,7 +121,7 @@ final class RootScanner { } } - mHasBackgroundTask = false; + mBackgroundThread = null; } } } diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java index 05345e15ab05..ce4cf14d822c 100644 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java +++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java @@ -86,7 +86,7 @@ public class MtpDatabaseTest extends AndroidTestCase { Root.COLUMN_ICON, Root.COLUMN_TITLE, Root.COLUMN_SUMMARY, - Root.COLUMN_DOCUMENT_ID, + Root.COLUMN_DOCUMENT_ID + "_", Root.COLUMN_AVAILABLE_BYTES, Root.COLUMN_CAPACITY_BYTES }); diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java index 5765f0a90501..bc7f28c59f33 100644 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java +++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java @@ -36,13 +36,24 @@ public class MtpDocumentsProviderTest extends AndroidTestCase { private MtpDocumentsProvider mProvider; private TestMtpManager mMtpManager; private final TestResources mResources = new TestResources(); + private MtpDatabase mDatabase; @Override public void setUp() throws IOException { mResolver = new TestContentResolver(); mMtpManager = new TestMtpManager(getContext()); mProvider = new MtpDocumentsProvider(); - mProvider.onCreateForTesting(mResources, mMtpManager, mResolver); + mDatabase = new MtpDatabase(getContext()); + mProvider.onCreateForTesting(mResources, mMtpManager, mResolver, mDatabase); + } + + @Override + public void tearDown() { + try { + mProvider.close(); + } catch (InterruptedException e) { + fail(); + } } public void testOpenAndCloseDevice() throws Exception { @@ -96,26 +107,6 @@ public class MtpDocumentsProviderTest extends AndroidTestCase { mResolver.waitForNotification(ROOTS_URI, 1); } - public void testCloseAllDevices() throws Exception { - mMtpManager.addValidDevice(0); - mMtpManager.setRoots(0, new MtpRoot[] { - new MtpRoot( - 0 /* deviceId */, - 1 /* storageId */, - "Device A" /* device model name */, - "Storage A" /* volume description */, - 1024 /* free space */, - 2048 /* total space */, - "" /* no volume identifier */) - }); - mProvider.closeAllDevices(); - mProvider.openDevice(0); - mResolver.waitForNotification(ROOTS_URI, 1); - - mProvider.closeAllDevices(); - mResolver.waitForNotification(ROOTS_URI, 2); - } - public void testQueryRoots() throws Exception { mMtpManager.addValidDevice(0); mMtpManager.addValidDevice(1); @@ -146,7 +137,7 @@ public class MtpDocumentsProviderTest extends AndroidTestCase { final Cursor cursor = mProvider.queryRoots(null); assertEquals(1, cursor.getCount()); cursor.moveToNext(); - assertEquals("0_1", cursor.getString(0)); + assertEquals("1", cursor.getString(0)); assertEquals(Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE, cursor.getInt(1)); // TODO: Add storage icon for MTP devices. assertTrue(cursor.isNull(2) /* icon */); @@ -162,7 +153,7 @@ public class MtpDocumentsProviderTest extends AndroidTestCase { assertEquals(2, cursor.getCount()); cursor.moveToNext(); cursor.moveToNext(); - assertEquals("1_1", cursor.getString(0)); + assertEquals("2", cursor.getString(0)); assertEquals(Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE, cursor.getInt(1)); // TODO: Add storage icon for MTP devices. assertTrue(cursor.isNull(2) /* icon */); @@ -170,13 +161,6 @@ public class MtpDocumentsProviderTest extends AndroidTestCase { assertEquals("1_1_0", cursor.getString(4)); assertEquals(2048, cursor.getInt(5)); } - - { - mProvider.closeAllDevices(); - mResolver.waitForNotification(ROOTS_URI, 3); - final Cursor cursor = mProvider.queryRoots(null); - assertEquals(0, cursor.getCount()); - } } public void testQueryRoots_error() throws Exception { @@ -201,7 +185,7 @@ public class MtpDocumentsProviderTest extends AndroidTestCase { final Cursor cursor = mProvider.queryRoots(null); assertEquals(1, cursor.getCount()); cursor.moveToNext(); - assertEquals("1_1", cursor.getString(0)); + assertEquals("1", cursor.getString(0)); assertEquals(Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE, cursor.getInt(1)); // TODO: Add storage icon for MTP devices. assertTrue(cursor.isNull(2) /* icon */); diff --git a/packages/PrintSpooler/res/values-af/strings.xml b/packages/PrintSpooler/res/values-af/strings.xml index 1c39a7d8ec3d..cf13374e9fac 100644 --- a/packages/PrintSpooler/res/values-af/strings.xml +++ b/packages/PrintSpooler/res/values-af/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Kies drukdiens"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Soek tans vir drukkers"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Geen drukdienste is geaktiveer nie"</string> <string name="print_no_printers" msgid="4869403323900054866">"Geen drukkers gekry nie"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Druk tans <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Kanselleer tans <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-am/strings.xml b/packages/PrintSpooler/res/values-am/strings.xml index 4d8b85e3d518..18c90f5b0495 100644 --- a/packages/PrintSpooler/res/values-am/strings.xml +++ b/packages/PrintSpooler/res/values-am/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"የህትመት አገልግሎት ይምረጡ"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"አታሚዎችን በመፈለግ ላይ"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"ምንም የህትመት አገልግሎቶች አልነቁም"</string> <string name="print_no_printers" msgid="4869403323900054866">"ምንም አታሚዎች አልተገኙም"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>ን በማተም ላይ"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>ን በመተው ላይ"</string> diff --git a/packages/PrintSpooler/res/values-ar/strings.xml b/packages/PrintSpooler/res/values-ar/strings.xml index 0fa6ec24c3a1..2d87498c7182 100644 --- a/packages/PrintSpooler/res/values-ar/strings.xml +++ b/packages/PrintSpooler/res/values-ar/strings.xml @@ -64,6 +64,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"اختر خدمة طباعة"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"البحث عن طابعات"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"لم يتم تمكين أي خدمات طباعة"</string> <string name="print_no_printers" msgid="4869403323900054866">"لم يتم العثور على طابعات"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"جارٍ طباعة <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"جارٍ إلغاء <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-az-rAZ/strings.xml b/packages/PrintSpooler/res/values-az-rAZ/strings.xml index 1837db4ecd93..c8ca06cd0e5f 100644 --- a/packages/PrintSpooler/res/values-az-rAZ/strings.xml +++ b/packages/PrintSpooler/res/values-az-rAZ/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Çap xidmətini seçin"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Printer axtarılır"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Heç bir çap xidməti aktiv edilməyib"</string> <string name="print_no_printers" msgid="4869403323900054866">"Heç bir printer tapılmadı"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> çap edilir"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> ləğv edilir"</string> diff --git a/packages/PrintSpooler/res/values-bg/strings.xml b/packages/PrintSpooler/res/values-bg/strings.xml index 9a8ccef6c5a8..7129cc1f9352 100644 --- a/packages/PrintSpooler/res/values-bg/strings.xml +++ b/packages/PrintSpooler/res/values-bg/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Избиране на услуга за отпечатване"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Търсене на принтери"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Няма активирани услуги за отпечатване"</string> <string name="print_no_printers" msgid="4869403323900054866">"Няма намерени принтери"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"„<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>“ се отпечатва"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"„<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>“ се анулира"</string> diff --git a/packages/PrintSpooler/res/values-bn-rBD/strings.xml b/packages/PrintSpooler/res/values-bn-rBD/strings.xml index 4f1646d4bfc2..ae0b01c3211b 100644 --- a/packages/PrintSpooler/res/values-bn-rBD/strings.xml +++ b/packages/PrintSpooler/res/values-bn-rBD/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"মুদ্রণ পরিষেবা চয়ন করুন"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"মুদ্রকগুলি অনুসন্ধান করা হচ্ছে"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"মুদ্রণ পরিষেবা সক্ষম নেই"</string> <string name="print_no_printers" msgid="4869403323900054866">"কোনো মুদ্রক পাওয়া যায়নি"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> মুদ্রণ করা হচ্ছে"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> বাতিল করা হচ্ছে"</string> diff --git a/packages/PrintSpooler/res/values-ca/strings.xml b/packages/PrintSpooler/res/values-ca/strings.xml index fa34c5248dbe..d221c6c42b38 100644 --- a/packages/PrintSpooler/res/values-ca/strings.xml +++ b/packages/PrintSpooler/res/values-ca/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Selecció del servei d\'impressió"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Cerca d\'impressores"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"No hi ha cap servei d\'impressió activat"</string> <string name="print_no_printers" msgid="4869403323900054866">"No s\'ha trobat cap impressora"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"S\'està imprimint <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"S\'està cancel·lant <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-cs/strings.xml b/packages/PrintSpooler/res/values-cs/strings.xml index 5c98d616b14f..5396b3e8d266 100644 --- a/packages/PrintSpooler/res/values-cs/strings.xml +++ b/packages/PrintSpooler/res/values-cs/strings.xml @@ -62,6 +62,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Zvolte službu tisku"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Vyhledávání tiskáren"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Nejsou aktivovány žádné tiskové služby"</string> <string name="print_no_printers" msgid="4869403323900054866">"Nebyly nalezeny žádné tiskárny"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Tisk úlohy <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Rušení úlohy <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-da/strings.xml b/packages/PrintSpooler/res/values-da/strings.xml index e57d435fd456..484d66fb784e 100644 --- a/packages/PrintSpooler/res/values-da/strings.xml +++ b/packages/PrintSpooler/res/values-da/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Vælg udskriftstjeneste"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Søger efter printere"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Ingen udskrivningstjenester er aktiveret"</string> <string name="print_no_printers" msgid="4869403323900054866">"Der blev ikke fundet nogen printere"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> udskrives"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> annulleres"</string> diff --git a/packages/PrintSpooler/res/values-de/strings.xml b/packages/PrintSpooler/res/values-de/strings.xml index 1005b45d52ec..c6323ef3bb50 100644 --- a/packages/PrintSpooler/res/values-de/strings.xml +++ b/packages/PrintSpooler/res/values-de/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Druckdienst auswählen"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Suche nach Druckern"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Keine Druckdienste aktiviert"</string> <string name="print_no_printers" msgid="4869403323900054866">"Keine Drucker gefunden"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> wird gedruckt..."</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> wird abgebrochen..."</string> diff --git a/packages/PrintSpooler/res/values-el/strings.xml b/packages/PrintSpooler/res/values-el/strings.xml index 75b84479c0cc..85923b750d4a 100644 --- a/packages/PrintSpooler/res/values-el/strings.xml +++ b/packages/PrintSpooler/res/values-el/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Επιλέξτε υπηρεσία εκτύπωσης"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Αναζήτηση για εκτυπωτές"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Δεν έχουν ενεργοποιηθεί υπηρεσίες εκτύπωσης"</string> <string name="print_no_printers" msgid="4869403323900054866">"Δεν βρέθηκαν εκτυπωτές"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Εκτύπωση <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Ακύρωση <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-en-rAU/strings.xml b/packages/PrintSpooler/res/values-en-rAU/strings.xml index 87349c22dd88..5ac14a3da1b5 100644 --- a/packages/PrintSpooler/res/values-en-rAU/strings.xml +++ b/packages/PrintSpooler/res/values-en-rAU/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Choose print service"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Searching for printers"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"No print services enabled"</string> <string name="print_no_printers" msgid="4869403323900054866">"No printers found"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Printing <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Cancelling <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-en-rGB/strings.xml b/packages/PrintSpooler/res/values-en-rGB/strings.xml index 87349c22dd88..5ac14a3da1b5 100644 --- a/packages/PrintSpooler/res/values-en-rGB/strings.xml +++ b/packages/PrintSpooler/res/values-en-rGB/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Choose print service"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Searching for printers"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"No print services enabled"</string> <string name="print_no_printers" msgid="4869403323900054866">"No printers found"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Printing <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Cancelling <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-en-rIN/strings.xml b/packages/PrintSpooler/res/values-en-rIN/strings.xml index 87349c22dd88..5ac14a3da1b5 100644 --- a/packages/PrintSpooler/res/values-en-rIN/strings.xml +++ b/packages/PrintSpooler/res/values-en-rIN/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Choose print service"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Searching for printers"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"No print services enabled"</string> <string name="print_no_printers" msgid="4869403323900054866">"No printers found"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Printing <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Cancelling <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-es-rUS/strings.xml b/packages/PrintSpooler/res/values-es-rUS/strings.xml index ffd4d7931ddc..1876ae170c25 100644 --- a/packages/PrintSpooler/res/values-es-rUS/strings.xml +++ b/packages/PrintSpooler/res/values-es-rUS/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Elegir servicio de impresión"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Buscando impresoras"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"No hay servicios de impresión habilitados"</string> <string name="print_no_printers" msgid="4869403323900054866">"No se encontraron impresoras"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Imprimiendo <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Cancelando <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-es/strings.xml b/packages/PrintSpooler/res/values-es/strings.xml index 5660d1b5cb4d..14ed0d82535a 100644 --- a/packages/PrintSpooler/res/values-es/strings.xml +++ b/packages/PrintSpooler/res/values-es/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Seleccionar servicio de impresión"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Buscando impresoras"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"No hay servicios de impresión habilitados"</string> <string name="print_no_printers" msgid="4869403323900054866">"No se encontraron impresoras"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Imprimiendo <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Cancelando <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-et-rEE/strings.xml b/packages/PrintSpooler/res/values-et-rEE/strings.xml index fb0f3205a89e..c284332117dd 100644 --- a/packages/PrintSpooler/res/values-et-rEE/strings.xml +++ b/packages/PrintSpooler/res/values-et-rEE/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Prinditeenuse valimine"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Printerite otsimine"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Ühtegi printimisteenust pole lubatud"</string> <string name="print_no_printers" msgid="4869403323900054866">"Printereid ei leitud"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Prinditöö <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> printimine"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Prinditöö <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> tühistamine"</string> diff --git a/packages/PrintSpooler/res/values-eu-rES/strings.xml b/packages/PrintSpooler/res/values-eu-rES/strings.xml index 8402a9c4c47d..eab7587437e7 100644 --- a/packages/PrintSpooler/res/values-eu-rES/strings.xml +++ b/packages/PrintSpooler/res/values-eu-rES/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Aukeratu inprimatze-zerbitzua"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Inprimagailuak bilatzen"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Ez dago gaituta inprimatzeko zerbitzurik"</string> <string name="print_no_printers" msgid="4869403323900054866">"Ez da inprimagailurik aurkitu"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> inprimatzen"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> bertan behera uzten"</string> @@ -75,7 +76,7 @@ <string name="reason_unknown" msgid="5507940196503246139">"ezezaguna"</string> <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>: ez dago erabilgarri"</string> <string name="print_service_security_warning_title" msgid="2160752291246775320">"<xliff:g id="SERVICE">%1$s</xliff:g> erabili nahi duzu?"</string> - <string name="print_service_security_warning_summary" msgid="1427434625361692006">"Baliteke dokumentuak zerbitzari bat edo gehiagotan zehar igarotzea inprimagailurako bidean."</string> + <string name="print_service_security_warning_summary" msgid="1427434625361692006">"Baliteke dokumentuak zerbitzari batean edo gehiagotan zehar igarotzea inprimagailurako bidean."</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Zuri-beltza"</item> <item msgid="2762241247228983754">"Koloretakoa"</item> diff --git a/packages/PrintSpooler/res/values-fa/strings.xml b/packages/PrintSpooler/res/values-fa/strings.xml index ba7846025412..156eb477e9b3 100644 --- a/packages/PrintSpooler/res/values-fa/strings.xml +++ b/packages/PrintSpooler/res/values-fa/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"انتخاب سرویس چاپ"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"درحال جستجوی چاپگرها"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"هیچ خدمات چاپی فعال نیست"</string> <string name="print_no_printers" msgid="4869403323900054866">"هیچ چاپگری یافت نشد"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"در حال چاپ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"در حال لغو <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-fi/strings.xml b/packages/PrintSpooler/res/values-fi/strings.xml index 3a82702b625e..887d428efc95 100644 --- a/packages/PrintSpooler/res/values-fi/strings.xml +++ b/packages/PrintSpooler/res/values-fi/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Valitse tulostuspalvelu"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Etsitään tulostimia"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Ei käytössä olevia tulostuspalveluita"</string> <string name="print_no_printers" msgid="4869403323900054866">"Tulostimia ei löydy"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Tulostetaan <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Peruutetaan työ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-fr-rCA/strings.xml b/packages/PrintSpooler/res/values-fr-rCA/strings.xml index f49885a6efae..a97b20abfae7 100644 --- a/packages/PrintSpooler/res/values-fr-rCA/strings.xml +++ b/packages/PrintSpooler/res/values-fr-rCA/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Sélectionner le service d\'impression"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Recherche d\'imprimantes en cours..."</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Aucun service d\'impression activé"</string> <string name="print_no_printers" msgid="4869403323900054866">"Aucune imprimante trouvée"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Impression de <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> en cours…"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Annulation de « <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> »…"</string> diff --git a/packages/PrintSpooler/res/values-fr/strings.xml b/packages/PrintSpooler/res/values-fr/strings.xml index 4dcfa65b285e..726915b10310 100644 --- a/packages/PrintSpooler/res/values-fr/strings.xml +++ b/packages/PrintSpooler/res/values-fr/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Sélectionner le service d\'impression"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Recherche d\'imprimantes en cours"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Aucun service d\'impression activé"</string> <string name="print_no_printers" msgid="4869403323900054866">"Aucune imprimante trouvée"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Impression de \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\" en cours…"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Annulation de \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\" en cours…"</string> diff --git a/packages/PrintSpooler/res/values-gl-rES/strings.xml b/packages/PrintSpooler/res/values-gl-rES/strings.xml index c805e30dbcad..6a2d031c46c5 100644 --- a/packages/PrintSpooler/res/values-gl-rES/strings.xml +++ b/packages/PrintSpooler/res/values-gl-rES/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Escoller servizo de impresión"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Busca de impresoras"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Non hai servizos de impresión activados"</string> <string name="print_no_printers" msgid="4869403323900054866">"Non se atopou ningunha impresora"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Imprimindo <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Cancelando <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-gu-rIN/strings.xml b/packages/PrintSpooler/res/values-gu-rIN/strings.xml index 51820f290012..3b3d2edbaa70 100644 --- a/packages/PrintSpooler/res/values-gu-rIN/strings.xml +++ b/packages/PrintSpooler/res/values-gu-rIN/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"પ્રિન્ટ સેવા પસંદ કરો"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"પ્રિન્ટર્સ માટે શોધી રહ્યું છે"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"કોઈ છાપ સેવાઓ સક્ષમ કરેલ નથી"</string> <string name="print_no_printers" msgid="4869403323900054866">"કોઈ પ્રિન્ટર મળ્યા નથી"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> છાપી રહ્યાં છે"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> ને રદ કરી રહ્યું છે"</string> diff --git a/packages/PrintSpooler/res/values-hi/strings.xml b/packages/PrintSpooler/res/values-hi/strings.xml index e2bc0129fc34..162f65bdc03a 100644 --- a/packages/PrintSpooler/res/values-hi/strings.xml +++ b/packages/PrintSpooler/res/values-hi/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"प्रिंट सेवा चुनें"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"प्रिंटर खोज रहा है"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"कोई भी प्रिंट सेवा सक्षम नहीं है"</string> <string name="print_no_printers" msgid="4869403323900054866">"कोई प्रिंटर नहीं मिले"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> प्रिंट हो रहा है"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> रद्द हो रहा है"</string> diff --git a/packages/PrintSpooler/res/values-hr/strings.xml b/packages/PrintSpooler/res/values-hr/strings.xml index 64c4a58fe26c..927630028fcc 100644 --- a/packages/PrintSpooler/res/values-hr/strings.xml +++ b/packages/PrintSpooler/res/values-hr/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Odaberite uslugu ispisa"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Traženje pisača"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Nije omogućena nijedna usluga ispisa"</string> <string name="print_no_printers" msgid="4869403323900054866">"Nije pronađen nijedan pisač"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Ispisivanje <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Otkazivanje zadatka <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-hu/strings.xml b/packages/PrintSpooler/res/values-hu/strings.xml index 58e78529b9c0..ca48f9a75e22 100644 --- a/packages/PrintSpooler/res/values-hu/strings.xml +++ b/packages/PrintSpooler/res/values-hu/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Nyomtatási szolgáltatás kiválasztása"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Nyomtatók keresése"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Nincs engedélyezett nyomtatási szolgáltatás"</string> <string name="print_no_printers" msgid="4869403323900054866">"Nem található nyomtató"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"A(z) <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> nyomtatása"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"A(z) <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> törlése"</string> diff --git a/packages/PrintSpooler/res/values-hy-rAM/strings.xml b/packages/PrintSpooler/res/values-hy-rAM/strings.xml index 88e91927fbcb..a198277d348a 100644 --- a/packages/PrintSpooler/res/values-hy-rAM/strings.xml +++ b/packages/PrintSpooler/res/values-hy-rAM/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Ընտրեք տպելու ծառայությունը"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Տպիչների որոնում"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Ակտիվացված տպման ծառայություններ չկան"</string> <string name="print_no_printers" msgid="4869403323900054866">"Տպիչներ չեն գտնվել"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Տպվում է՝ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>-ը չեղարկվում է"</string> diff --git a/packages/PrintSpooler/res/values-in/strings.xml b/packages/PrintSpooler/res/values-in/strings.xml index de76536b8f0a..505070095777 100644 --- a/packages/PrintSpooler/res/values-in/strings.xml +++ b/packages/PrintSpooler/res/values-in/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Pilih layanan cetak"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Mencari printer"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Tidak ada layanan cetak yang aktif"</string> <string name="print_no_printers" msgid="4869403323900054866">"Tidak ditemukan printer"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Mencetak <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Membatalkan <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-is-rIS/strings.xml b/packages/PrintSpooler/res/values-is-rIS/strings.xml index 3f8aa651a3f6..33f10f53fade 100644 --- a/packages/PrintSpooler/res/values-is-rIS/strings.xml +++ b/packages/PrintSpooler/res/values-is-rIS/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Veldu prentþjónustu"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Leitar að prentara"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Engin prentþjónusta er virk"</string> <string name="print_no_printers" msgid="4869403323900054866">"Engir prentarar fundust"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Prentar <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Hættir við <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-it/strings.xml b/packages/PrintSpooler/res/values-it/strings.xml index 394dc880b6d4..f7c6efff6918 100644 --- a/packages/PrintSpooler/res/values-it/strings.xml +++ b/packages/PrintSpooler/res/values-it/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Scegli servizio di stampa"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Ricerca di stampanti"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Non è stato attivato alcun servizio di stampa"</string> <string name="print_no_printers" msgid="4869403323900054866">"Nessuna stampante trovata"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Stampa di <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Annullamento di <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-iw/strings.xml b/packages/PrintSpooler/res/values-iw/strings.xml index 5c5e5d90e6d7..545ba8899538 100644 --- a/packages/PrintSpooler/res/values-iw/strings.xml +++ b/packages/PrintSpooler/res/values-iw/strings.xml @@ -62,6 +62,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"בחר שירות הדפסה"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"מחפש מדפסות"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"לא הופעלו שירותי הדפסה"</string> <string name="print_no_printers" msgid="4869403323900054866">"לא נמצאו מדפסות"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"מדפיס את <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"מבטל את <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-ja/strings.xml b/packages/PrintSpooler/res/values-ja/strings.xml index 6a396b358bac..e29201373ec3 100644 --- a/packages/PrintSpooler/res/values-ja/strings.xml +++ b/packages/PrintSpooler/res/values-ja/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"印刷サービスの選択"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"プリンタの検索中"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"使用できる印刷サービスがありません"</string> <string name="print_no_printers" msgid="4869403323900054866">"プリンタが見つかりません"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>を印刷しています"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>をキャンセルしています"</string> diff --git a/packages/PrintSpooler/res/values-ka-rGE/strings.xml b/packages/PrintSpooler/res/values-ka-rGE/strings.xml index 44e77d7cf25f..db71506d3acb 100644 --- a/packages/PrintSpooler/res/values-ka-rGE/strings.xml +++ b/packages/PrintSpooler/res/values-ka-rGE/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"აირჩიეთ ბეჭდვის სერვისი"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"მიმდინარეობს პრინტერების ძიება"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"ბეჭდვის სერვისები გააქტიურებული არ არის"</string> <string name="print_no_printers" msgid="4869403323900054866">"პრინტერები ვერ მოიძებნა"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"იბეჭდება <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"მიმდინარეობს <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>-ის გაუქმება"</string> diff --git a/packages/PrintSpooler/res/values-kk-rKZ/strings.xml b/packages/PrintSpooler/res/values-kk-rKZ/strings.xml index a79a51182fab..de2115a4290d 100644 --- a/packages/PrintSpooler/res/values-kk-rKZ/strings.xml +++ b/packages/PrintSpooler/res/values-kk-rKZ/strings.xml @@ -60,6 +60,8 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Принтер қызметін таңдау"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Принтерлерді іздеу"</string> + <!-- no translation found for print_no_print_services (8561247706423327966) --> + <skip /> <string name="print_no_printers" msgid="4869403323900054866">"Ешқандай принтер табылмады"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> басып шығарылуда"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> жұмысын тоқтатуда"</string> diff --git a/packages/PrintSpooler/res/values-km-rKH/strings.xml b/packages/PrintSpooler/res/values-km-rKH/strings.xml index 87f4fde0cf94..c91e6ae3cf26 100644 --- a/packages/PrintSpooler/res/values-km-rKH/strings.xml +++ b/packages/PrintSpooler/res/values-km-rKH/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"ជ្រើសសេវាបោះពុម្ព"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"ស្វែងរកម៉ាស៊ីនបោះពុម្ព"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"គ្មានការបើកដំណើរការសេវាបោះពុម្ពទេ"</string> <string name="print_no_printers" msgid="4869403323900054866">"រកមិនឃើញម៉ាស៊ីនបោះពុម្ព"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"កំពុងបោះពុម្ព <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"ការបោះបង់ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-kn-rIN/strings.xml b/packages/PrintSpooler/res/values-kn-rIN/strings.xml index eff11272bd60..86dc11f70e06 100644 --- a/packages/PrintSpooler/res/values-kn-rIN/strings.xml +++ b/packages/PrintSpooler/res/values-kn-rIN/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"ಮುದ್ರಣ ಸೇವೆಯನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"ಪ್ರಿಂಟರ್ಗಳಿಗಾಗಿ ಹುಡುಕಲಾಗುತ್ತಿದೆ"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"ಯಾವುದೇ ಮುದ್ರಣ ಸೇವೆಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿಲ್ಲ"</string> <string name="print_no_printers" msgid="4869403323900054866">"ಯಾವುದೇ ಮುದ್ರಕಗಳು ಕಂಡುಬಂದಿಲ್ಲ"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> ಮುದ್ರಿಸಲಾಗುತ್ತಿದೆ"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> ರದ್ದು ಮಾಡಲಾಗುತ್ತಿದೆ"</string> diff --git a/packages/PrintSpooler/res/values-ko/strings.xml b/packages/PrintSpooler/res/values-ko/strings.xml index 7613ad74c146..4450bca1b421 100644 --- a/packages/PrintSpooler/res/values-ko/strings.xml +++ b/packages/PrintSpooler/res/values-ko/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"인쇄 서비스 선택"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"프린터 검색 중"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"사용 가능한 프린트 서비스 없음"</string> <string name="print_no_printers" msgid="4869403323900054866">"프린터 없음"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> 인쇄 중"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> 취소 중"</string> diff --git a/packages/PrintSpooler/res/values-ky-rKG/strings.xml b/packages/PrintSpooler/res/values-ky-rKG/strings.xml index 2ea1b57c1d47..b4bdc5771518 100644 --- a/packages/PrintSpooler/res/values-ky-rKG/strings.xml +++ b/packages/PrintSpooler/res/values-ky-rKG/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Принтер кызматын тандоо"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Принтерлер изделүүдө"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Принтер-кызматтары иштетилген эмес"</string> <string name="print_no_printers" msgid="4869403323900054866">"Принтерлер табылган жок"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> басылууда"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> токтотулууда"</string> diff --git a/packages/PrintSpooler/res/values-lo-rLA/strings.xml b/packages/PrintSpooler/res/values-lo-rLA/strings.xml index 511a72f702c8..500f01c066e3 100644 --- a/packages/PrintSpooler/res/values-lo-rLA/strings.xml +++ b/packages/PrintSpooler/res/values-lo-rLA/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"ເລືອກບໍລິການການພິມ"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"ກຳລັງຊອກຫາເຄື່ອງພິມ"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"ບໍ່ມີການບໍລິການພິມເປີດໃຊ້ງານໄວ້"</string> <string name="print_no_printers" msgid="4869403323900054866">"ບໍ່ພົບເຄື່ອງພິມ"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"ກຳລັງພິມ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"ກຳລັງຍົກເລີກ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-lt/strings.xml b/packages/PrintSpooler/res/values-lt/strings.xml index ce912be8678a..ad59182cfc25 100644 --- a/packages/PrintSpooler/res/values-lt/strings.xml +++ b/packages/PrintSpooler/res/values-lt/strings.xml @@ -62,6 +62,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Pasirinkite spausdinimo paslaugą"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Ieškoma spausdintuvų"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Neįgalinta jokių spausdinimo paslaugų"</string> <string name="print_no_printers" msgid="4869403323900054866">"Nerasta spausdintuvų"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Spausdinama: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Atšaukiama: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-lv/strings.xml b/packages/PrintSpooler/res/values-lv/strings.xml index bfba6c888f09..3b30d04fd8cc 100644 --- a/packages/PrintSpooler/res/values-lv/strings.xml +++ b/packages/PrintSpooler/res/values-lv/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Izvēlieties drukāšanas pakalpojumu"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Printeru meklēšana"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Nav iespējots neviens drukas pakalpojums"</string> <string name="print_no_printers" msgid="4869403323900054866">"Netika atrasts neviens printeris."</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Notiek darba <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> drukāšana…"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Pārtrauc drukas darbu <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>…"</string> diff --git a/packages/PrintSpooler/res/values-mk-rMK/strings.xml b/packages/PrintSpooler/res/values-mk-rMK/strings.xml index a81db0133a49..42548fcfe96c 100644 --- a/packages/PrintSpooler/res/values-mk-rMK/strings.xml +++ b/packages/PrintSpooler/res/values-mk-rMK/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Избери услуга печатење"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Пребарување печатачи"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Нема овозможени услуги за печатење"</string> <string name="print_no_printers" msgid="4869403323900054866">"Не се пронајдени печатачи"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> се печати"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> се откажува"</string> diff --git a/packages/PrintSpooler/res/values-ml-rIN/strings.xml b/packages/PrintSpooler/res/values-ml-rIN/strings.xml index c14c5ad4e9aa..4e5a99ccddba 100644 --- a/packages/PrintSpooler/res/values-ml-rIN/strings.xml +++ b/packages/PrintSpooler/res/values-ml-rIN/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"പ്രിന്റ് സേവനം തിരഞ്ഞെടുക്കുക"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"പ്രിന്ററുകൾക്കായി തിരയുന്നു"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"പ്രിന്റ് സേവനങ്ങളൊന്നും പ്രവർത്തനക്ഷമാക്കിയിട്ടില്ല"</string> <string name="print_no_printers" msgid="4869403323900054866">"പ്രിന്ററുകളൊന്നും കണ്ടെത്തിയില്ല"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> പ്രിന്റുചെയ്യുന്നു"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> റദ്ദാക്കുന്നു"</string> diff --git a/packages/PrintSpooler/res/values-mn-rMN/strings.xml b/packages/PrintSpooler/res/values-mn-rMN/strings.xml index 789f0850376e..0f496714aeb8 100644 --- a/packages/PrintSpooler/res/values-mn-rMN/strings.xml +++ b/packages/PrintSpooler/res/values-mn-rMN/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Хэвлэх үйлчилгээг сонгох"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Принтер хайж байна"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Хэвлэх үйлчилгээг идэвхжүүлээгүй"</string> <string name="print_no_printers" msgid="4869403323900054866">"Принтер олдсонгүй"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Хэвлэж байна <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Цуцлаж байна <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-mr-rIN/strings.xml b/packages/PrintSpooler/res/values-mr-rIN/strings.xml index 1d859cfa9b0c..53225eeebbc3 100644 --- a/packages/PrintSpooler/res/values-mr-rIN/strings.xml +++ b/packages/PrintSpooler/res/values-mr-rIN/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"मुद्रण सेवा निवडा"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"प्रिंटर शोधत आहे"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"कोणत्याही मुद्रण सेवा सक्षम केलेल्या नाहीत"</string> <string name="print_no_printers" msgid="4869403323900054866">"कोणतेही प्रिंटर आढळले नाही"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> मुद्रण करीत आहे"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> रद्द करीत आहे"</string> diff --git a/packages/PrintSpooler/res/values-ms-rMY/strings.xml b/packages/PrintSpooler/res/values-ms-rMY/strings.xml index c86d0bfda083..a15587b52a13 100644 --- a/packages/PrintSpooler/res/values-ms-rMY/strings.xml +++ b/packages/PrintSpooler/res/values-ms-rMY/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Pilih perkhidmatan cetak"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Mencari pencetak"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Perkhidmatan cetak tidak didayakan"</string> <string name="print_no_printers" msgid="4869403323900054866">"Tiada pencetak ditemui"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Mencetak <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Membatalkan <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-my-rMM/strings.xml b/packages/PrintSpooler/res/values-my-rMM/strings.xml index 9b2760aa6e76..10dc93a94603 100644 --- a/packages/PrintSpooler/res/values-my-rMM/strings.xml +++ b/packages/PrintSpooler/res/values-my-rMM/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"စာထုတ်ရန် ဝန်ဆောင်မှုကို ရွေးချယ်ပါ"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"စာထုတ်စက်များကို ရှာနေပါသည်"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"ပုံနှိပ်ထုတ်ယူရေး ဝန်ဆောင်မှုများ ဖွင့်မထားပါ"</string> <string name="print_no_printers" msgid="4869403323900054866">"စာထုတ်စက် တစ်ခုမှ မတွေ့ရှိပါ"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> ကို စာထုတ်နေပါသည်"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> ကို ပယ်ဖျက်နေပါသည်"</string> diff --git a/packages/PrintSpooler/res/values-nb/strings.xml b/packages/PrintSpooler/res/values-nb/strings.xml index cdec56fbaeda..8cbcee7f69d1 100644 --- a/packages/PrintSpooler/res/values-nb/strings.xml +++ b/packages/PrintSpooler/res/values-nb/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Velg utskriftstjeneste"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Søker etter skrivere"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Ingen utskriftstjenester er slått på"</string> <string name="print_no_printers" msgid="4869403323900054866">"Fant ingen skrivere"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Skriver ut <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Avbryter <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-ne-rNP/strings.xml b/packages/PrintSpooler/res/values-ne-rNP/strings.xml index 427a9ae9a0b9..ad9b4e309fa2 100644 --- a/packages/PrintSpooler/res/values-ne-rNP/strings.xml +++ b/packages/PrintSpooler/res/values-ne-rNP/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"प्रिन्ट सेवा छनौट गर्नुहोस्"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"प्रिन्टरहरू खोज्दै"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"कुनै पनि मुद्रण सेवाहरू सक्रिय छैनन्"</string> <string name="print_no_printers" msgid="4869403323900054866">"कुनै प्रिन्टरहरू भेटाइएन"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"प्रिन्ट गरिँदै <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"रद्द गरिँदै <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-nl/strings.xml b/packages/PrintSpooler/res/values-nl/strings.xml index 12d52f9d3f02..bb8391e9c98a 100644 --- a/packages/PrintSpooler/res/values-nl/strings.xml +++ b/packages/PrintSpooler/res/values-nl/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Afdrukservice kiezen"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Printers zoeken"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Geen afdrukservices ingeschakeld"</string> <string name="print_no_printers" msgid="4869403323900054866">"Geen printers gevonden"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> afdrukken"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> annuleren"</string> diff --git a/packages/PrintSpooler/res/values-pa-rIN/strings.xml b/packages/PrintSpooler/res/values-pa-rIN/strings.xml index b8d0602ad6c3..aede0046bed5 100644 --- a/packages/PrintSpooler/res/values-pa-rIN/strings.xml +++ b/packages/PrintSpooler/res/values-pa-rIN/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"ਪ੍ਰਿੰਟ ਸੇਵਾ ਚੁਣੋ"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"ਪ੍ਰਿੰਟਰ ਖੋਜ ਰਿਹਾ ਹੈ"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"ਪ੍ਰਿੰਟ ਸੇਵਾਵਾਂ ਯੋਗ ਨਹੀਂ ਬਣਾਈਆਂ ਗਈਆਂ"</string> <string name="print_no_printers" msgid="4869403323900054866">"ਕੋਈ ਪ੍ਰਿੰਟਰ ਨਹੀਂ ਮਿਲੇ"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> ਨੂੰ ਪ੍ਰਿੰਟ ਕਰ ਰਿਹਾ ਹੈ"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> ਨੂੰ ਰੱਦ ਕਰ ਰਿਹਾ ਹੈ"</string> diff --git a/packages/PrintSpooler/res/values-pl/strings.xml b/packages/PrintSpooler/res/values-pl/strings.xml index dac4b0822063..4e20eed3692d 100644 --- a/packages/PrintSpooler/res/values-pl/strings.xml +++ b/packages/PrintSpooler/res/values-pl/strings.xml @@ -62,6 +62,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Wybierz usługę drukowania"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Szukanie drukarek"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Brak włączonych usług drukowania"</string> <string name="print_no_printers" msgid="4869403323900054866">"Nie znaleziono drukarek"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Drukowanie: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Anulowanie: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-pt-rBR/strings.xml b/packages/PrintSpooler/res/values-pt-rBR/strings.xml index b073ce16ae6e..7ab0f0a21223 100644 --- a/packages/PrintSpooler/res/values-pt-rBR/strings.xml +++ b/packages/PrintSpooler/res/values-pt-rBR/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Selecione o serviço de impressão"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Procurando impressoras"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Nenhum serviço de impressão ativado"</string> <string name="print_no_printers" msgid="4869403323900054866">"Nenhuma impressora encontrada"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Imprimindo <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Cancelando <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-pt-rPT/strings.xml b/packages/PrintSpooler/res/values-pt-rPT/strings.xml index da512b183d4b..583052aafdcf 100644 --- a/packages/PrintSpooler/res/values-pt-rPT/strings.xml +++ b/packages/PrintSpooler/res/values-pt-rPT/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Escolher o serviço de impressão"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"A procurar impressoras"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Nenhum serviço de impressão ativado"</string> <string name="print_no_printers" msgid="4869403323900054866">"Nenhuma impressora encontrada"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"A imprimir <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"A cancelar <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-pt/strings.xml b/packages/PrintSpooler/res/values-pt/strings.xml index b073ce16ae6e..7ab0f0a21223 100644 --- a/packages/PrintSpooler/res/values-pt/strings.xml +++ b/packages/PrintSpooler/res/values-pt/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Selecione o serviço de impressão"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Procurando impressoras"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Nenhum serviço de impressão ativado"</string> <string name="print_no_printers" msgid="4869403323900054866">"Nenhuma impressora encontrada"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Imprimindo <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Cancelando <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-ro/strings.xml b/packages/PrintSpooler/res/values-ro/strings.xml index 1a44182dad92..2769aae35502 100644 --- a/packages/PrintSpooler/res/values-ro/strings.xml +++ b/packages/PrintSpooler/res/values-ro/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Alegeți serviciul de printare"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Se caută imprimante"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Niciun serviciu de printare activat"</string> <string name="print_no_printers" msgid="4869403323900054866">"Nu au fost găsite imprimante"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Se printează <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Se anulează <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-ru/strings.xml b/packages/PrintSpooler/res/values-ru/strings.xml index a6ef09282b01..c3cfac02a6ed 100644 --- a/packages/PrintSpooler/res/values-ru/strings.xml +++ b/packages/PrintSpooler/res/values-ru/strings.xml @@ -62,6 +62,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Выберите службу печати"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Поиск принтеров…"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Службы печати недоступны"</string> <string name="print_no_printers" msgid="4869403323900054866">"Ничего не найдено"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Печать задания \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\"…"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Отмена задания <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>…"</string> diff --git a/packages/PrintSpooler/res/values-si-rLK/strings.xml b/packages/PrintSpooler/res/values-si-rLK/strings.xml index 752045931400..0e20705f011d 100644 --- a/packages/PrintSpooler/res/values-si-rLK/strings.xml +++ b/packages/PrintSpooler/res/values-si-rLK/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"මුද්රණ සේවාව තෝරන්න"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"මුද්රණ යන්ත්ර සොයමින්"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"මුද්රණ සේවා සබල නැත"</string> <string name="print_no_printers" msgid="4869403323900054866">"මුද්රණ යන්ත්ර සොයා නොගැනුණි"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> මුද්රණය වේ"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"අවලංගු කෙරේ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-sk/strings.xml b/packages/PrintSpooler/res/values-sk/strings.xml index 457504064ff5..b8d2167d8183 100644 --- a/packages/PrintSpooler/res/values-sk/strings.xml +++ b/packages/PrintSpooler/res/values-sk/strings.xml @@ -62,6 +62,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Výber tlačovej služby"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Vyhľadávanie tlačiarní"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Žiadne tlačové služby nie sú aktivované"</string> <string name="print_no_printers" msgid="4869403323900054866">"Nenašli sa žiadne tlačiarne"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Prebieha tlač úlohy <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Prebieha zrušenie úlohy <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-sl/strings.xml b/packages/PrintSpooler/res/values-sl/strings.xml index c0dfdb4157ae..a320e79bd795 100644 --- a/packages/PrintSpooler/res/values-sl/strings.xml +++ b/packages/PrintSpooler/res/values-sl/strings.xml @@ -62,6 +62,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Izberite tiskalno storitev"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Iskanje tiskalnikov"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Ni omogočenih tiskalnih storitev"</string> <string name="print_no_printers" msgid="4869403323900054866">"Tiskalnikov ni mogoče najti"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Tiskanje: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Preklic: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-sq-rAL/strings.xml b/packages/PrintSpooler/res/values-sq-rAL/strings.xml index dbbf23894806..177b282a44b1 100644 --- a/packages/PrintSpooler/res/values-sq-rAL/strings.xml +++ b/packages/PrintSpooler/res/values-sq-rAL/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Zgjidh shërbimin e printimit"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Po kërkon për printerë"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Nuk ka shërbime printimi të aktivizuara"</string> <string name="print_no_printers" msgid="4869403323900054866">"Nuk u gjet asnjë printer"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Po printon <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Po anulon <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-sr/strings.xml b/packages/PrintSpooler/res/values-sr/strings.xml index 5589298c3fc2..f686e6df4517 100644 --- a/packages/PrintSpooler/res/values-sr/strings.xml +++ b/packages/PrintSpooler/res/values-sr/strings.xml @@ -61,6 +61,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Изаберите услугу штампања"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Претрага штампача"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Ниједна услуга штампања није омогућена"</string> <string name="print_no_printers" msgid="4869403323900054866">"Није пронађен ниједан штампач"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Штампа се <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Отказује се <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-sv/strings.xml b/packages/PrintSpooler/res/values-sv/strings.xml index a97430ee68fc..6e176f0314e7 100644 --- a/packages/PrintSpooler/res/values-sv/strings.xml +++ b/packages/PrintSpooler/res/values-sv/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Välj utskriftstjänst"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Söker efter skrivare"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Inga utskriftstjänster har aktiverats"</string> <string name="print_no_printers" msgid="4869403323900054866">"Det gick inte att hitta några skrivare"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Skriver ut <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Avbryter <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-sw/strings.xml b/packages/PrintSpooler/res/values-sw/strings.xml index f4d51bf985cb..8ce9190f21a1 100644 --- a/packages/PrintSpooler/res/values-sw/strings.xml +++ b/packages/PrintSpooler/res/values-sw/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Chagua huduma ya printa"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Inatafuta printa"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Huduma za kuchapisha hazijawashwa"</string> <string name="print_no_printers" msgid="4869403323900054866">"Hakuna printa zilizopatikana"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Inachapisha <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Inaghairi <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-ta-rIN/strings.xml b/packages/PrintSpooler/res/values-ta-rIN/strings.xml index 4e292d2059a4..486ddca13e64 100644 --- a/packages/PrintSpooler/res/values-ta-rIN/strings.xml +++ b/packages/PrintSpooler/res/values-ta-rIN/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"அச்சுப் பொறியைத் தேர்வுசெய்யவும்"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"அச்சுப்பொறிகளைத் தேடுகிறது"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"அச்சுப் பொறிகள் இல்லை"</string> <string name="print_no_printers" msgid="4869403323900054866">"பிரிண்டர்கள் எதுவுமில்லை"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> ஐ அச்சிடுகிறது"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> ஐ ரத்துசெய்கிறது"</string> diff --git a/packages/PrintSpooler/res/values-te-rIN/strings.xml b/packages/PrintSpooler/res/values-te-rIN/strings.xml index 8cb5aa61e991..f0f7e0777085 100644 --- a/packages/PrintSpooler/res/values-te-rIN/strings.xml +++ b/packages/PrintSpooler/res/values-te-rIN/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"ముద్రణ సేవను ఎంచుకోండి"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"ప్రింటర్ల కోసం శోధిస్తోంది"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"ముద్రణ సేవలు ఏవీ ప్రారంభించలేదు"</string> <string name="print_no_printers" msgid="4869403323900054866">"ప్రింటర్లు కనుగొనబడలేదు"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>ను ముద్రిస్తోంది"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>ను రద్దు చేస్తోంది"</string> diff --git a/packages/PrintSpooler/res/values-th/strings.xml b/packages/PrintSpooler/res/values-th/strings.xml index c501cf975614..d3ef7c616752 100644 --- a/packages/PrintSpooler/res/values-th/strings.xml +++ b/packages/PrintSpooler/res/values-th/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"เลือกบริการพิมพ์"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"กำลังค้นหาเครื่องพิมพ์"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"ไม่ได้เปิดใช้บริการพิมพ์"</string> <string name="print_no_printers" msgid="4869403323900054866">"ไม่พบเครื่องพิมพ์"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"กำลังพิมพ์ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"กำลังยกเลิก <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-tl/strings.xml b/packages/PrintSpooler/res/values-tl/strings.xml index 18942e27eb2e..061eeb99b54b 100644 --- a/packages/PrintSpooler/res/values-tl/strings.xml +++ b/packages/PrintSpooler/res/values-tl/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Pumili ng serbisyo ng pag-print"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Naghahanap ng mga printer"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Walang mga naka-enable na serbisyo sa pag-print"</string> <string name="print_no_printers" msgid="4869403323900054866">"Walang mga printer na nakita"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Pini-print ang <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Kinakansela ang <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-tr/strings.xml b/packages/PrintSpooler/res/values-tr/strings.xml index a7ef18ce1677..db203aeab045 100644 --- a/packages/PrintSpooler/res/values-tr/strings.xml +++ b/packages/PrintSpooler/res/values-tr/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Yazdırma hizmetini seçin"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Yazıcılar aranıyor"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Etkin yazıcı hizmeti yok"</string> <string name="print_no_printers" msgid="4869403323900054866">"Yazıcı bulunamadı"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> yazdırılıyor"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> iptal ediliyor"</string> diff --git a/packages/PrintSpooler/res/values-uk/strings.xml b/packages/PrintSpooler/res/values-uk/strings.xml index 1e21c06375c8..09c05556950e 100644 --- a/packages/PrintSpooler/res/values-uk/strings.xml +++ b/packages/PrintSpooler/res/values-uk/strings.xml @@ -62,6 +62,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Вибрати службу друку"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Пошук принтерів"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Немає служб друку"</string> <string name="print_no_printers" msgid="4869403323900054866">"Принтери не знайдено"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Завдання \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\" друкується"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Завдання \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\" скасовується"</string> diff --git a/packages/PrintSpooler/res/values-ur-rPK/strings.xml b/packages/PrintSpooler/res/values-ur-rPK/strings.xml index 7356cdba00de..44ca82b1d841 100644 --- a/packages/PrintSpooler/res/values-ur-rPK/strings.xml +++ b/packages/PrintSpooler/res/values-ur-rPK/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"پرنٹ سروس منتخب کریں"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"پرنٹرز تلاش کر رہا ہے"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"کوئی پرنٹ سروس فعال نہیں"</string> <string name="print_no_printers" msgid="4869403323900054866">"کوئی پرنٹرز نہيں ملے"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> پرنٹ کررہا ہے"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> کو منسوخ کر رہا ہے"</string> diff --git a/packages/PrintSpooler/res/values-uz-rUZ/strings.xml b/packages/PrintSpooler/res/values-uz-rUZ/strings.xml index 4b11608c1aa5..477e424a60c7 100644 --- a/packages/PrintSpooler/res/values-uz-rUZ/strings.xml +++ b/packages/PrintSpooler/res/values-uz-rUZ/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Chop etish xizmatini tanlang"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Printerlar qidirilmoqda"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Hech qaysi chop etish xizmati yoqilmagan"</string> <string name="print_no_printers" msgid="4869403323900054866">"Printerlar topilmadi"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Chop etilmoqda: <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> bekor qilinmoqda"</string> diff --git a/packages/PrintSpooler/res/values-vi/strings.xml b/packages/PrintSpooler/res/values-vi/strings.xml index af237a41e427..3428ec7eed74 100644 --- a/packages/PrintSpooler/res/values-vi/strings.xml +++ b/packages/PrintSpooler/res/values-vi/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Chọn dịch vụ in"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Đang tìm kiếm máy in"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Chưa kích hoạt dịch vụ in nào"</string> <string name="print_no_printers" msgid="4869403323900054866">"Không tìm thấy máy in"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"In <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Hủy <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-zh-rCN/strings.xml b/packages/PrintSpooler/res/values-zh-rCN/strings.xml index 9e8e1664ce9b..d1be250617e3 100644 --- a/packages/PrintSpooler/res/values-zh-rCN/strings.xml +++ b/packages/PrintSpooler/res/values-zh-rCN/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"选择打印服务"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"正在搜索打印机"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"未启用任何打印服务"</string> <string name="print_no_printers" msgid="4869403323900054866">"找不到打印机"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"正在打印“<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>”"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"正在取消打印“<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>”"</string> diff --git a/packages/PrintSpooler/res/values-zh-rHK/strings.xml b/packages/PrintSpooler/res/values-zh-rHK/strings.xml index 41a9f8ebaaaa..bca061205695 100644 --- a/packages/PrintSpooler/res/values-zh-rHK/strings.xml +++ b/packages/PrintSpooler/res/values-zh-rHK/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"選擇列印服務"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"正在搜尋打印機"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"沒有已啟用的列印服務"</string> <string name="print_no_printers" msgid="4869403323900054866">"找不到打印機"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"正在列印 <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"正在取消 <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-zh-rTW/strings.xml b/packages/PrintSpooler/res/values-zh-rTW/strings.xml index 5e391fa903ab..c3452528e6d3 100644 --- a/packages/PrintSpooler/res/values-zh-rTW/strings.xml +++ b/packages/PrintSpooler/res/values-zh-rTW/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"選擇列印服務"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"正在搜尋印表機"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"未啟用任何列印服務"</string> <string name="print_no_printers" msgid="4869403323900054866">"找不到印表機"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"正在列印 <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"正在取消 <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-zu/strings.xml b/packages/PrintSpooler/res/values-zu/strings.xml index a2c3172f91e3..7ba895020b58 100644 --- a/packages/PrintSpooler/res/values-zu/strings.xml +++ b/packages/PrintSpooler/res/values-zu/strings.xml @@ -60,6 +60,7 @@ </plurals> <string name="choose_print_service" msgid="3740309762324459694">"Khetha isevisi yephrinta"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Isesha amaphrinta"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"Awekho amasevisi okuphrinta enikwe amandla"</string> <string name="print_no_printers" msgid="4869403323900054866">"Awekho amaphrinta atholiwe"</string> <string name="printing_notification_title_template" msgid="295903957762447362">"Iphrinta i-<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Ikhansela i-<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml index 9e48849226a3..a37196e48891 100644 --- a/packages/SettingsLib/res/values/strings.xml +++ b/packages/SettingsLib/res/values/strings.xml @@ -348,4 +348,7 @@ <!-- Header for items under the work user [CHAR LIMIT=30] --> <string name="category_work">Work</string> + <!-- Full package name of OEM preferred device feedback reporter. Leave this blank, overlaid in Settings/TvSettings [DO NOT TRANSLATE] --> + <string name="oem_preferred_feedback_reporter" translatable="false" /> + </resources> diff --git a/packages/SettingsLib/src/com/android/settingslib/DeviceInfoUtils.java b/packages/SettingsLib/src/com/android/settingslib/DeviceInfoUtils.java new file mode 100644 index 000000000000..ff1c8665b3d2 --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/DeviceInfoUtils.java @@ -0,0 +1,172 @@ +/* + * 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.settingslib; + +import android.content.Context; +import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.os.Build; +import android.text.TextUtils; +import android.text.format.DateFormat; +import android.util.Log; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Locale; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class DeviceInfoUtils { + private static final String TAG = "DeviceInfoUtils"; + + private static final String FILENAME_PROC_VERSION = "/proc/version"; + private static final String FILENAME_MSV = "/sys/board_properties/soc/msv"; + + /** + * Reads a line from the specified file. + * @param filename the file to read from + * @return the first line, if any. + * @throws IOException if the file couldn't be read + */ + private static String readLine(String filename) throws IOException { + BufferedReader reader = new BufferedReader(new FileReader(filename), 256); + try { + return reader.readLine(); + } finally { + reader.close(); + } + } + + public static String getFormattedKernelVersion() { + try { + return formatKernelVersion(readLine(FILENAME_PROC_VERSION)); + } catch (IOException e) { + Log.e(TAG, "IO Exception when getting kernel version for Device Info screen", + e); + + return "Unavailable"; + } + } + + public static String formatKernelVersion(String rawKernelVersion) { + // Example (see tests for more): + // Linux version 3.0.31-g6fb96c9 (android-build@xxx.xxx.xxx.xxx.com) \ + // (gcc version 4.6.x-xxx 20120106 (prerelease) (GCC) ) #1 SMP PREEMPT \ + // Thu Jun 28 11:02:39 PDT 2012 + + final String PROC_VERSION_REGEX = + "Linux version (\\S+) " + /* group 1: "3.0.31-g6fb96c9" */ + "\\((\\S+?)\\) " + /* group 2: "x@y.com" (kernel builder) */ + "(?:\\(gcc.+? \\)) " + /* ignore: GCC version information */ + "(#\\d+) " + /* group 3: "#1" */ + "(?:.*?)?" + /* ignore: optional SMP, PREEMPT, and any CONFIG_FLAGS */ + "((Sun|Mon|Tue|Wed|Thu|Fri|Sat).+)"; /* group 4: "Thu Jun 28 11:02:39 PDT 2012" */ + + Matcher m = Pattern.compile(PROC_VERSION_REGEX).matcher(rawKernelVersion); + if (!m.matches()) { + Log.e(TAG, "Regex did not match on /proc/version: " + rawKernelVersion); + return "Unavailable"; + } else if (m.groupCount() < 4) { + Log.e(TAG, "Regex match on /proc/version only returned " + m.groupCount() + + " groups"); + return "Unavailable"; + } + return m.group(1) + "\n" + // 3.0.31-g6fb96c9 + m.group(2) + " " + m.group(3) + "\n" + // x@y.com #1 + m.group(4); // Thu Jun 28 11:02:39 PDT 2012 + } + + /** + * Returns " (ENGINEERING)" if the msv file has a zero value, else returns "". + * @return a string to append to the model number description. + */ + public static String getMsvSuffix() { + // Production devices should have a non-zero value. If we can't read it, assume it's a + // production device so that we don't accidentally show that it's an ENGINEERING device. + try { + String msv = readLine(FILENAME_MSV); + // Parse as a hex number. If it evaluates to a zero, then it's an engineering build. + if (Long.parseLong(msv, 16) == 0) { + return " (ENGINEERING)"; + } + } catch (IOException|NumberFormatException e) { + // Fail quietly, as the file may not exist on some devices, or may be unreadable + } + return ""; + } + + public static String getFeedbackReporterPackage(Context context) { + final String feedbackReporter = + context.getResources().getString(R.string.oem_preferred_feedback_reporter); + if (TextUtils.isEmpty(feedbackReporter)) { + // Reporter not configured. Return. + return feedbackReporter; + } + // Additional checks to ensure the reporter is on system image, and reporter is + // configured to listen to the intent. Otherwise, dont show the "send feedback" option. + final Intent intent = new Intent(Intent.ACTION_BUG_REPORT); + + PackageManager pm = context.getPackageManager(); + List<ResolveInfo> resolvedPackages = + pm.queryIntentActivities(intent, PackageManager.GET_RESOLVED_FILTER); + for (ResolveInfo info : resolvedPackages) { + if (info.activityInfo != null) { + if (!TextUtils.isEmpty(info.activityInfo.packageName)) { + try { + ApplicationInfo ai = + pm.getApplicationInfo(info.activityInfo.packageName, 0); + if ((ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { + // Package is on the system image + if (TextUtils.equals( + info.activityInfo.packageName, feedbackReporter)) { + return feedbackReporter; + } + } + } catch (PackageManager.NameNotFoundException e) { + // No need to do anything here. + } + } + } + } + return null; + } + + public static String getSecurityPatch() { + String patch = Build.VERSION.SECURITY_PATCH; + if (!"".equals(patch)) { + try { + SimpleDateFormat template = new SimpleDateFormat("yyyy-MM-dd"); + Date patchDate = template.parse(patch); + String format = DateFormat.getBestDateTimePattern(Locale.getDefault(), "dMMMMyyyy"); + patch = DateFormat.format(format, patchDate).toString(); + } catch (ParseException e) { + // broken parse; fall through and use the raw string + } + return patch; + } else { + return null; + } + } + +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index 3f0000e645d5..069279fdafe3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -62,6 +62,7 @@ import android.service.notification.NotificationListenerService; import android.service.notification.NotificationListenerService.RankingMap; import android.service.notification.StatusBarNotification; import android.text.TextUtils; +import android.util.ArraySet; import android.util.Log; import android.util.Slog; import android.util.SparseArray; @@ -175,6 +176,7 @@ public abstract class BaseStatusBar extends SystemUI implements protected boolean mDeviceInteractive; protected boolean mVisible; + protected ArraySet<Entry> mHeadsUpEntriesToRemoveOnSwitch = new ArraySet<>(); // mScreenOnFromKeyguard && mVisible. private boolean mVisibleToUser; @@ -1664,7 +1666,10 @@ public abstract class BaseStatusBar extends SystemUI implements return; } - final PendingIntent intent = sbn.getNotification().contentIntent; + Notification notification = sbn.getNotification(); + final PendingIntent intent = notification.contentIntent != null + ? notification.contentIntent + : notification.fullScreenIntent; final String notificationKey = sbn.getKey(); // Mark notification for one frame. @@ -1746,8 +1751,8 @@ public abstract class BaseStatusBar extends SystemUI implements } public void register(ExpandableNotificationRow row, StatusBarNotification sbn) { - final PendingIntent contentIntent = sbn.getNotification().contentIntent; - if (contentIntent != null) { + Notification notification = sbn.getNotification(); + if (notification.contentIntent != null || notification.fullScreenIntent != null) { row.setOnClickListener(this); } else { row.setOnClickListener(null); @@ -2013,6 +2018,8 @@ public abstract class BaseStatusBar extends SystemUI implements Entry entry = mNotificationData.get(key); if (entry == null) { return; + } else if (mHeadsUpEntriesToRemoveOnSwitch.contains(entry)) { + mHeadsUpEntriesToRemoveOnSwitch.remove(entry); } Notification n = notification.getNotification(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java index bbef1c031ff5..fbe97300aa3d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java @@ -84,10 +84,10 @@ public class NotificationGroupManager { // the close future. See b/23676310 for reference. return; } - if (notif.isGroupSummary()) { - group.summary = null; - } else { + if (notif.isGroupChild()) { group.children.remove(removed); + } else { + group.summary = null; } if (group.children.isEmpty()) { if (group.summary == null) { @@ -107,17 +107,17 @@ public class NotificationGroupManager { group = new NotificationGroup(); mGroupMap.put(groupKey, group); } - if (notif.isGroupSummary()) { + if (notif.isGroupChild()) { + group.children.add(added); + if (group.summary != null && group.children.size() == 1 && !group.expanded) { + group.summary.row.updateNotificationHeader(); + } + } else { group.summary = added; group.expanded = added.row.areChildrenExpanded(); if (!group.children.isEmpty()) { mListener.onGroupCreatedFromChildren(group); } - } else { - group.children.add(added); - if (group.summary != null && group.children.size() == 1 && !group.expanded) { - group.summary.row.updateNotificationHeader(); - } } } @@ -169,7 +169,7 @@ public class NotificationGroupManager { * @return whether a given notification is a summary in a group which has children */ public boolean isSummaryOfGroup(StatusBarNotification sbn) { - if (sbn.getNotification().isGroupChild()) { + if (!sbn.getNotification().isGroupSummary()) { return false; } NotificationGroup group = mGroupMap.get(sbn.getGroupKey()); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 3e5251587820..9ab2a2c28793 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -617,7 +617,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, }; private HashMap<ExpandableNotificationRow, List<ExpandableNotificationRow>> mTmpChildOrderMap = new HashMap<>(); - private HashSet<Entry> mHeadsUpEntriesToRemoveOnSwitch = new HashSet<>(); private RankingMap mLatestRankingMap; private boolean mNoAnimationOnNextBarModeChange; private FalsingManager mFalsingManager; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java index dc9f5e863379..5cfd17463886 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java @@ -458,7 +458,10 @@ public class HeadsUpManager implements ViewTreeObserver.OnComputeInternalInsetsL mReleaseOnExpandFinish = false; } else { for (NotificationData.Entry entry : mEntriesToRemoveAfterExpand) { - removeHeadsUpEntry(entry); + if (isHeadsUp(entry.key)) { + // Maybe the heads-up was removed already + removeHeadsUpEntry(entry); + } } } mEntriesToRemoveAfterExpand.clear(); @@ -596,6 +599,9 @@ public class HeadsUpManager implements ViewTreeObserver.OnComputeInternalInsetsL postTime = Math.max(postTime, currentTime); } removeAutoRemovalCallbacks(); + if (mEntriesToRemoveAfterExpand.contains(entry)) { + mEntriesToRemoveAfterExpand.remove(entry); + } if (!hasFullScreenIntent(entry) && !mRemoteInputActive) { long finishTime = postTime + mHeadsUpNotificationDecay; long removeDelay = Math.max(finishTime - currentTime, mMinimumDisplayTime); diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 9896ec5e49a7..e28d198cf821 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -1418,19 +1418,9 @@ final class ActivityStack { if (top == null) { return; } - if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, - "ensureActivitiesVisible behind " + top + if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "ensureActivitiesVisible behind " + top + " configChanges=0x" + Integer.toHexString(configChanges)); - - if (mTranslucentActivityWaiting != top) { - mUndrawnActivitiesBelowTopTranslucent.clear(); - if (mTranslucentActivityWaiting != null) { - // Call the callback with a timeout indication. - notifyActivityDrawnLocked(null); - mTranslucentActivityWaiting = null; - } - mHandler.removeMessages(TRANSLUCENT_TIMEOUT_MSG); - } + checkTranslucentActivityWaiting(top); // If the top activity is not fullscreen, then we need to // make sure any activities under it are now visible. @@ -1458,7 +1448,6 @@ final class ActivityStack { if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Make visible? " + r + " finishing=" + r.finishing + " state=" + r.state); - // First: if this is not the current activity being started, make // sure it matches the current configuration. if (r != starting) { @@ -1466,143 +1455,28 @@ final class ActivityStack { } if (r.app == null || r.app.thread == null) { - // We need to make sure the app is running if it's the top, or it is - // just made visible from invisible. - // If the app is already visible, it must have died while it was visible. - // In this case, we'll show the dead window but will not restart the app. - // Otherwise we could end up thrashing. - if (r == top || !r.visible) { - // This activity needs to be visible, but isn't even running... - // get it started and resume if no other stack in this stack is resumed. - if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, - "Start and freeze screen for " + r); - if (r != starting) { - r.startFreezingScreenLocked(r.app, configChanges); - } - if (!r.visible || r.mLaunchTaskBehind) { - if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, - "Starting and making visible: " + r); - setVisible(r, true); - } - if (r != starting) { - mStackSupervisor.startSpecificActivityLocked( - r, noStackActivityResumed, false); - if (activityNdx >= activities.size()) { - // Record may be removed if its process needs to restart. - activityNdx = activities.size() - 1; - } else { - noStackActivityResumed = false; - } + if (makeVisibleAndRestartIfNeeded(starting, configChanges, top, + noStackActivityResumed, r)) { + if (activityNdx >= activities.size()) { + // Record may be removed if its process needs to restart. + activityNdx = activities.size() - 1; + } else { + noStackActivityResumed = false; } } } else if (r.visible) { - // If this activity is already visible, then there is nothing - // else to do here. - if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, - "Skipping: already visible at " + r); - r.stopFreezingScreenLocked(false); - try { - if (r.returningOptions != null) { - r.app.thread.scheduleOnNewActivityOptions(r.appToken, - r.returningOptions); - } - } catch(RemoteException e) { - } - if (r.state == ActivityState.RESUMED) { + if (alreadyVisible(r)) { noStackActivityResumed = false; } } else { - // This activity is not currently visible, but is running. - // Tell it to become visible. - r.visible = true; - if (r.state != ActivityState.RESUMED && r != starting) { - // If this activity is paused, tell it - // to now show its window. - if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, - "Making visible and scheduling visibility: " + r); - try { - if (mTranslucentActivityWaiting != null) { - r.updateOptionsLocked(r.returningOptions); - mUndrawnActivitiesBelowTopTranslucent.add(r); - } - setVisible(r, true); - r.sleeping = false; - r.app.pendingUiClean = true; - r.app.thread.scheduleWindowVisibility(r.appToken, true); - r.stopFreezingScreenLocked(false); - } catch (Exception e) { - // Just skip on any failure; we'll make it - // visible when it next restarts. - Slog.w(TAG, "Exception thrown making visibile: " - + r.intent.getComponent(), e); - } - } + becomeVisible(starting, r); } - // Aggregate current change flags. configChanges |= r.configChangeFlags; - - if (r.fullscreen) { - // At this point, nothing else needs to be shown in this task. - behindFullscreenActivity = true; - if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Fullscreen: at " + r - + " stackInvisible=" + stackInvisible - + " behindFullscreenActivity=" + behindFullscreenActivity); - } else if (!isHomeStack() && r.frontOfTask && task.isOverHomeStack()) { - behindFullscreenActivity = true; - if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Showing home: at " + r - + " stackInvisible=" + stackInvisible - + " behindFullscreenActivity=" + behindFullscreenActivity); - } + behindFullscreenActivity = updateBehindFullscreen(stackInvisible, + behindFullscreenActivity, task, r); } else { - if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, - "Make invisible? " + r + " finishing=" + r.finishing - + " state=" + r.state + " stackInvisible=" + stackInvisible - + " behindFullscreenActivity=" + behindFullscreenActivity); - // Now for any activities that aren't visible to the user, make - // sure they no longer are keeping the screen frozen. - if (r.visible) { - if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Making invisible: " + r); - try { - setVisible(r, false); - switch (r.state) { - case STOPPING: - case STOPPED: - if (r.app != null && r.app.thread != null) { - if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, - "Scheduling invisibility: " + r); - r.app.thread.scheduleWindowVisibility(r.appToken, false); - } - break; - - case INITIALIZING: - case RESUMED: - case PAUSING: - case PAUSED: - // This case created for transitioning activities from - // translucent to opaque {@link Activity#convertToOpaque}. - if (getVisibleBehindActivity() == r) { - releaseBackgroundResources(r); - } else { - if (!mStackSupervisor.mStoppingActivities.contains(r)) { - mStackSupervisor.mStoppingActivities.add(r); - } - mStackSupervisor.scheduleIdleLocked(); - } - break; - - default: - break; - } - } catch (Exception e) { - // Just skip on any failure; we'll make it - // visible when it next restarts. - Slog.w(TAG, "Exception thrown making hidden: " - + r.intent.getComponent(), e); - } - } else { - if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Already invisible: " + r); - } + becomeInvisible(stackInvisible, behindFullscreenActivity, r); } } if (mStackId == FREEFORM_WORKSPACE_STACK_ID) { @@ -1620,6 +1494,147 @@ final class ActivityStack { } } + private void checkTranslucentActivityWaiting(ActivityRecord top) { + if (mTranslucentActivityWaiting != top) { + mUndrawnActivitiesBelowTopTranslucent.clear(); + if (mTranslucentActivityWaiting != null) { + // Call the callback with a timeout indication. + notifyActivityDrawnLocked(null); + mTranslucentActivityWaiting = null; + } + mHandler.removeMessages(TRANSLUCENT_TIMEOUT_MSG); + } + } + + private boolean makeVisibleAndRestartIfNeeded(ActivityRecord starting, int configChanges, + ActivityRecord top, boolean noStackActivityResumed, ActivityRecord r) { + // We need to make sure the app is running if it's the top, or it is just made visible from + // invisible. If the app is already visible, it must have died while it was visible. In this + // case, we'll show the dead window but will not restart the app. Otherwise we could end up + // thrashing. + if (r == top || !r.visible) { + // This activity needs to be visible, but isn't even running... + // get it started and resume if no other stack in this stack is resumed. + if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Start and freeze screen for " + r); + if (r != starting) { + r.startFreezingScreenLocked(r.app, configChanges); + } + if (!r.visible || r.mLaunchTaskBehind) { + if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Starting and making visible: " + r); + setVisible(r, true); + } + if (r != starting) { + mStackSupervisor.startSpecificActivityLocked(r, noStackActivityResumed, false); + return true; + } + } + return false; + } + + private void becomeInvisible(boolean stackInvisible, boolean behindFullscreenActivity, + ActivityRecord r) { + if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Make invisible? " + r + " finishing=" + + r.finishing + " state=" + r.state + " stackInvisible=" + stackInvisible + + " behindFullscreenActivity=" + behindFullscreenActivity); + if (!r.visible) { + if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Already invisible: " + r); + return; + } + // Now for any activities that aren't visible to the user, make sure they no longer are + // keeping the screen frozen. + if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Making invisible: " + r); + try { + setVisible(r, false); + switch (r.state) { + case STOPPING: + case STOPPED: + if (r.app != null && r.app.thread != null) { + if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, + "Scheduling invisibility: " + r); + r.app.thread.scheduleWindowVisibility(r.appToken, false); + } + break; + + case INITIALIZING: + case RESUMED: + case PAUSING: + case PAUSED: + // This case created for transitioning activities from + // translucent to opaque {@link Activity#convertToOpaque}. + if (getVisibleBehindActivity() == r) { + releaseBackgroundResources(r); + } else { + if (!mStackSupervisor.mStoppingActivities.contains(r)) { + mStackSupervisor.mStoppingActivities.add(r); + } + mStackSupervisor.scheduleIdleLocked(); + } + break; + + default: + break; + } + } catch (Exception e) { + // Just skip on any failure; we'll make it visible when it next restarts. + Slog.w(TAG, "Exception thrown making hidden: " + r.intent.getComponent(), e); + } + } + + private boolean updateBehindFullscreen(boolean stackInvisible, boolean behindFullscreenActivity, + TaskRecord task, ActivityRecord r) { + if (r.fullscreen) { + // At this point, nothing else needs to be shown in this task. + behindFullscreenActivity = true; + if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Fullscreen: at " + r + + " stackInvisible=" + stackInvisible + + " behindFullscreenActivity=" + behindFullscreenActivity); + } else if (!isHomeStack() && r.frontOfTask && task.isOverHomeStack()) { + behindFullscreenActivity = true; + if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Showing home: at " + r + + " stackInvisible=" + stackInvisible + + " behindFullscreenActivity=" + behindFullscreenActivity); + } + return behindFullscreenActivity; + } + + private void becomeVisible(ActivityRecord starting, ActivityRecord r) { + // This activity is not currently visible, but is running. Tell it to become visible. + r.visible = true; + if (r.state != ActivityState.RESUMED && r != starting) { + // If this activity is paused, tell it to now show its window. + if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, + "Making visible and scheduling visibility: " + r); + try { + if (mTranslucentActivityWaiting != null) { + r.updateOptionsLocked(r.returningOptions); + mUndrawnActivitiesBelowTopTranslucent.add(r); + } + setVisible(r, true); + r.sleeping = false; + r.app.pendingUiClean = true; + r.app.thread.scheduleWindowVisibility(r.appToken, true); + r.stopFreezingScreenLocked(false); + } catch (Exception e) { + // Just skip on any failure; we'll make it + // visible when it next restarts. + Slog.w(TAG, "Exception thrown making visibile: " + r.intent.getComponent(), e); + } + } + } + + private boolean alreadyVisible(ActivityRecord r) { + // If this activity is already visible, then there is nothing else to do here. + if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Skipping: already visible at " + r); + r.stopFreezingScreenLocked(false); + try { + if (r.returningOptions != null) { + r.app.thread.scheduleOnNewActivityOptions(r.appToken, r.returningOptions); + } + } catch(RemoteException e) { + } + return r.state == ActivityState.RESUMED; + } + void convertActivityToTranslucent(ActivityRecord r) { mTranslucentActivityWaiting = r; mUndrawnActivitiesBelowTopTranslucent.clear(); diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java index 7028fa6695f6..90dd10eae69a 100644 --- a/services/core/java/com/android/server/media/MediaSessionService.java +++ b/services/core/java/com/android/server/media/MediaSessionService.java @@ -948,8 +948,8 @@ public class MediaSessionService extends SystemService implements Monitor { // Launch the last PendingIntent we had with priority int userId = ActivityManager.getCurrentUser(); UserRecord user = mUserRecords.get(userId); - if (user.mLastMediaButtonReceiver != null - || user.mRestoredMediaButtonReceiver != null) { + if (user != null && (user.mLastMediaButtonReceiver != null + || user.mRestoredMediaButtonReceiver != null)) { if (DEBUG) { Log.d(TAG, "Sending media key to last known PendingIntent " + user.mLastMediaButtonReceiver + " or restored Intent " diff --git a/services/core/java/com/android/server/net/LockdownVpnTracker.java b/services/core/java/com/android/server/net/LockdownVpnTracker.java index 9db6a0613544..5b1cedca3ee2 100644 --- a/services/core/java/com/android/server/net/LockdownVpnTracker.java +++ b/services/core/java/com/android/server/net/LockdownVpnTracker.java @@ -239,9 +239,7 @@ public class LockdownVpnTracker { throw new RuntimeException("Problem setting firewall rules", e); } - synchronized (mStateLock) { - handleStateChangedLocked(); - } + handleStateChangedLocked(); } public void shutdown() { diff --git a/services/core/java/com/android/server/pm/SELinuxMMAC.java b/services/core/java/com/android/server/pm/SELinuxMMAC.java index 5d8b1d281d54..903d12bcc217 100644 --- a/services/core/java/com/android/server/pm/SELinuxMMAC.java +++ b/services/core/java/com/android/server/pm/SELinuxMMAC.java @@ -103,6 +103,9 @@ public final class SELinuxMMAC { // Append privapp to existing seinfo label private static final String PRIVILEGED_APP_STR = ":privapp"; + // Append autoplay to existing seinfo label + private static final String AUTOPLAY_APP_STR = ":autoplayapp"; + /** * Load the mac_permissions.xml file containing all seinfo assignments used to * label apps. The loaded mac_permissions.xml file is determined by the @@ -316,6 +319,9 @@ public final class SELinuxMMAC { } } + if (pkg.applicationInfo.isAutoPlayApp()) + pkg.applicationInfo.seinfo += AUTOPLAY_APP_STR; + if (pkg.applicationInfo.isPrivilegedApp()) pkg.applicationInfo.seinfo += PRIVILEGED_APP_STR; diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index e264c437241c..4e38f67511dd 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -55,17 +55,6 @@ class DisplayContent { * from mDisplayWindows; */ private final WindowList mWindows = new WindowList(); - // This protects the following display size properties, so that - // getDisplaySize() doesn't need to acquire the global lock. This is - // needed because the window manager sometimes needs to use ActivityThread - // while it has its global state locked (for example to load animation - // resources), but the ActivityThread also needs get the current display - // size sometimes when it has its package lock held. - // - // These will only be modified with both mWindowMap and mDisplaySizeLock - // held (in that order) so the window manager doesn't need to acquire this - // lock when needing these values in its normal operation. - final Object mDisplaySizeLock = new Object(); int mInitialDisplayWidth = 0; int mInitialDisplayHeight = 0; int mInitialDisplayDensity = 0; @@ -202,18 +191,16 @@ class DisplayContent { } void initializeDisplayBaseInfo() { - synchronized(mDisplaySizeLock) { - // Bootstrap the default logical display from the display manager. - final DisplayInfo newDisplayInfo = - mService.mDisplayManagerInternal.getDisplayInfo(mDisplayId); - if (newDisplayInfo != null) { - mDisplayInfo.copyFrom(newDisplayInfo); - } - mBaseDisplayWidth = mInitialDisplayWidth = mDisplayInfo.logicalWidth; - mBaseDisplayHeight = mInitialDisplayHeight = mDisplayInfo.logicalHeight; - mBaseDisplayDensity = mInitialDisplayDensity = mDisplayInfo.logicalDensityDpi; - mBaseDisplayRect.set(0, 0, mBaseDisplayWidth, mBaseDisplayHeight); + // Bootstrap the default logical display from the display manager. + final DisplayInfo newDisplayInfo = + mService.mDisplayManagerInternal.getDisplayInfo(mDisplayId); + if (newDisplayInfo != null) { + mDisplayInfo.copyFrom(newDisplayInfo); } + mBaseDisplayWidth = mInitialDisplayWidth = mDisplayInfo.logicalWidth; + mBaseDisplayHeight = mInitialDisplayHeight = mDisplayInfo.logicalHeight; + mBaseDisplayDensity = mInitialDisplayDensity = mDisplayInfo.logicalDensityDpi; + mBaseDisplayRect.set(0, 0, mBaseDisplayWidth, mBaseDisplayHeight); } void getLogicalDisplayRect(Rect out) { diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 92eacd6b750f..4293f0a48e5d 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -6908,27 +6908,25 @@ public class WindowManagerService extends IWindowManager.Stub final int appWidth = mPolicy.getNonDecorDisplayWidth(dw, dh, mRotation); final int appHeight = mPolicy.getNonDecorDisplayHeight(dw, dh, mRotation); final DisplayInfo displayInfo = displayContent.getDisplayInfo(); - synchronized(displayContent.mDisplaySizeLock) { - displayInfo.rotation = mRotation; - displayInfo.logicalWidth = dw; - displayInfo.logicalHeight = dh; - displayInfo.logicalDensityDpi = displayContent.mBaseDisplayDensity; - displayInfo.appWidth = appWidth; - displayInfo.appHeight = appHeight; - displayInfo.getLogicalMetrics(mRealDisplayMetrics, - CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO, null); - displayInfo.getAppMetrics(mDisplayMetrics); - if (displayContent.mDisplayScalingDisabled) { - displayInfo.flags |= Display.FLAG_SCALING_DISABLED; - } else { - displayInfo.flags &= ~Display.FLAG_SCALING_DISABLED; - } + displayInfo.rotation = mRotation; + displayInfo.logicalWidth = dw; + displayInfo.logicalHeight = dh; + displayInfo.logicalDensityDpi = displayContent.mBaseDisplayDensity; + displayInfo.appWidth = appWidth; + displayInfo.appHeight = appHeight; + displayInfo.getLogicalMetrics(mRealDisplayMetrics, + CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO, null); + displayInfo.getAppMetrics(mDisplayMetrics); + if (displayContent.mDisplayScalingDisabled) { + displayInfo.flags |= Display.FLAG_SCALING_DISABLED; + } else { + displayInfo.flags &= ~Display.FLAG_SCALING_DISABLED; + } - mDisplayManagerInternal.setDisplayInfoOverrideFromWindowManager( - displayContent.getDisplayId(), displayInfo); + mDisplayManagerInternal.setDisplayInfoOverrideFromWindowManager( + displayContent.getDisplayId(), displayInfo); - displayContent.mBaseDisplayRect.set(0, 0, dw, dh); - } + displayContent.mBaseDisplayRect.set(0, 0, dw, dh); if (false) { Slog.i(TAG, "Set app display size: " + appWidth + " x " + appHeight); } @@ -8060,10 +8058,8 @@ public class WindowManagerService extends IWindowManager.Stub synchronized (mWindowMap) { final DisplayContent displayContent = getDisplayContentLocked(displayId); if (displayContent != null && displayContent.hasAccess(Binder.getCallingUid())) { - synchronized(displayContent.mDisplaySizeLock) { - size.x = displayContent.mInitialDisplayWidth; - size.y = displayContent.mInitialDisplayHeight; - } + size.x = displayContent.mInitialDisplayWidth; + size.y = displayContent.mInitialDisplayHeight; } } } @@ -8073,10 +8069,8 @@ public class WindowManagerService extends IWindowManager.Stub synchronized (mWindowMap) { final DisplayContent displayContent = getDisplayContentLocked(displayId); if (displayContent != null && displayContent.hasAccess(Binder.getCallingUid())) { - synchronized(displayContent.mDisplaySizeLock) { - size.x = displayContent.mBaseDisplayWidth; - size.y = displayContent.mBaseDisplayHeight; - } + size.x = displayContent.mBaseDisplayWidth; + size.y = displayContent.mBaseDisplayHeight; } } } @@ -8145,13 +8139,9 @@ public class WindowManagerService extends IWindowManager.Stub } } - private void setForcedDisplayScalingModeLocked(DisplayContent displayContent, - int mode) { + private void setForcedDisplayScalingModeLocked(DisplayContent displayContent, int mode) { Slog.i(TAG, "Using display scaling mode: " + (mode == 0 ? "auto" : "off")); - - synchronized(displayContent.mDisplaySizeLock) { - displayContent.mDisplayScalingDisabled = (mode != 0); - } + displayContent.mDisplayScalingDisabled = (mode != 0); reconfigureDisplayLocked(displayContent); } @@ -8169,13 +8159,11 @@ public class WindowManagerService extends IWindowManager.Stub try { width = Integer.parseInt(sizeStr.substring(0, pos)); height = Integer.parseInt(sizeStr.substring(pos+1)); - synchronized(displayContent.mDisplaySizeLock) { - if (displayContent.mBaseDisplayWidth != width - || displayContent.mBaseDisplayHeight != height) { - Slog.i(TAG, "FORCED DISPLAY SIZE: " + width + "x" + height); - displayContent.mBaseDisplayWidth = width; - displayContent.mBaseDisplayHeight = height; - } + if (displayContent.mBaseDisplayWidth != width + || displayContent.mBaseDisplayHeight != height) { + Slog.i(TAG, "FORCED DISPLAY SIZE: " + width + "x" + height); + displayContent.mBaseDisplayWidth = width; + displayContent.mBaseDisplayHeight = height; } } catch (NumberFormatException ex) { } @@ -8192,11 +8180,9 @@ public class WindowManagerService extends IWindowManager.Stub int density; try { density = Integer.parseInt(densityStr); - synchronized(displayContent.mDisplaySizeLock) { - if (displayContent.mBaseDisplayDensity != density) { - Slog.i(TAG, "FORCED DISPLAY DENSITY: " + density); - displayContent.mBaseDisplayDensity = density; - } + if (displayContent.mBaseDisplayDensity != density) { + Slog.i(TAG, "FORCED DISPLAY DENSITY: " + density); + displayContent.mBaseDisplayDensity = density; } } catch (NumberFormatException ex) { } @@ -8206,21 +8192,16 @@ public class WindowManagerService extends IWindowManager.Stub int mode = Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.DISPLAY_SCALING_FORCE, 0); if (mode != 0) { - synchronized(displayContent.mDisplaySizeLock) { - Slog.i(TAG, "FORCED DISPLAY SCALING DISABLED"); - displayContent.mDisplayScalingDisabled = true; - } + Slog.i(TAG, "FORCED DISPLAY SCALING DISABLED"); + displayContent.mDisplayScalingDisabled = true; } } // displayContent must not be null private void setForcedDisplaySizeLocked(DisplayContent displayContent, int width, int height) { Slog.i(TAG, "Using new display size: " + width + "x" + height); - - synchronized(displayContent.mDisplaySizeLock) { - displayContent.mBaseDisplayWidth = width; - displayContent.mBaseDisplayHeight = height; - } + displayContent.mBaseDisplayWidth = width; + displayContent.mBaseDisplayHeight = height; reconfigureDisplayLocked(displayContent); } @@ -8256,9 +8237,7 @@ public class WindowManagerService extends IWindowManager.Stub synchronized (mWindowMap) { final DisplayContent displayContent = getDisplayContentLocked(displayId); if (displayContent != null && displayContent.hasAccess(Binder.getCallingUid())) { - synchronized(displayContent.mDisplaySizeLock) { - return displayContent.mInitialDisplayDensity; - } + return displayContent.mInitialDisplayDensity; } } return -1; @@ -8269,9 +8248,7 @@ public class WindowManagerService extends IWindowManager.Stub synchronized (mWindowMap) { final DisplayContent displayContent = getDisplayContentLocked(displayId); if (displayContent != null && displayContent.hasAccess(Binder.getCallingUid())) { - synchronized(displayContent.mDisplaySizeLock) { - return displayContent.mBaseDisplayDensity; - } + return displayContent.mBaseDisplayDensity; } } return -1; @@ -8306,10 +8283,7 @@ public class WindowManagerService extends IWindowManager.Stub // displayContent must not be null private void setForcedDisplayDensityLocked(DisplayContent displayContent, int density) { Slog.i(TAG, "Using new display density: " + density); - - synchronized(displayContent.mDisplaySizeLock) { - displayContent.mBaseDisplayDensity = density; - } + displayContent.mBaseDisplayDensity = density; reconfigureDisplayLocked(displayContent); } @@ -8400,12 +8374,10 @@ public class WindowManagerService extends IWindowManager.Stub private void setOverscanLocked(DisplayContent displayContent, int left, int top, int right, int bottom) { final DisplayInfo displayInfo = displayContent.getDisplayInfo(); - synchronized (displayContent.mDisplaySizeLock) { - displayInfo.overscanLeft = left; - displayInfo.overscanTop = top; - displayInfo.overscanRight = right; - displayInfo.overscanBottom = bottom; - } + displayInfo.overscanLeft = left; + displayInfo.overscanTop = top; + displayInfo.overscanRight = right; + displayInfo.overscanBottom = bottom; mDisplaySettings.setOverscanLocked(displayInfo.uniqueId, displayInfo.name, left, top, right, bottom); @@ -9992,14 +9964,11 @@ public class WindowManagerService extends IWindowManager.Stub DisplayInfo displayInfo = displayContent.getDisplayInfo(); final Rect rect = new Rect(); mDisplaySettings.getOverscanLocked(displayInfo.name, displayInfo.uniqueId, rect); - synchronized (displayContent.mDisplaySizeLock) { - displayInfo.overscanLeft = rect.left; - displayInfo.overscanTop = rect.top; - displayInfo.overscanRight = rect.right; - displayInfo.overscanBottom = rect.bottom; - mDisplayManagerInternal.setDisplayInfoOverrideFromWindowManager( - displayId, displayInfo); - } + displayInfo.overscanLeft = rect.left; + displayInfo.overscanTop = rect.top; + displayInfo.overscanRight = rect.right; + displayInfo.overscanBottom = rect.bottom; + mDisplayManagerInternal.setDisplayInfoOverrideFromWindowManager(displayId, displayInfo); configureDisplayPolicyLocked(displayContent); // TODO: Create an input channel for each display with touch capability. |