diff --git a/Android.mk b/Android.mk index c6f7820511de1fe95dae02ec66051dbfc634618b..bdb45550fa16d837e1c75ece8675b5590bd02aa0 100644 --- a/Android.mk +++ b/Android.mk @@ -200,6 +200,7 @@ LOCAL_SRC_FILES += \ core/java/android/net/ICaptivePortal.aidl \ core/java/android/net/IConnectivityManager.aidl \ core/java/android/net/IConnectivityMetricsLogger.aidl \ + core/java/android/net/IIpConnectivityMetrics.aidl \ core/java/android/net/IEthernetManager.aidl \ core/java/android/net/IEthernetServiceListener.aidl \ core/java/android/net/INetworkManagementEventObserver.aidl \ @@ -863,6 +864,7 @@ framework_docs_LOCAL_DROIDDOC_OPTIONS := \ -since $(SRC_API_DIR)/22.txt 22 \ -since $(SRC_API_DIR)/23.txt 23 \ -since $(SRC_API_DIR)/24.txt 24 \ + -since $(SRC_API_DIR)/25.txt 25 \ -werror -hide 111 -hide 113 \ -overview $(LOCAL_PATH)/core/java/overview.html @@ -930,6 +932,7 @@ LOCAL_DROIDDOC_STUB_OUT_DIR := $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES LOCAL_DROIDDOC_OPTIONS:=\ $(framework_docs_LOCAL_DROIDDOC_OPTIONS) \ + -referenceonly \ -api $(INTERNAL_PLATFORM_API_FILE) \ -removedApi $(INTERNAL_PLATFORM_REMOVED_API_FILE) \ -nodocs @@ -963,6 +966,7 @@ LOCAL_DROIDDOC_STUB_OUT_DIR := $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES LOCAL_DROIDDOC_OPTIONS:=\ $(framework_docs_LOCAL_DROIDDOC_OPTIONS) \ + -referenceonly \ -showAnnotation android.annotation.SystemApi \ -api $(INTERNAL_PLATFORM_SYSTEM_API_FILE) \ -removedApi $(INTERNAL_PLATFORM_SYSTEM_REMOVED_API_FILE) \ @@ -997,6 +1001,7 @@ LOCAL_DROIDDOC_STUB_OUT_DIR := $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES LOCAL_DROIDDOC_OPTIONS:=\ $(framework_docs_LOCAL_DROIDDOC_OPTIONS) \ + -referenceonly \ -stubs $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android_test_stubs_current_intermediates/src \ -showAnnotation android.annotation.TestApi \ -api $(INTERNAL_PLATFORM_TEST_API_FILE) \ @@ -1030,6 +1035,7 @@ LOCAL_MODULE := doc-comment-check LOCAL_DROIDDOC_OPTIONS:=\ $(framework_docs_LOCAL_DROIDDOC_OPTIONS) \ + -referenceonly \ -parsecomments LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk @@ -1068,7 +1074,7 @@ LOCAL_DROIDDOC_OPTIONS:=\ -sdkvalues $(OUT_DOCS) \ -hdf android.whichdoc offline -LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk-dev +LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk include $(BUILD_DROIDDOC) @@ -1105,7 +1111,7 @@ LOCAL_DROIDDOC_OPTIONS:=\ -hdf android.whichdoc offline \ -referenceonly -LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk-dev +LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk include $(BUILD_DROIDDOC) @@ -1115,7 +1121,14 @@ $(static_doc_index_redirect): \ $(hide) mkdir -p $(dir $@) $(hide) $(ACP) $< $@ +static_doc_properties := $(out_dir)/source.properties +$(static_doc_properties): \ + $(LOCAL_PATH)/docs/source.properties | $(ACP) + $(hide) mkdir -p $(dir $@) + $(hide) $(ACP) $< $@ + $(full_target): $(static_doc_index_redirect) +$(full_target): $(static_doc_properties) $(full_target): $(framework_built) @@ -1143,7 +1156,7 @@ LOCAL_DROIDDOC_OPTIONS:= \ -hdf android.hasSamples true \ -samplesdir $(samples_dir) -LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk-dev +LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk include $(BUILD_DROIDDOC) @@ -1167,6 +1180,7 @@ LOCAL_MODULE := online-system-api-sdk LOCAL_DROIDDOC_OPTIONS:= \ $(framework_docs_LOCAL_DROIDDOC_OPTIONS) \ + -referenceonly \ -showAnnotation android.annotation.SystemApi \ -title "Android SDK - Including system APIs." \ -toroot / \ @@ -1210,7 +1224,7 @@ LOCAL_DROIDDOC_OPTIONS:= \ -hdf android.hasSamples true \ -samplesdir $(samples_dir) -LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk-dev +LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk include $(BUILD_DROIDDOC) @@ -1238,7 +1252,32 @@ LOCAL_DROIDDOC_OPTIONS:= \ -devsite \ -ignoreJdLinks -LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk-dev +LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk + +include $(BUILD_DROIDDOC) + +# ==== generates full navtree for resolving @links in ds postprocessing ==== +include $(CLEAR_VARS) + +LOCAL_SRC_FILES:=$(framework_docs_LOCAL_SRC_FILES) +LOCAL_INTERMEDIATE_SOURCES:=$(framework_docs_LOCAL_INTERMEDIATE_SOURCES) +LOCAL_STATIC_JAVA_LIBRARIES:=$(framework_docs_LOCAL_STATIC_JAVA_LIBRARIES) +LOCAL_JAVA_LIBRARIES:=$(framework_docs_LOCAL_JAVA_LIBRARIES) +LOCAL_MODULE_CLASS:=$(framework_docs_LOCAL_MODULE_CLASS) +LOCAL_DROIDDOC_SOURCE_PATH:=$(framework_docs_LOCAL_DROIDDOC_SOURCE_PATH) +LOCAL_ADDITIONAL_JAVA_DIR:=$(framework_docs_LOCAL_ADDITIONAL_JAVA_DIR) +LOCAL_ADDITIONAL_DEPENDENCIES:=$(framework_docs_LOCAL_ADDITIONAL_DEPENDENCIES) + +LOCAL_MODULE := ds-ref-navtree + +LOCAL_DROIDDOC_OPTIONS:= \ + $(framework_docs_LOCAL_DROIDDOC_OPTIONS) \ + -hdf android.whichdoc online \ + -toroot / \ + -atLinksNavtree \ + -navtreeonly + +LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk include $(BUILD_DROIDDOC) @@ -1263,11 +1302,10 @@ LOCAL_DROIDDOC_OPTIONS:= \ -toroot / \ -hdf android.whichdoc online \ $(sample_groups) \ - -useUpdatedTemplates \ -hdf android.hasSamples true \ -samplesdir $(samples_dir) -LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk-dev +LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk include $(BUILD_DROIDDOC) @@ -1286,6 +1324,7 @@ LOCAL_ADDITIONAL_DEPENDENCIES:=$(framework_docs_LOCAL_ADDITIONAL_DEPENDENCIES) LOCAL_MODULE := hidden LOCAL_DROIDDOC_OPTIONS:=\ $(framework_docs_LOCAL_DROIDDOC_OPTIONS) \ + -referenceonly \ -title "Android SDK - Including hidden APIs." # -hidden diff --git a/api/current.txt b/api/current.txt index 533b577034db0921003828891337b704c6a15581..8655d8995808bb695c8eb35721975beafe12a374 100644 --- a/api/current.txt +++ b/api/current.txt @@ -2906,11 +2906,11 @@ package android.accounts { field public static final java.lang.String LOGIN_ACCOUNTS_CHANGED_ACTION = "android.accounts.LOGIN_ACCOUNTS_CHANGED"; } - public abstract interface AccountManagerCallback { + public abstract interface AccountManagerCallback { method public abstract void run(android.accounts.AccountManagerFuture); } - public abstract interface AccountManagerFuture { + public abstract interface AccountManagerFuture { method public abstract boolean cancel(boolean); method public abstract V getResult() throws android.accounts.AuthenticatorException, java.io.IOException, android.accounts.OperationCanceledException; method public abstract V getResult(long, java.util.concurrent.TimeUnit) throws android.accounts.AuthenticatorException, java.io.IOException, android.accounts.OperationCanceledException; @@ -3056,7 +3056,7 @@ package android.animation { method public java.lang.Object evaluate(float, java.lang.Object, java.lang.Object); } - public abstract class BidirectionalTypeConverter extends android.animation.TypeConverter { + public abstract class BidirectionalTypeConverter extends android.animation.TypeConverter { ctor public BidirectionalTypeConverter(java.lang.Class, java.lang.Class); method public abstract T convertBack(V); method public android.animation.BidirectionalTypeConverter invert(); @@ -3148,26 +3148,26 @@ package android.animation { method public java.lang.String getPropertyName(); method public java.lang.Object getTarget(); method public static android.animation.ObjectAnimator ofArgb(java.lang.Object, java.lang.String, int...); - method public static android.animation.ObjectAnimator ofArgb(T, android.util.Property, int...); + method public static android.animation.ObjectAnimator ofArgb(T, android.util.Property, int...); method public static android.animation.ObjectAnimator ofFloat(java.lang.Object, java.lang.String, float...); method public static android.animation.ObjectAnimator ofFloat(java.lang.Object, java.lang.String, java.lang.String, android.graphics.Path); - method public static android.animation.ObjectAnimator ofFloat(T, android.util.Property, float...); - method public static android.animation.ObjectAnimator ofFloat(T, android.util.Property, android.util.Property, android.graphics.Path); + method public static android.animation.ObjectAnimator ofFloat(T, android.util.Property, float...); + method public static android.animation.ObjectAnimator ofFloat(T, android.util.Property, android.util.Property, android.graphics.Path); method public static android.animation.ObjectAnimator ofInt(java.lang.Object, java.lang.String, int...); method public static android.animation.ObjectAnimator ofInt(java.lang.Object, java.lang.String, java.lang.String, android.graphics.Path); - method public static android.animation.ObjectAnimator ofInt(T, android.util.Property, int...); - method public static android.animation.ObjectAnimator ofInt(T, android.util.Property, android.util.Property, android.graphics.Path); + method public static android.animation.ObjectAnimator ofInt(T, android.util.Property, int...); + method public static android.animation.ObjectAnimator ofInt(T, android.util.Property, android.util.Property, android.graphics.Path); method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, float[][]); method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, android.graphics.Path); - method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, T...); + method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, T...); method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, int[][]); method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, android.graphics.Path); - method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, T...); + method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, T...); method public static android.animation.ObjectAnimator ofObject(java.lang.Object, java.lang.String, android.animation.TypeEvaluator, java.lang.Object...); method public static android.animation.ObjectAnimator ofObject(java.lang.Object, java.lang.String, android.animation.TypeConverter, android.graphics.Path); - method public static android.animation.ObjectAnimator ofObject(T, android.util.Property, android.animation.TypeEvaluator, V...); - method public static android.animation.ObjectAnimator ofObject(T, android.util.Property, android.animation.TypeConverter, android.animation.TypeEvaluator, V...); - method public static android.animation.ObjectAnimator ofObject(T, android.util.Property, android.animation.TypeConverter, android.graphics.Path); + method public static android.animation.ObjectAnimator ofObject(T, android.util.Property, android.animation.TypeEvaluator, V...); + method public static android.animation.ObjectAnimator ofObject(T, android.util.Property, android.animation.TypeConverter, android.animation.TypeEvaluator, V...); + method public static android.animation.ObjectAnimator ofObject(T, android.util.Property, android.animation.TypeConverter, android.graphics.Path); method public static android.animation.ObjectAnimator ofPropertyValuesHolder(java.lang.Object, android.animation.PropertyValuesHolder...); method public void setAutoCancel(boolean); method public void setProperty(android.util.Property); @@ -3191,17 +3191,17 @@ package android.animation { method public static android.animation.PropertyValuesHolder ofKeyframe(android.util.Property, android.animation.Keyframe...); method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, float[][]); method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.graphics.Path); - method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, V...); - method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, android.animation.Keyframe...); + method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, V...); + method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, android.animation.Keyframe...); method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, int[][]); method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.graphics.Path); - method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, V...); - method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, android.animation.Keyframe...); + method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, V...); + method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, android.animation.Keyframe...); method public static android.animation.PropertyValuesHolder ofObject(java.lang.String, android.animation.TypeEvaluator, java.lang.Object...); method public static android.animation.PropertyValuesHolder ofObject(java.lang.String, android.animation.TypeConverter, android.graphics.Path); - method public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeEvaluator, V...); - method public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeConverter, android.animation.TypeEvaluator, T...); - method public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeConverter, android.graphics.Path); + method public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeEvaluator, V...); + method public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeConverter, android.animation.TypeEvaluator, T...); + method public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeConverter, android.graphics.Path); method public void setConverter(android.animation.TypeConverter); method public void setEvaluator(android.animation.TypeEvaluator); method public void setFloatValues(float...); @@ -3238,12 +3238,12 @@ package android.animation { method public abstract float getInterpolation(float); } - public abstract class TypeConverter { + public abstract class TypeConverter { ctor public TypeConverter(java.lang.Class, java.lang.Class); method public abstract V convert(T); } - public abstract interface TypeEvaluator { + public abstract interface TypeEvaluator { method public abstract T evaluate(float, T, T); } @@ -4571,7 +4571,7 @@ package android.app { method public android.os.Parcelable saveAllState(); } - public abstract class FragmentHostCallback extends android.app.FragmentContainer { + public abstract class FragmentHostCallback extends android.app.FragmentContainer { ctor public FragmentHostCallback(android.content.Context, android.os.Handler, int); method public void onAttachFragment(android.app.Fragment); method public void onDump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]); @@ -4838,12 +4838,12 @@ package android.app { method public abstract void destroyLoader(int); method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]); method public static void enableDebugLogging(boolean); - method public abstract android.content.Loader getLoader(int); - method public abstract android.content.Loader initLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks); - method public abstract android.content.Loader restartLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks); + method public abstract android.content.Loader getLoader(int); + method public abstract android.content.Loader initLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks); + method public abstract android.content.Loader restartLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks); } - public static abstract interface LoaderManager.LoaderCallbacks { + public static abstract interface LoaderManager.LoaderCallbacks { method public abstract android.content.Loader onCreateLoader(int, android.os.Bundle); method public abstract void onLoadFinished(android.content.Loader, D); method public abstract void onLoaderReset(android.content.Loader); @@ -7629,7 +7629,7 @@ package android.content { ctor public AsyncQueryHandler.WorkerHandler(android.os.Looper); } - public abstract class AsyncTaskLoader extends android.content.Loader { + public abstract class AsyncTaskLoader extends android.content.Loader { ctor public AsyncTaskLoader(android.content.Context); method public void cancelLoadInBackground(); method public boolean isLoadInBackgroundCanceled(); @@ -7811,7 +7811,7 @@ package android.content { method public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException; method public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException; method protected final android.os.ParcelFileDescriptor openFileHelper(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException; - method public android.os.ParcelFileDescriptor openPipeHelper(android.net.Uri, java.lang.String, android.os.Bundle, T, android.content.ContentProvider.PipeDataWriter) throws java.io.FileNotFoundException; + method public android.os.ParcelFileDescriptor openPipeHelper(android.net.Uri, java.lang.String, android.os.Bundle, T, android.content.ContentProvider.PipeDataWriter) throws java.io.FileNotFoundException; method public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle) throws java.io.FileNotFoundException; method public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal) throws java.io.FileNotFoundException; method public abstract android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String); @@ -7824,7 +7824,7 @@ package android.content { method public abstract int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]); } - public static abstract interface ContentProvider.PipeDataWriter { + public static abstract interface ContentProvider.PipeDataWriter { method public abstract void writeDataToPipe(android.os.ParcelFileDescriptor, android.net.Uri, java.lang.String, android.os.Bundle, T); } @@ -8095,7 +8095,7 @@ package android.content { method public final java.lang.String getString(int); method public final java.lang.String getString(int, java.lang.Object...); method public abstract java.lang.Object getSystemService(java.lang.String); - method public final T getSystemService(java.lang.Class); + method public final T getSystemService(java.lang.Class); method public abstract java.lang.String getSystemServiceName(java.lang.Class); method public final java.lang.CharSequence getText(int); method public abstract android.content.res.Resources.Theme getTheme(); @@ -8450,8 +8450,8 @@ package android.content { method public long getLongExtra(java.lang.String, long); method public java.lang.String getPackage(); method public android.os.Parcelable[] getParcelableArrayExtra(java.lang.String); - method public java.util.ArrayList getParcelableArrayListExtra(java.lang.String); - method public T getParcelableExtra(java.lang.String); + method public java.util.ArrayList getParcelableArrayListExtra(java.lang.String); + method public T getParcelableExtra(java.lang.String); method public java.lang.String getScheme(); method public android.content.Intent getSelector(); method public java.io.Serializable getSerializableExtra(java.lang.String); @@ -8926,7 +8926,7 @@ package android.content { ctor public IntentSender.SendIntentException(java.lang.Exception); } - public class Loader { + public class Loader { ctor public Loader(android.content.Context); method public void abandon(); method public boolean cancelLoad(); @@ -8963,11 +8963,11 @@ package android.content { ctor public Loader.ForceLoadContentObserver(); } - public static abstract interface Loader.OnLoadCanceledListener { + public static abstract interface Loader.OnLoadCanceledListener { method public abstract void onLoadCanceled(android.content.Loader); } - public static abstract interface Loader.OnLoadCompleteListener { + public static abstract interface Loader.OnLoadCompleteListener { method public abstract void onLoadComplete(android.content.Loader, D); } @@ -10839,7 +10839,7 @@ package android.database { method public boolean isNull(int); } - public abstract class Observable { + public abstract class Observable { ctor public Observable(); method public void registerObserver(T); method public void unregisterAll(); @@ -12729,7 +12729,7 @@ package android.graphics.drawable { public class AnimatedStateListDrawable extends android.graphics.drawable.StateListDrawable { ctor public AnimatedStateListDrawable(); method public void addState(int[], android.graphics.drawable.Drawable, int); - method public void addTransition(int, int, T, boolean); + method public void addTransition(int, int, T, boolean); } public class AnimatedVectorDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Animatable2 { @@ -13853,7 +13853,7 @@ package android.hardware.camera2 { } public final class CameraCharacteristics extends android.hardware.camera2.CameraMetadata { - method public T get(android.hardware.camera2.CameraCharacteristics.Key); + method public T get(android.hardware.camera2.CameraCharacteristics.Key); method public java.util.List> getAvailableCaptureRequestKeys(); method public java.util.List> getAvailableCaptureResultKeys(); field public static final android.hardware.camera2.CameraCharacteristics.Key COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES; @@ -13938,7 +13938,7 @@ package android.hardware.camera2 { field public static final android.hardware.camera2.CameraCharacteristics.Key TONEMAP_MAX_CURVE_POINTS; } - public static final class CameraCharacteristics.Key { + public static final class CameraCharacteristics.Key { method public final boolean equals(java.lang.Object); method public java.lang.String getName(); method public final int hashCode(); @@ -14003,7 +14003,7 @@ package android.hardware.camera2 { method public void onTorchModeUnavailable(java.lang.String); } - public abstract class CameraMetadata { + public abstract class CameraMetadata { method public java.util.List getKeys(); field public static final int COLOR_CORRECTION_ABERRATION_MODE_FAST = 1; // 0x1 field public static final int COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY = 2; // 0x2 @@ -14211,7 +14211,7 @@ package android.hardware.camera2 { public final class CaptureRequest extends android.hardware.camera2.CameraMetadata implements android.os.Parcelable { method public int describeContents(); - method public T get(android.hardware.camera2.CaptureRequest.Key); + method public T get(android.hardware.camera2.CaptureRequest.Key); method public java.lang.Object getTag(); method public boolean isReprocess(); method public void writeToParcel(android.os.Parcel, int); @@ -14274,20 +14274,20 @@ package android.hardware.camera2 { public static final class CaptureRequest.Builder { method public void addTarget(android.view.Surface); method public android.hardware.camera2.CaptureRequest build(); - method public T get(android.hardware.camera2.CaptureRequest.Key); + method public T get(android.hardware.camera2.CaptureRequest.Key); method public void removeTarget(android.view.Surface); - method public void set(android.hardware.camera2.CaptureRequest.Key, T); + method public void set(android.hardware.camera2.CaptureRequest.Key, T); method public void setTag(java.lang.Object); } - public static final class CaptureRequest.Key { + public static final class CaptureRequest.Key { method public final boolean equals(java.lang.Object); method public java.lang.String getName(); method public final int hashCode(); } public class CaptureResult extends android.hardware.camera2.CameraMetadata { - method public T get(android.hardware.camera2.CaptureResult.Key); + method public T get(android.hardware.camera2.CaptureResult.Key); method public long getFrameNumber(); method public android.hardware.camera2.CaptureRequest getRequest(); method public int getSequenceId(); @@ -14368,7 +14368,7 @@ package android.hardware.camera2 { field public static final android.hardware.camera2.CaptureResult.Key TONEMAP_PRESET_CURVE; } - public static final class CaptureResult.Key { + public static final class CaptureResult.Key { method public final boolean equals(java.lang.Object); method public java.lang.String getName(); method public final int hashCode(); @@ -14493,14 +14493,14 @@ package android.hardware.camera2.params { method public android.util.Size[] getInputSizes(int); method public final int[] getOutputFormats(); method public long getOutputMinFrameDuration(int, android.util.Size); - method public long getOutputMinFrameDuration(java.lang.Class, android.util.Size); - method public android.util.Size[] getOutputSizes(java.lang.Class); + method public long getOutputMinFrameDuration(java.lang.Class, android.util.Size); + method public android.util.Size[] getOutputSizes(java.lang.Class); method public android.util.Size[] getOutputSizes(int); method public long getOutputStallDuration(int, android.util.Size); - method public long getOutputStallDuration(java.lang.Class, android.util.Size); + method public long getOutputStallDuration(java.lang.Class, android.util.Size); method public final int[] getValidOutputFormatsForInput(int); method public boolean isOutputSupportedFor(int); - method public static boolean isOutputSupportedFor(java.lang.Class); + method public static boolean isOutputSupportedFor(java.lang.Class); method public boolean isOutputSupportedFor(android.view.Surface); } @@ -16201,7 +16201,7 @@ package android.icu.math { package android.icu.text { - public final class AlphabeticIndex implements java.lang.Iterable { + public final class AlphabeticIndex implements java.lang.Iterable { ctor public AlphabeticIndex(android.icu.util.ULocale); ctor public AlphabeticIndex(java.util.Locale); ctor public AlphabeticIndex(android.icu.text.RuleBasedCollator); @@ -16227,7 +16227,7 @@ package android.icu.text { method public android.icu.text.AlphabeticIndex setUnderflowLabel(java.lang.String); } - public static class AlphabeticIndex.Bucket implements java.lang.Iterable { + public static class AlphabeticIndex.Bucket implements java.lang.Iterable { method public java.lang.String getLabel(); method public android.icu.text.AlphabeticIndex.Bucket.LabelType getLabelType(); method public java.util.Iterator> iterator(); @@ -16243,14 +16243,14 @@ package android.icu.text { enum_constant public static final android.icu.text.AlphabeticIndex.Bucket.LabelType UNDERFLOW; } - public static final class AlphabeticIndex.ImmutableIndex implements java.lang.Iterable { + public static final class AlphabeticIndex.ImmutableIndex implements java.lang.Iterable { method public android.icu.text.AlphabeticIndex.Bucket getBucket(int); method public int getBucketCount(); method public int getBucketIndex(java.lang.CharSequence); method public java.util.Iterator> iterator(); } - public static class AlphabeticIndex.Record { + public static class AlphabeticIndex.Record { method public V getData(); method public java.lang.CharSequence getName(); } @@ -17763,8 +17763,8 @@ package android.icu.text { method public final android.icu.text.UnicodeSet addAll(java.lang.CharSequence); method public android.icu.text.UnicodeSet addAll(android.icu.text.UnicodeSet); method public android.icu.text.UnicodeSet addAll(java.lang.Iterable); - method public android.icu.text.UnicodeSet addAll(T...); - method public T addAllTo(T); + method public android.icu.text.UnicodeSet addAll(T...); + method public > T addAllTo(T); method public void addMatchSetTo(android.icu.text.UnicodeSet); method public android.icu.text.UnicodeSet applyIntPropertyValue(int, int); method public final android.icu.text.UnicodeSet applyPattern(java.lang.String); @@ -17792,15 +17792,15 @@ package android.icu.text { method public final boolean contains(java.lang.CharSequence); method public boolean containsAll(android.icu.text.UnicodeSet); method public boolean containsAll(java.lang.String); - method public boolean containsAll(java.lang.Iterable); + method public boolean containsAll(java.lang.Iterable); method public boolean containsNone(int, int); method public boolean containsNone(android.icu.text.UnicodeSet); method public boolean containsNone(java.lang.CharSequence); - method public boolean containsNone(java.lang.Iterable); + method public boolean containsNone(java.lang.Iterable); method public final boolean containsSome(int, int); method public final boolean containsSome(android.icu.text.UnicodeSet); method public final boolean containsSome(java.lang.CharSequence); - method public final boolean containsSome(java.lang.Iterable); + method public final boolean containsSome(java.lang.Iterable); method public android.icu.text.UnicodeSet freeze(); method public static android.icu.text.UnicodeSet from(java.lang.CharSequence); method public static android.icu.text.UnicodeSet fromAll(java.lang.CharSequence); @@ -17818,14 +17818,14 @@ package android.icu.text { method public final android.icu.text.UnicodeSet remove(java.lang.CharSequence); method public final android.icu.text.UnicodeSet removeAll(java.lang.CharSequence); method public android.icu.text.UnicodeSet removeAll(android.icu.text.UnicodeSet); - method public android.icu.text.UnicodeSet removeAll(java.lang.Iterable); + method public android.icu.text.UnicodeSet removeAll(java.lang.Iterable); method public final android.icu.text.UnicodeSet removeAllStrings(); method public android.icu.text.UnicodeSet retain(int, int); method public final android.icu.text.UnicodeSet retain(int); method public final android.icu.text.UnicodeSet retain(java.lang.CharSequence); method public final android.icu.text.UnicodeSet retainAll(java.lang.CharSequence); method public android.icu.text.UnicodeSet retainAll(android.icu.text.UnicodeSet); - method public android.icu.text.UnicodeSet retainAll(java.lang.Iterable); + method public android.icu.text.UnicodeSet retainAll(java.lang.Iterable); method public android.icu.text.UnicodeSet set(int, int); method public android.icu.text.UnicodeSet set(android.icu.text.UnicodeSet); method public int size(); @@ -18235,7 +18235,7 @@ package android.icu.util { method public long getToDate(); } - public abstract interface Freezable implements java.lang.Cloneable { + public abstract interface Freezable implements java.lang.Cloneable { method public abstract T cloneAsThawed(); method public abstract T freeze(); method public abstract boolean isFrozen(); @@ -18517,7 +18517,7 @@ package android.icu.util { field public static final android.icu.util.TimeUnit YEAR; } - public class Output { + public class Output { ctor public Output(); ctor public Output(T); field public T value; @@ -28169,7 +28169,7 @@ package android.opengl { package android.os { - public abstract class AsyncTask { + public abstract class AsyncTask { ctor public AsyncTask(); method public final boolean cancel(boolean); method protected abstract Result doInBackground(Params...); @@ -28396,16 +28396,16 @@ package android.os { method public float getFloat(java.lang.String, float); method public float[] getFloatArray(java.lang.String); method public java.util.ArrayList getIntegerArrayList(java.lang.String); - method public T getParcelable(java.lang.String); + method public T getParcelable(java.lang.String); method public android.os.Parcelable[] getParcelableArray(java.lang.String); - method public java.util.ArrayList getParcelableArrayList(java.lang.String); + method public java.util.ArrayList getParcelableArrayList(java.lang.String); method public java.io.Serializable getSerializable(java.lang.String); method public short getShort(java.lang.String); method public short getShort(java.lang.String, short); method public short[] getShortArray(java.lang.String); method public android.util.Size getSize(java.lang.String); method public android.util.SizeF getSizeF(java.lang.String); - method public android.util.SparseArray getSparseParcelableArray(java.lang.String); + method public android.util.SparseArray getSparseParcelableArray(java.lang.String); method public java.util.ArrayList getStringArrayList(java.lang.String); method public boolean hasFileDescriptors(); method public void putAll(android.os.Bundle); @@ -28910,8 +28910,8 @@ package android.os { method public final long[] createLongArray(); method public final java.lang.String[] createStringArray(); method public final java.util.ArrayList createStringArrayList(); - method public final T[] createTypedArray(android.os.Parcelable.Creator); - method public final java.util.ArrayList createTypedArrayList(android.os.Parcelable.Creator); + method public final T[] createTypedArray(android.os.Parcelable.Creator); + method public final java.util.ArrayList createTypedArrayList(android.os.Parcelable.Creator); method public final int dataAvail(); method public final int dataCapacity(); method public final int dataPosition(); @@ -28944,7 +28944,7 @@ package android.os { method public final long readLong(); method public final void readLongArray(long[]); method public final void readMap(java.util.Map, java.lang.ClassLoader); - method public final T readParcelable(java.lang.ClassLoader); + method public final T readParcelable(java.lang.ClassLoader); method public final android.os.Parcelable[] readParcelableArray(java.lang.ClassLoader); method public final android.os.PersistableBundle readPersistableBundle(); method public final android.os.PersistableBundle readPersistableBundle(java.lang.ClassLoader); @@ -28957,9 +28957,9 @@ package android.os { method public final void readStringArray(java.lang.String[]); method public final void readStringList(java.util.List); method public final android.os.IBinder readStrongBinder(); - method public final void readTypedArray(T[], android.os.Parcelable.Creator); - method public final void readTypedList(java.util.List, android.os.Parcelable.Creator); - method public final T readTypedObject(android.os.Parcelable.Creator); + method public final void readTypedArray(T[], android.os.Parcelable.Creator); + method public final void readTypedList(java.util.List, android.os.Parcelable.Creator); + method public final T readTypedObject(android.os.Parcelable.Creator); method public final java.lang.Object readValue(java.lang.ClassLoader); method public final void recycle(); method public final void setDataCapacity(int); @@ -28990,7 +28990,7 @@ package android.os { method public final void writeMap(java.util.Map); method public final void writeNoException(); method public final void writeParcelable(android.os.Parcelable, int); - method public final void writeParcelableArray(T[], int); + method public final void writeParcelableArray(T[], int); method public final void writePersistableBundle(android.os.PersistableBundle); method public final void writeSerializable(java.io.Serializable); method public final void writeSize(android.util.Size); @@ -29002,9 +29002,9 @@ package android.os { method public final void writeStringList(java.util.List); method public final void writeStrongBinder(android.os.IBinder); method public final void writeStrongInterface(android.os.IInterface); - method public final void writeTypedArray(T[], int); - method public final void writeTypedList(java.util.List); - method public final void writeTypedObject(T, int); + method public final void writeTypedArray(T[], int); + method public final void writeTypedList(java.util.List); + method public final void writeTypedObject(T, int); method public final void writeValue(java.lang.Object); field public static final android.os.Parcelable.Creator STRING_CREATOR; } @@ -29082,11 +29082,11 @@ package android.os { field public static final int PARCELABLE_WRITE_RETURN_VALUE = 1; // 0x1 } - public static abstract interface Parcelable.ClassLoaderCreator implements android.os.Parcelable.Creator { + public static abstract interface Parcelable.ClassLoaderCreator implements android.os.Parcelable.Creator { method public abstract T createFromParcel(android.os.Parcel, java.lang.ClassLoader); } - public static abstract interface Parcelable.Creator { + public static abstract interface Parcelable.Creator { method public abstract T createFromParcel(android.os.Parcel); method public abstract T[] newArray(int); } @@ -29200,7 +29200,7 @@ package android.os { method public abstract void onProgress(int); } - public class RemoteCallbackList { + public class RemoteCallbackList { ctor public RemoteCallbackList(); method public int beginBroadcast(); method public void finishBroadcast(); @@ -32482,7 +32482,7 @@ package android.provider { field public static final java.lang.String RADIO_CELL = "cell"; field public static final java.lang.String RADIO_NFC = "nfc"; field public static final java.lang.String RADIO_WIFI = "wifi"; - field public static final java.lang.String SHOW_PROCESSES = "show_processes"; + field public static final deprecated java.lang.String SHOW_PROCESSES = "show_processes"; field public static final java.lang.String STAY_ON_WHILE_PLUGGED_IN = "stay_on_while_plugged_in"; field public static final java.lang.String TRANSITION_ANIMATION_SCALE = "transition_animation_scale"; field public static final java.lang.String USB_MASS_STORAGE_ENABLED = "usb_mass_storage_enabled"; @@ -34520,7 +34520,7 @@ package android.service.carrier { field public static final java.lang.String SERVICE_INTERFACE = "android.service.carrier.CarrierMessagingService"; } - public static abstract interface CarrierMessagingService.ResultCallback { + public static abstract interface CarrierMessagingService.ResultCallback { method public abstract void onReceiveResult(T) throws android.os.RemoteException; } @@ -34671,7 +34671,7 @@ package android.service.media { field public static final java.lang.String EXTRA_SUGGESTED = "android.service.media.extra.SUGGESTED"; } - public class MediaBrowserService.Result { + public class MediaBrowserService.Result { method public void detach(); method public void sendResult(T); } @@ -37584,14 +37584,14 @@ package android.telephony.gsm { package android.test { - public abstract deprecated class ActivityInstrumentationTestCase extends android.test.ActivityTestCase { + public abstract deprecated class ActivityInstrumentationTestCase extends android.test.ActivityTestCase { ctor public ActivityInstrumentationTestCase(java.lang.String, java.lang.Class); ctor public ActivityInstrumentationTestCase(java.lang.String, java.lang.Class, boolean); method public T getActivity(); method public void testActivityTestCaseSetUpProperly() throws java.lang.Exception; } - public abstract deprecated class ActivityInstrumentationTestCase2 extends android.test.ActivityTestCase { + public abstract deprecated class ActivityInstrumentationTestCase2 extends android.test.ActivityTestCase { ctor public deprecated ActivityInstrumentationTestCase2(java.lang.String, java.lang.Class); ctor public ActivityInstrumentationTestCase2(java.lang.Class); method public T getActivity(); @@ -37606,7 +37606,7 @@ package android.test { method protected void setActivity(android.app.Activity); } - public abstract deprecated class ActivityUnitTestCase extends android.test.ActivityTestCase { + public abstract deprecated class ActivityUnitTestCase extends android.test.ActivityTestCase { ctor public ActivityUnitTestCase(java.lang.Class); method public T getActivity(); method public int getFinishedActivityRequest(); @@ -37652,7 +37652,7 @@ package android.test { method public void testStarted(java.lang.String); } - public abstract deprecated class ApplicationTestCase extends android.test.AndroidTestCase { + public abstract deprecated class ApplicationTestCase extends android.test.AndroidTestCase { ctor public ApplicationTestCase(java.lang.Class); method protected final void createApplication(); method public T getApplication(); @@ -37678,8 +37678,8 @@ package android.test { method public android.app.Instrumentation getInstrumentation(); method public deprecated void injectInsrumentation(android.app.Instrumentation); method public void injectInstrumentation(android.app.Instrumentation); - method public final T launchActivity(java.lang.String, java.lang.Class, android.os.Bundle); - method public final T launchActivityWithIntent(java.lang.String, java.lang.Class, android.content.Intent); + method public final T launchActivity(java.lang.String, java.lang.Class, android.os.Bundle); + method public final T launchActivityWithIntent(java.lang.String, java.lang.Class, android.content.Intent); method public void runTestOnUiThread(java.lang.Runnable) throws java.lang.Throwable; method public void sendKeys(java.lang.String); method public void sendKeys(int...); @@ -37719,7 +37719,7 @@ package android.test { public class LoaderTestCase extends android.test.AndroidTestCase { ctor public LoaderTestCase(); - method public T getLoaderResultSynchronously(android.content.Loader); + method public T getLoaderResultSynchronously(android.content.Loader); } public final deprecated class MoreAsserts { @@ -37774,20 +37774,20 @@ package android.test { method public abstract void startTiming(boolean); } - public abstract deprecated class ProviderTestCase extends android.test.InstrumentationTestCase { + public abstract deprecated class ProviderTestCase extends android.test.InstrumentationTestCase { ctor public ProviderTestCase(java.lang.Class, java.lang.String); method public android.test.mock.MockContentResolver getMockContentResolver(); method public android.test.IsolatedContext getMockContext(); method public T getProvider(); - method public static android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.Class, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; + method public static android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.Class, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; } - public abstract class ProviderTestCase2 extends android.test.AndroidTestCase { + public abstract class ProviderTestCase2 extends android.test.AndroidTestCase { ctor public ProviderTestCase2(java.lang.Class, java.lang.String); method public android.test.mock.MockContentResolver getMockContentResolver(); method public android.test.IsolatedContext getMockContext(); method public T getProvider(); - method public static android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.String, java.lang.Class, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; + method public static android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.String, java.lang.Class, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; } public deprecated class RenamingDelegatingContext extends android.content.ContextWrapper { @@ -37795,11 +37795,11 @@ package android.test { ctor public RenamingDelegatingContext(android.content.Context, android.content.Context, java.lang.String); method public java.lang.String getDatabasePrefix(); method public void makeExistingFilesAndDbsAccessible(); - method public static T providerWithRenamedContext(java.lang.Class, android.content.Context, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; - method public static T providerWithRenamedContext(java.lang.Class, android.content.Context, java.lang.String, boolean) throws java.lang.IllegalAccessException, java.lang.InstantiationException; + method public static T providerWithRenamedContext(java.lang.Class, android.content.Context, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; + method public static T providerWithRenamedContext(java.lang.Class, android.content.Context, java.lang.String, boolean) throws java.lang.IllegalAccessException, java.lang.InstantiationException; } - public abstract deprecated class ServiceTestCase extends android.test.AndroidTestCase { + public abstract deprecated class ServiceTestCase extends android.test.AndroidTestCase { ctor public ServiceTestCase(java.lang.Class); method protected android.os.IBinder bindService(android.content.Intent); method public android.app.Application getApplication(); @@ -37812,7 +37812,7 @@ package android.test { method public void testServiceTestCaseSetUpProperly() throws java.lang.Exception; } - public abstract deprecated class SingleLaunchActivityTestCase extends android.test.InstrumentationTestCase { + public abstract deprecated class SingleLaunchActivityTestCase extends android.test.InstrumentationTestCase { ctor public SingleLaunchActivityTestCase(java.lang.String, java.lang.Class); method public T getActivity(); method public void testActivityTestCaseSetUpProperly() throws java.lang.Exception; @@ -38167,7 +38167,7 @@ package android.test.suitebuilder { ctor public TestMethod(java.lang.String, java.lang.Class); ctor public TestMethod(junit.framework.TestCase); method public junit.framework.TestCase createTest() throws java.lang.IllegalAccessException, java.lang.InstantiationException, java.lang.reflect.InvocationTargetException; - method public T getAnnotation(java.lang.Class); + method public T getAnnotation(java.lang.Class); method public java.lang.Class getEnclosingClass(); method public java.lang.String getEnclosingClassname(); method public java.lang.String getName(); @@ -38610,7 +38610,7 @@ package android.text { method public int getSpanEnd(java.lang.Object); method public int getSpanFlags(java.lang.Object); method public int getSpanStart(java.lang.Object); - method public T[] getSpans(int, int, java.lang.Class); + method public T[] getSpans(int, int, java.lang.Class); method public deprecated int getTextRunCursor(int, int, int, int, int, android.graphics.Paint); method public int getTextWatcherDepth(); method public android.text.SpannableStringBuilder insert(int, java.lang.CharSequence, int, int); @@ -38632,7 +38632,7 @@ package android.text { method public int getSpanEnd(java.lang.Object); method public int getSpanFlags(java.lang.Object); method public int getSpanStart(java.lang.Object); - method public T[] getSpans(int, int, java.lang.Class); + method public T[] getSpans(int, int, java.lang.Class); method public final int length(); method public int nextSpanTransition(int, int, java.lang.Class); method public final java.lang.String toString(); @@ -38642,7 +38642,7 @@ package android.text { method public abstract int getSpanEnd(java.lang.Object); method public abstract int getSpanFlags(java.lang.Object); method public abstract int getSpanStart(java.lang.Object); - method public abstract T[] getSpans(int, int, java.lang.Class); + method public abstract T[] getSpans(int, int, java.lang.Class); method public abstract int nextSpanTransition(int, int, java.lang.Class); field public static final int SPAN_COMPOSING = 256; // 0x100 field public static final int SPAN_EXCLUSIVE_EXCLUSIVE = 33; // 0x21 @@ -39619,7 +39619,7 @@ package android.text.style { field public static final int WEEKDAY_WEDNESDAY = 4; // 0x4 } - public static class TtsSpan.Builder { + public static class TtsSpan.Builder> { ctor public TtsSpan.Builder(java.lang.String); method public android.text.style.TtsSpan build(); method public C setIntArgument(java.lang.String, int); @@ -39715,7 +39715,7 @@ package android.text.style { method public android.text.style.TtsSpan.OrdinalBuilder setNumber(java.lang.String); } - public static class TtsSpan.SemioticClassBuilder extends android.text.style.TtsSpan.Builder { + public static class TtsSpan.SemioticClassBuilder> extends android.text.style.TtsSpan.Builder { ctor public TtsSpan.SemioticClassBuilder(java.lang.String); method public C setAnimacy(java.lang.String); method public C setCase(java.lang.String); @@ -40122,7 +40122,7 @@ package android.util { ctor public AndroidRuntimeException(java.lang.Exception); } - public final class ArrayMap implements java.util.Map { + public final class ArrayMap implements java.util.Map { ctor public ArrayMap(); ctor public ArrayMap(int); ctor public ArrayMap(android.util.ArrayMap); @@ -40150,7 +40150,7 @@ package android.util { method public java.util.Collection values(); } - public final class ArraySet implements java.util.Collection java.util.Set { + public final class ArraySet implements java.util.Collection java.util.Set { ctor public ArraySet(); ctor public ArraySet(int); ctor public ArraySet(android.util.ArraySet); @@ -40171,7 +40171,7 @@ package android.util { method public boolean retainAll(java.util.Collection); method public int size(); method public java.lang.Object[] toArray(); - method public T[] toArray(T[]); + method public T[] toArray(T[]); method public E valueAt(int); } @@ -40316,13 +40316,13 @@ package android.util { public deprecated class FloatMath { } - public abstract class FloatProperty extends android.util.Property { + public abstract class FloatProperty extends android.util.Property { ctor public FloatProperty(java.lang.String); method public final void set(T, java.lang.Float); method public abstract void setValue(T, float); } - public abstract class IntProperty extends android.util.Property { + public abstract class IntProperty extends android.util.Property { ctor public IntProperty(java.lang.String); method public final void set(T, java.lang.Integer); method public abstract void setValue(T, int); @@ -40422,7 +40422,7 @@ package android.util { method public void println(java.lang.String); } - public class LongSparseArray implements java.lang.Cloneable { + public class LongSparseArray implements java.lang.Cloneable { ctor public LongSparseArray(); ctor public LongSparseArray(int); method public void append(long, E); @@ -40442,7 +40442,7 @@ package android.util { method public E valueAt(int); } - public class LruCache { + public class LruCache { ctor public LruCache(int); method protected V create(K); method public final synchronized int createCount(); @@ -40530,9 +40530,9 @@ package android.util { ctor public NoSuchPropertyException(java.lang.String); } - public class Pair { + public class Pair { ctor public Pair(F, S); - method public static android.util.Pair create(A, B); + method public static android.util.Pair create(A, B); field public final F first; field public final S second; } @@ -40565,22 +40565,22 @@ package android.util { method public abstract void println(java.lang.String); } - public abstract class Property { + public abstract class Property { ctor public Property(java.lang.Class, java.lang.String); method public abstract V get(T); method public java.lang.String getName(); method public java.lang.Class getType(); method public boolean isReadOnly(); - method public static android.util.Property of(java.lang.Class, java.lang.Class, java.lang.String); + method public static android.util.Property of(java.lang.Class, java.lang.Class, java.lang.String); method public void set(T, V); } - public final class Range { + public final class Range> { ctor public Range(T, T); method public T clamp(T); method public boolean contains(T); method public boolean contains(android.util.Range); - method public static android.util.Range create(T, T); + method public static > android.util.Range create(T, T); method public android.util.Range extend(android.util.Range); method public android.util.Range extend(T, T); method public android.util.Range extend(T); @@ -40624,7 +40624,7 @@ package android.util { method public static android.util.SizeF parseSizeF(java.lang.String) throws java.lang.NumberFormatException; } - public class SparseArray implements java.lang.Cloneable { + public class SparseArray implements java.lang.Cloneable { ctor public SparseArray(); ctor public SparseArray(int); method public void append(int, E); @@ -45353,7 +45353,7 @@ package android.webkit { method public static java.lang.String stripAnchor(java.lang.String); } - public abstract interface ValueCallback { + public abstract interface ValueCallback { method public abstract void onReceiveValue(T); } @@ -46087,7 +46087,7 @@ package android.widget { field public static final int NO_SELECTION = -2147483648; // 0x80000000 } - public abstract class AdapterView extends android.view.ViewGroup { + public abstract class AdapterView extends android.view.ViewGroup { ctor public AdapterView(android.content.Context); ctor public AdapterView(android.content.Context, android.util.AttributeSet); ctor public AdapterView(android.content.Context, android.util.AttributeSet, int); @@ -46210,7 +46210,7 @@ package android.widget { ctor public AnalogClock(android.content.Context, android.util.AttributeSet, int, int); } - public class ArrayAdapter extends android.widget.BaseAdapter implements android.widget.Filterable android.widget.ThemedSpinnerAdapter { + public class ArrayAdapter extends android.widget.BaseAdapter implements android.widget.Filterable android.widget.ThemedSpinnerAdapter { ctor public ArrayAdapter(android.content.Context, int); ctor public ArrayAdapter(android.content.Context, int, int); ctor public ArrayAdapter(android.content.Context, int, T[]); @@ -46271,7 +46271,7 @@ package android.widget { method protected void performFiltering(java.lang.CharSequence, int); method public void performValidation(); method protected void replaceText(java.lang.CharSequence); - method public void setAdapter(T); + method public void setAdapter(T); method public void setCompletionHint(java.lang.CharSequence); method public void setDropDownAnchor(int); method public void setDropDownBackgroundDrawable(android.graphics.drawable.Drawable); @@ -48556,7 +48556,7 @@ package android.widget { package com.android.internal.util { - public abstract interface Predicate { + public abstract interface Predicate { method public abstract boolean apply(T); } @@ -50603,13 +50603,13 @@ package java.lang { enum_constant public static final java.lang.Character.UnicodeScript YI; } - public final class Class implements java.lang.reflect.AnnotatedElement java.lang.reflect.GenericDeclaration java.io.Serializable java.lang.reflect.Type { - method public java.lang.Class asSubclass(java.lang.Class); + public final class Class implements java.lang.reflect.AnnotatedElement java.lang.reflect.GenericDeclaration java.io.Serializable java.lang.reflect.Type { + method public java.lang.Class asSubclass(java.lang.Class); method public T cast(java.lang.Object); method public boolean desiredAssertionStatus(); method public static java.lang.Class forName(java.lang.String) throws java.lang.ClassNotFoundException; method public static java.lang.Class forName(java.lang.String, boolean, java.lang.ClassLoader) throws java.lang.ClassNotFoundException; - method public A getAnnotation(java.lang.Class); + method public A getAnnotation(java.lang.Class); method public java.lang.annotation.Annotation[] getAnnotations(); method public java.lang.String getCanonicalName(); method public java.lang.ClassLoader getClassLoader(); @@ -50726,7 +50726,7 @@ package java.lang { public abstract interface Cloneable { } - public abstract interface Comparable { + public abstract interface Comparable { method public abstract int compareTo(T); } @@ -50780,7 +50780,7 @@ package java.lang { field public static final java.lang.Class TYPE; } - public abstract class Enum implements java.lang.Comparable java.io.Serializable { + public abstract class Enum> implements java.lang.Comparable java.io.Serializable { ctor protected Enum(java.lang.String, int); method protected final java.lang.Object clone() throws java.lang.CloneNotSupportedException; method public final int compareTo(E); @@ -50790,7 +50790,7 @@ package java.lang { method public final int hashCode(); method public final java.lang.String name(); method public final int ordinal(); - method public static T valueOf(java.lang.Class, java.lang.String); + method public static > T valueOf(java.lang.Class, java.lang.String); } public class EnumConstantNotPresentException extends java.lang.RuntimeException { @@ -50909,7 +50909,7 @@ package java.lang { ctor public IndexOutOfBoundsException(java.lang.String); } - public class InheritableThreadLocal extends java.lang.ThreadLocal { + public class InheritableThreadLocal extends java.lang.ThreadLocal { ctor public InheritableThreadLocal(); method protected T childValue(T); } @@ -50980,7 +50980,7 @@ package java.lang { ctor public InterruptedException(java.lang.String); } - public abstract interface Iterable { + public abstract interface Iterable { method public default void forEach(java.util.function.Consumer); method public abstract java.util.Iterator iterator(); method public default java.util.Spliterator spliterator(); @@ -51188,12 +51188,12 @@ package java.lang { } public class Package implements java.lang.reflect.AnnotatedElement { - method public A getAnnotation(java.lang.Class); + method public A getAnnotation(java.lang.Class); method public java.lang.annotation.Annotation[] getAnnotations(); - method public A[] getAnnotationsByType(java.lang.Class); - method public A getDeclaredAnnotation(java.lang.Class); + method public A[] getAnnotationsByType(java.lang.Class); + method public A getDeclaredAnnotation(java.lang.Class); method public java.lang.annotation.Annotation[] getDeclaredAnnotations(); - method public A[] getDeclaredAnnotationsByType(java.lang.Class); + method public A[] getDeclaredAnnotationsByType(java.lang.Class); method public java.lang.String getImplementationTitle(); method public java.lang.String getImplementationVendor(); method public java.lang.String getImplementationVersion(); @@ -51753,7 +51753,7 @@ package java.lang { method public void uncaughtException(java.lang.Thread, java.lang.Throwable); } - public class ThreadLocal { + public class ThreadLocal { ctor public ThreadLocal(); method public T get(); method protected T initialValue(); @@ -51893,30 +51893,30 @@ package java.lang.annotation { package java.lang.ref { - public class PhantomReference extends java.lang.ref.Reference { + public class PhantomReference extends java.lang.ref.Reference { ctor public PhantomReference(T, java.lang.ref.ReferenceQueue); } - public abstract class Reference { + public abstract class Reference { method public void clear(); method public boolean enqueue(); method public T get(); method public boolean isEnqueued(); } - public class ReferenceQueue { + public class ReferenceQueue { ctor public ReferenceQueue(); method public java.lang.ref.Reference poll(); method public java.lang.ref.Reference remove(long) throws java.lang.IllegalArgumentException, java.lang.InterruptedException; method public java.lang.ref.Reference remove() throws java.lang.InterruptedException; } - public class SoftReference extends java.lang.ref.Reference { + public class SoftReference extends java.lang.ref.Reference { ctor public SoftReference(T); ctor public SoftReference(T, java.lang.ref.ReferenceQueue); } - public class WeakReference extends java.lang.ref.Reference { + public class WeakReference extends java.lang.ref.Reference { ctor public WeakReference(T); ctor public WeakReference(T, java.lang.ref.ReferenceQueue); } @@ -51927,7 +51927,7 @@ package java.lang.reflect { public class AccessibleObject implements java.lang.reflect.AnnotatedElement { ctor protected AccessibleObject(); - method public T getAnnotation(java.lang.Class); + method public T getAnnotation(java.lang.Class); method public java.lang.annotation.Annotation[] getAnnotations(); method public java.lang.annotation.Annotation[] getDeclaredAnnotations(); method public boolean isAccessible(); @@ -51936,12 +51936,12 @@ package java.lang.reflect { } public abstract interface AnnotatedElement { - method public abstract T getAnnotation(java.lang.Class); + method public abstract T getAnnotation(java.lang.Class); method public abstract java.lang.annotation.Annotation[] getAnnotations(); - method public default T[] getAnnotationsByType(java.lang.Class); - method public default java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class); + method public default T[] getAnnotationsByType(java.lang.Class); + method public default java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class); method public abstract java.lang.annotation.Annotation[] getDeclaredAnnotations(); - method public default T[] getDeclaredAnnotationsByType(java.lang.Class); + method public default T[] getDeclaredAnnotationsByType(java.lang.Class); method public default boolean isAnnotationPresent(java.lang.Class); } @@ -51969,8 +51969,8 @@ package java.lang.reflect { method public static void setShort(java.lang.Object, int, short) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException; } - public final class Constructor extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member { - method public A getAnnotation(java.lang.Class); + public final class Constructor extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member { + method public A getAnnotation(java.lang.Class); method public java.lang.Class getDeclaringClass(); method public java.lang.Class[] getExceptionTypes(); method public java.lang.reflect.Type[] getGenericExceptionTypes(); @@ -51989,7 +51989,7 @@ package java.lang.reflect { public final class Field extends java.lang.reflect.AccessibleObject implements java.lang.reflect.Member { method public java.lang.Object get(java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException; - method public A getAnnotation(java.lang.Class); + method public A getAnnotation(java.lang.Class); method public boolean getBoolean(java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException; method public byte getByte(java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException; method public char getChar(java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException; @@ -52055,7 +52055,7 @@ package java.lang.reflect { } public final class Method extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member { - method public A getAnnotation(java.lang.Class); + method public A getAnnotation(java.lang.Class); method public java.lang.Class getDeclaringClass(); method public java.lang.Object getDefaultValue(); method public java.lang.Class[] getExceptionTypes(); @@ -52133,7 +52133,7 @@ package java.lang.reflect { public abstract interface Type { } - public abstract interface TypeVariable implements java.lang.reflect.Type { + public abstract interface TypeVariable implements java.lang.reflect.Type { method public abstract java.lang.reflect.Type[] getBounds(); method public abstract D getGenericDeclaration(); method public abstract java.lang.String getName(); @@ -52922,7 +52922,7 @@ package java.net { method public abstract java.net.SocketImpl createSocketImpl(); } - public abstract interface SocketOption { + public abstract interface SocketOption { method public abstract java.lang.String name(); method public abstract java.lang.Class type(); } @@ -53506,7 +53506,7 @@ package java.nio.channels { method public final long read(java.nio.ByteBuffer[]) throws java.io.IOException; method public abstract java.net.SocketAddress receive(java.nio.ByteBuffer) throws java.io.IOException; method public abstract int send(java.nio.ByteBuffer, java.net.SocketAddress) throws java.io.IOException; - method public abstract java.nio.channels.DatagramChannel setOption(java.net.SocketOption, T) throws java.io.IOException; + method public abstract java.nio.channels.DatagramChannel setOption(java.net.SocketOption, T) throws java.io.IOException; method public abstract java.net.DatagramSocket socket(); method public final int validOps(); method public abstract int write(java.nio.ByteBuffer) throws java.io.IOException; @@ -53582,8 +53582,8 @@ package java.nio.channels { public abstract interface NetworkChannel implements java.nio.channels.Channel { method public abstract java.nio.channels.NetworkChannel bind(java.net.SocketAddress) throws java.io.IOException; method public abstract java.net.SocketAddress getLocalAddress() throws java.io.IOException; - method public abstract T getOption(java.net.SocketOption) throws java.io.IOException; - method public abstract java.nio.channels.NetworkChannel setOption(java.net.SocketOption, T) throws java.io.IOException; + method public abstract T getOption(java.net.SocketOption) throws java.io.IOException; + method public abstract java.nio.channels.NetworkChannel setOption(java.net.SocketOption, T) throws java.io.IOException; method public abstract java.util.Set> supportedOptions(); } @@ -53700,7 +53700,7 @@ package java.nio.channels { method public final java.nio.channels.ServerSocketChannel bind(java.net.SocketAddress) throws java.io.IOException; method public abstract java.nio.channels.ServerSocketChannel bind(java.net.SocketAddress, int) throws java.io.IOException; method public static java.nio.channels.ServerSocketChannel open() throws java.io.IOException; - method public abstract java.nio.channels.ServerSocketChannel setOption(java.net.SocketOption, T) throws java.io.IOException; + method public abstract java.nio.channels.ServerSocketChannel setOption(java.net.SocketOption, T) throws java.io.IOException; method public abstract java.net.ServerSocket socket(); method public final int validOps(); } @@ -53718,7 +53718,7 @@ package java.nio.channels { method public abstract int read(java.nio.ByteBuffer) throws java.io.IOException; method public abstract long read(java.nio.ByteBuffer[], int, int) throws java.io.IOException; method public final long read(java.nio.ByteBuffer[]) throws java.io.IOException; - method public abstract java.nio.channels.SocketChannel setOption(java.net.SocketOption, T) throws java.io.IOException; + method public abstract java.nio.channels.SocketChannel setOption(java.net.SocketOption, T) throws java.io.IOException; method public abstract java.nio.channels.SocketChannel shutdownInput() throws java.io.IOException; method public abstract java.nio.channels.SocketChannel shutdownOutput() throws java.io.IOException; method public abstract java.net.Socket socket(); @@ -53965,12 +53965,12 @@ package java.security { public final class AccessController { method public static void checkPermission(java.security.Permission) throws java.security.AccessControlException; - method public static T doPrivileged(java.security.PrivilegedAction); - method public static T doPrivileged(java.security.PrivilegedAction, java.security.AccessControlContext); - method public static T doPrivileged(java.security.PrivilegedExceptionAction) throws java.security.PrivilegedActionException; - method public static T doPrivileged(java.security.PrivilegedExceptionAction, java.security.AccessControlContext) throws java.security.PrivilegedActionException; - method public static T doPrivilegedWithCombiner(java.security.PrivilegedAction); - method public static T doPrivilegedWithCombiner(java.security.PrivilegedExceptionAction) throws java.security.PrivilegedActionException; + method public static T doPrivileged(java.security.PrivilegedAction); + method public static T doPrivileged(java.security.PrivilegedAction, java.security.AccessControlContext); + method public static T doPrivileged(java.security.PrivilegedExceptionAction) throws java.security.PrivilegedActionException; + method public static T doPrivileged(java.security.PrivilegedExceptionAction, java.security.AccessControlContext) throws java.security.PrivilegedActionException; + method public static T doPrivilegedWithCombiner(java.security.PrivilegedAction); + method public static T doPrivilegedWithCombiner(java.security.PrivilegedExceptionAction) throws java.security.PrivilegedActionException; method public static java.security.AccessControlContext getContext(); } @@ -54009,7 +54009,7 @@ package java.security { method public static java.security.AlgorithmParameters getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException; method public static java.security.AlgorithmParameters getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException; method public static java.security.AlgorithmParameters getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException; - method public final T getParameterSpec(java.lang.Class) throws java.security.spec.InvalidParameterSpecException; + method public final T getParameterSpec(java.lang.Class) throws java.security.spec.InvalidParameterSpecException; method public final java.security.Provider getProvider(); method public final void init(java.security.spec.AlgorithmParameterSpec) throws java.security.spec.InvalidParameterSpecException; method public final void init(byte[]) throws java.io.IOException; @@ -54021,7 +54021,7 @@ package java.security { ctor public AlgorithmParametersSpi(); method protected abstract byte[] engineGetEncoded() throws java.io.IOException; method protected abstract byte[] engineGetEncoded(java.lang.String) throws java.io.IOException; - method protected abstract T engineGetParameterSpec(java.lang.Class) throws java.security.spec.InvalidParameterSpecException; + method protected abstract T engineGetParameterSpec(java.lang.Class) throws java.security.spec.InvalidParameterSpecException; method protected abstract void engineInit(java.security.spec.AlgorithmParameterSpec) throws java.security.spec.InvalidParameterSpecException; method protected abstract void engineInit(byte[]) throws java.io.IOException; method protected abstract void engineInit(byte[], java.lang.String) throws java.io.IOException; @@ -54206,7 +54206,7 @@ package java.security { method public static java.security.KeyFactory getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException; method public static java.security.KeyFactory getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException; method public static java.security.KeyFactory getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException; - method public final T getKeySpec(java.security.Key, java.lang.Class) throws java.security.spec.InvalidKeySpecException; + method public final T getKeySpec(java.security.Key, java.lang.Class) throws java.security.spec.InvalidKeySpecException; method public final java.security.Provider getProvider(); method public final java.security.Key translateKey(java.security.Key) throws java.security.InvalidKeyException; } @@ -54215,7 +54215,7 @@ package java.security { ctor public KeyFactorySpi(); method protected abstract java.security.PrivateKey engineGeneratePrivate(java.security.spec.KeySpec) throws java.security.spec.InvalidKeySpecException; method protected abstract java.security.PublicKey engineGeneratePublic(java.security.spec.KeySpec) throws java.security.spec.InvalidKeySpecException; - method protected abstract T engineGetKeySpec(java.security.Key, java.lang.Class) throws java.security.spec.InvalidKeySpecException; + method protected abstract T engineGetKeySpec(java.security.Key, java.lang.Class) throws java.security.spec.InvalidKeySpecException; method protected abstract java.security.Key engineTranslateKey(java.security.Key) throws java.security.InvalidKeyException; } @@ -54484,7 +54484,7 @@ package java.security { field public static final long serialVersionUID = 6034044314589513430L; // 0x53bd3b559a12c6d6L } - public abstract interface PrivilegedAction { + public abstract interface PrivilegedAction { method public abstract T run(); } @@ -54493,7 +54493,7 @@ package java.security { method public java.lang.Exception getException(); } - public abstract interface PrivilegedExceptionAction { + public abstract interface PrivilegedExceptionAction { method public abstract T run() throws java.lang.Exception; } @@ -56675,11 +56675,11 @@ package java.sql { method public abstract void free() throws java.sql.SQLException; method public abstract java.io.InputStream getBinaryStream() throws java.sql.SQLException; method public abstract java.io.Reader getCharacterStream() throws java.sql.SQLException; - method public abstract T getSource(java.lang.Class) throws java.sql.SQLException; + method public abstract T getSource(java.lang.Class) throws java.sql.SQLException; method public abstract java.lang.String getString() throws java.sql.SQLException; method public abstract java.io.OutputStream setBinaryStream() throws java.sql.SQLException; method public abstract java.io.Writer setCharacterStream() throws java.sql.SQLException; - method public abstract T setResult(java.lang.Class) throws java.sql.SQLException; + method public abstract T setResult(java.lang.Class) throws java.sql.SQLException; method public abstract void setString(java.lang.String) throws java.sql.SQLException; } @@ -56803,7 +56803,7 @@ package java.sql { public abstract interface Wrapper { method public abstract boolean isWrapperFor(java.lang.Class) throws java.sql.SQLException; - method public abstract T unwrap(java.lang.Class) throws java.sql.SQLException; + method public abstract T unwrap(java.lang.Class) throws java.sql.SQLException; } } @@ -57336,7 +57336,7 @@ package java.text { package java.util { - public abstract class AbstractCollection implements java.util.Collection { + public abstract class AbstractCollection implements java.util.Collection { ctor protected AbstractCollection(); method public boolean add(E); method public boolean addAll(java.util.Collection); @@ -57350,10 +57350,10 @@ package java.util { method public boolean retainAll(java.util.Collection); method public abstract int size(); method public java.lang.Object[] toArray(); - method public T[] toArray(T[]); + method public T[] toArray(T[]); } - public abstract class AbstractList extends java.util.AbstractCollection implements java.util.List { + public abstract class AbstractList extends java.util.AbstractCollection implements java.util.List { ctor protected AbstractList(); method public void add(int, E); method public boolean addAll(int, java.util.Collection); @@ -57370,7 +57370,7 @@ package java.util { field protected transient int modCount; } - public abstract class AbstractMap implements java.util.Map { + public abstract class AbstractMap implements java.util.Map { ctor protected AbstractMap(); method public void clear(); method public boolean containsKey(java.lang.Object); @@ -57386,7 +57386,7 @@ package java.util { method public java.util.Collection values(); } - public static class AbstractMap.SimpleEntry implements java.util.Map.Entry java.io.Serializable { + public static class AbstractMap.SimpleEntry implements java.util.Map.Entry java.io.Serializable { ctor public AbstractMap.SimpleEntry(K, V); ctor public AbstractMap.SimpleEntry(java.util.Map.Entry); method public K getKey(); @@ -57394,7 +57394,7 @@ package java.util { method public V setValue(V); } - public static class AbstractMap.SimpleImmutableEntry implements java.util.Map.Entry java.io.Serializable { + public static class AbstractMap.SimpleImmutableEntry implements java.util.Map.Entry java.io.Serializable { ctor public AbstractMap.SimpleImmutableEntry(K, V); ctor public AbstractMap.SimpleImmutableEntry(java.util.Map.Entry); method public K getKey(); @@ -57402,23 +57402,23 @@ package java.util { method public V setValue(V); } - public abstract class AbstractQueue extends java.util.AbstractCollection implements java.util.Queue { + public abstract class AbstractQueue extends java.util.AbstractCollection implements java.util.Queue { ctor protected AbstractQueue(); method public E element(); method public E remove(); } - public abstract class AbstractSequentialList extends java.util.AbstractList { + public abstract class AbstractSequentialList extends java.util.AbstractList { ctor protected AbstractSequentialList(); method public E get(int); method public abstract java.util.ListIterator listIterator(int); } - public abstract class AbstractSet extends java.util.AbstractCollection implements java.util.Set { + public abstract class AbstractSet extends java.util.AbstractCollection implements java.util.Set { ctor protected AbstractSet(); } - public class ArrayDeque extends java.util.AbstractCollection implements java.lang.Cloneable java.util.Deque java.io.Serializable { + public class ArrayDeque extends java.util.AbstractCollection implements java.lang.Cloneable java.util.Deque java.io.Serializable { ctor public ArrayDeque(); ctor public ArrayDeque(int); ctor public ArrayDeque(java.util.Collection); @@ -57450,7 +57450,7 @@ package java.util { method public java.util.Spliterator spliterator(); } - public class ArrayList extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { + public class ArrayList extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { ctor public ArrayList(int); ctor public ArrayList(); ctor public ArrayList(java.util.Collection); @@ -57467,7 +57467,7 @@ package java.util { } public class Arrays { - method public static java.util.List asList(T...); + method public static java.util.List asList(T...); method public static int binarySearch(long[], long); method public static int binarySearch(long[], int, int, long); method public static int binarySearch(int[], int); @@ -57484,10 +57484,10 @@ package java.util { method public static int binarySearch(float[], int, int, float); method public static int binarySearch(java.lang.Object[], java.lang.Object); method public static int binarySearch(java.lang.Object[], int, int, java.lang.Object); - method public static int binarySearch(T[], T, java.util.Comparator); - method public static int binarySearch(T[], int, int, T, java.util.Comparator); - method public static T[] copyOf(T[], int); - method public static T[] copyOf(U[], int, java.lang.Class); + method public static int binarySearch(T[], T, java.util.Comparator); + method public static int binarySearch(T[], int, int, T, java.util.Comparator); + method public static T[] copyOf(T[], int); + method public static T[] copyOf(U[], int, java.lang.Class); method public static byte[] copyOf(byte[], int); method public static short[] copyOf(short[], int); method public static int[] copyOf(int[], int); @@ -57496,8 +57496,8 @@ package java.util { method public static float[] copyOf(float[], int); method public static double[] copyOf(double[], int); method public static boolean[] copyOf(boolean[], int); - method public static T[] copyOfRange(T[], int, int); - method public static T[] copyOfRange(U[], int, int, java.lang.Class); + method public static T[] copyOfRange(T[], int, int); + method public static T[] copyOfRange(U[], int, int, java.lang.Class); method public static byte[] copyOfRange(byte[], int, int); method public static short[] copyOfRange(short[], int, int); method public static int[] copyOfRange(int[], int, int); @@ -57545,15 +57545,15 @@ package java.util { method public static int hashCode(float[]); method public static int hashCode(double[]); method public static int hashCode(java.lang.Object[]); - method public static void parallelPrefix(T[], java.util.function.BinaryOperator); - method public static void parallelPrefix(T[], int, int, java.util.function.BinaryOperator); + method public static void parallelPrefix(T[], java.util.function.BinaryOperator); + method public static void parallelPrefix(T[], int, int, java.util.function.BinaryOperator); method public static void parallelPrefix(long[], java.util.function.LongBinaryOperator); method public static void parallelPrefix(long[], int, int, java.util.function.LongBinaryOperator); method public static void parallelPrefix(double[], java.util.function.DoubleBinaryOperator); method public static void parallelPrefix(double[], int, int, java.util.function.DoubleBinaryOperator); method public static void parallelPrefix(int[], java.util.function.IntBinaryOperator); method public static void parallelPrefix(int[], int, int, java.util.function.IntBinaryOperator); - method public static void parallelSetAll(T[], java.util.function.IntFunction); + method public static void parallelSetAll(T[], java.util.function.IntFunction); method public static void parallelSetAll(int[], java.util.function.IntUnaryOperator); method public static void parallelSetAll(long[], java.util.function.IntToLongFunction); method public static void parallelSetAll(double[], java.util.function.IntToDoubleFunction); @@ -57571,11 +57571,11 @@ package java.util { method public static void parallelSort(float[], int, int); method public static void parallelSort(double[]); method public static void parallelSort(double[], int, int); - method public static void parallelSort(T[]); - method public static void parallelSort(T[], int, int); - method public static void parallelSort(T[], java.util.Comparator); - method public static void parallelSort(T[], int, int, java.util.Comparator); - method public static void setAll(T[], java.util.function.IntFunction); + method public static > void parallelSort(T[]); + method public static > void parallelSort(T[], int, int); + method public static void parallelSort(T[], java.util.Comparator); + method public static void parallelSort(T[], int, int, java.util.Comparator); + method public static void setAll(T[], java.util.function.IntFunction); method public static void setAll(int[], java.util.function.IntUnaryOperator); method public static void setAll(long[], java.util.function.IntToLongFunction); method public static void setAll(double[], java.util.function.IntToDoubleFunction); @@ -57595,18 +57595,18 @@ package java.util { method public static void sort(double[], int, int); method public static void sort(java.lang.Object[]); method public static void sort(java.lang.Object[], int, int); - method public static void sort(T[], java.util.Comparator); - method public static void sort(T[], int, int, java.util.Comparator); - method public static java.util.Spliterator spliterator(T[]); - method public static java.util.Spliterator spliterator(T[], int, int); + method public static void sort(T[], java.util.Comparator); + method public static void sort(T[], int, int, java.util.Comparator); + method public static java.util.Spliterator spliterator(T[]); + method public static java.util.Spliterator spliterator(T[], int, int); method public static java.util.Spliterator.OfInt spliterator(int[]); method public static java.util.Spliterator.OfInt spliterator(int[], int, int); method public static java.util.Spliterator.OfLong spliterator(long[]); method public static java.util.Spliterator.OfLong spliterator(long[], int, int); method public static java.util.Spliterator.OfDouble spliterator(double[]); method public static java.util.Spliterator.OfDouble spliterator(double[], int, int); - method public static java.util.stream.Stream stream(T[]); - method public static java.util.stream.Stream stream(T[], int, int); + method public static java.util.stream.Stream stream(T[]); + method public static java.util.stream.Stream stream(T[], int, int); method public static java.util.stream.IntStream stream(int[]); method public static java.util.stream.IntStream stream(int[], int, int); method public static java.util.stream.LongStream stream(long[]); @@ -57763,7 +57763,7 @@ package java.util { field protected long time; } - public abstract interface Collection implements java.lang.Iterable { + public abstract interface Collection implements java.lang.Iterable { method public abstract boolean add(E); method public abstract boolean addAll(java.util.Collection); method public abstract void clear(); @@ -57781,86 +57781,86 @@ package java.util { method public abstract int size(); method public default java.util.stream.Stream stream(); method public abstract java.lang.Object[] toArray(); - method public abstract T[] toArray(T[]); + method public abstract T[] toArray(T[]); } public class Collections { - method public static boolean addAll(java.util.Collection, T...); - method public static java.util.Queue asLifoQueue(java.util.Deque); - method public static int binarySearch(java.util.List>, T); - method public static int binarySearch(java.util.List, T, java.util.Comparator); - method public static java.util.Collection checkedCollection(java.util.Collection, java.lang.Class); - method public static java.util.List checkedList(java.util.List, java.lang.Class); - method public static java.util.Map checkedMap(java.util.Map, java.lang.Class, java.lang.Class); - method public static java.util.Set checkedSet(java.util.Set, java.lang.Class); - method public static java.util.SortedMap checkedSortedMap(java.util.SortedMap, java.lang.Class, java.lang.Class); - method public static java.util.SortedSet checkedSortedSet(java.util.SortedSet, java.lang.Class); - method public static void copy(java.util.List, java.util.List); + method public static boolean addAll(java.util.Collection, T...); + method public static java.util.Queue asLifoQueue(java.util.Deque); + method public static int binarySearch(java.util.List>, T); + method public static int binarySearch(java.util.List, T, java.util.Comparator); + method public static java.util.Collection checkedCollection(java.util.Collection, java.lang.Class); + method public static java.util.List checkedList(java.util.List, java.lang.Class); + method public static java.util.Map checkedMap(java.util.Map, java.lang.Class, java.lang.Class); + method public static java.util.Set checkedSet(java.util.Set, java.lang.Class); + method public static java.util.SortedMap checkedSortedMap(java.util.SortedMap, java.lang.Class, java.lang.Class); + method public static java.util.SortedSet checkedSortedSet(java.util.SortedSet, java.lang.Class); + method public static void copy(java.util.List, java.util.List); method public static boolean disjoint(java.util.Collection, java.util.Collection); - method public static java.util.Enumeration emptyEnumeration(); - method public static java.util.Iterator emptyIterator(); - method public static final java.util.List emptyList(); - method public static java.util.ListIterator emptyListIterator(); - method public static final java.util.Map emptyMap(); - method public static final java.util.Set emptySet(); - method public static java.util.Enumeration enumeration(java.util.Collection); - method public static void fill(java.util.List, T); + method public static java.util.Enumeration emptyEnumeration(); + method public static java.util.Iterator emptyIterator(); + method public static final java.util.List emptyList(); + method public static java.util.ListIterator emptyListIterator(); + method public static final java.util.Map emptyMap(); + method public static final java.util.Set emptySet(); + method public static java.util.Enumeration enumeration(java.util.Collection); + method public static void fill(java.util.List, T); method public static int frequency(java.util.Collection, java.lang.Object); method public static int indexOfSubList(java.util.List, java.util.List); method public static int lastIndexOfSubList(java.util.List, java.util.List); - method public static java.util.ArrayList list(java.util.Enumeration); - method public static T max(java.util.Collection); - method public static T max(java.util.Collection, java.util.Comparator); - method public static T min(java.util.Collection); - method public static T min(java.util.Collection, java.util.Comparator); - method public static java.util.List nCopies(int, T); - method public static java.util.Set newSetFromMap(java.util.Map); - method public static boolean replaceAll(java.util.List, T, T); + method public static java.util.ArrayList list(java.util.Enumeration); + method public static > T max(java.util.Collection); + method public static T max(java.util.Collection, java.util.Comparator); + method public static > T min(java.util.Collection); + method public static T min(java.util.Collection, java.util.Comparator); + method public static java.util.List nCopies(int, T); + method public static java.util.Set newSetFromMap(java.util.Map); + method public static boolean replaceAll(java.util.List, T, T); method public static void reverse(java.util.List); - method public static java.util.Comparator reverseOrder(); - method public static java.util.Comparator reverseOrder(java.util.Comparator); + method public static java.util.Comparator reverseOrder(); + method public static java.util.Comparator reverseOrder(java.util.Comparator); method public static void rotate(java.util.List, int); method public static void shuffle(java.util.List); method public static void shuffle(java.util.List, java.util.Random); - method public static java.util.Set singleton(E); - method public static java.util.List singletonList(E); - method public static java.util.Map singletonMap(K, V); - method public static void sort(java.util.List); - method public static void sort(java.util.List, java.util.Comparator); + method public static java.util.Set singleton(E); + method public static java.util.List singletonList(E); + method public static java.util.Map singletonMap(K, V); + method public static > void sort(java.util.List); + method public static void sort(java.util.List, java.util.Comparator); method public static void swap(java.util.List, int, int); - method public static java.util.Collection synchronizedCollection(java.util.Collection); - method public static java.util.List synchronizedList(java.util.List); - method public static java.util.Map synchronizedMap(java.util.Map); - method public static java.util.Set synchronizedSet(java.util.Set); - method public static java.util.SortedMap synchronizedSortedMap(java.util.SortedMap); - method public static java.util.SortedSet synchronizedSortedSet(java.util.SortedSet); - method public static java.util.Collection unmodifiableCollection(java.util.Collection); - method public static java.util.List unmodifiableList(java.util.List); - method public static java.util.Map unmodifiableMap(java.util.Map); - method public static java.util.Set unmodifiableSet(java.util.Set); - method public static java.util.SortedMap unmodifiableSortedMap(java.util.SortedMap); - method public static java.util.SortedSet unmodifiableSortedSet(java.util.SortedSet); + method public static java.util.Collection synchronizedCollection(java.util.Collection); + method public static java.util.List synchronizedList(java.util.List); + method public static java.util.Map synchronizedMap(java.util.Map); + method public static java.util.Set synchronizedSet(java.util.Set); + method public static java.util.SortedMap synchronizedSortedMap(java.util.SortedMap); + method public static java.util.SortedSet synchronizedSortedSet(java.util.SortedSet); + method public static java.util.Collection unmodifiableCollection(java.util.Collection); + method public static java.util.List unmodifiableList(java.util.List); + method public static java.util.Map unmodifiableMap(java.util.Map); + method public static java.util.Set unmodifiableSet(java.util.Set); + method public static java.util.SortedMap unmodifiableSortedMap(java.util.SortedMap); + method public static java.util.SortedSet unmodifiableSortedSet(java.util.SortedSet); field public static final java.util.List EMPTY_LIST; field public static final java.util.Map EMPTY_MAP; field public static final java.util.Set EMPTY_SET; } - public abstract interface Comparator { + public abstract interface Comparator { method public abstract int compare(T, T); - method public static java.util.Comparator comparing(java.util.function.Function, java.util.Comparator); - method public static java.util.Comparator comparing(java.util.function.Function); - method public static java.util.Comparator comparingDouble(java.util.function.ToDoubleFunction); - method public static java.util.Comparator comparingInt(java.util.function.ToIntFunction); - method public static java.util.Comparator comparingLong(java.util.function.ToLongFunction); + method public static java.util.Comparator comparing(java.util.function.Function, java.util.Comparator); + method public static > java.util.Comparator comparing(java.util.function.Function); + method public static java.util.Comparator comparingDouble(java.util.function.ToDoubleFunction); + method public static java.util.Comparator comparingInt(java.util.function.ToIntFunction); + method public static java.util.Comparator comparingLong(java.util.function.ToLongFunction); method public abstract boolean equals(java.lang.Object); - method public static java.util.Comparator naturalOrder(); - method public static java.util.Comparator nullsFirst(java.util.Comparator); - method public static java.util.Comparator nullsLast(java.util.Comparator); - method public static java.util.Comparator reverseOrder(); + method public static > java.util.Comparator naturalOrder(); + method public static java.util.Comparator nullsFirst(java.util.Comparator); + method public static java.util.Comparator nullsLast(java.util.Comparator); + method public static > java.util.Comparator reverseOrder(); method public default java.util.Comparator reversed(); method public default java.util.Comparator thenComparing(java.util.Comparator); - method public default java.util.Comparator thenComparing(java.util.function.Function, java.util.Comparator); - method public default java.util.Comparator thenComparing(java.util.function.Function); + method public default java.util.Comparator thenComparing(java.util.function.Function, java.util.Comparator); + method public default > java.util.Comparator thenComparing(java.util.function.Function); method public default java.util.Comparator thenComparingDouble(java.util.function.ToDoubleFunction); method public default java.util.Comparator thenComparingInt(java.util.function.ToIntFunction); method public default java.util.Comparator thenComparingLong(java.util.function.ToLongFunction); @@ -57919,7 +57919,7 @@ package java.util { method public deprecated java.lang.String toLocaleString(); } - public abstract interface Deque implements java.util.Queue { + public abstract interface Deque implements java.util.Queue { method public abstract boolean add(E); method public abstract void addFirst(E); method public abstract void addLast(E); @@ -57949,7 +57949,7 @@ package java.util { method public abstract int size(); } - public abstract class Dictionary { + public abstract class Dictionary { ctor public Dictionary(); method public abstract java.util.Enumeration elements(); method public abstract V get(java.lang.Object); @@ -57980,7 +57980,7 @@ package java.util { ctor public EmptyStackException(); } - public class EnumMap extends java.util.AbstractMap implements java.lang.Cloneable java.io.Serializable { + public class EnumMap, V> extends java.util.AbstractMap implements java.lang.Cloneable java.io.Serializable { ctor public EnumMap(java.lang.Class); ctor public EnumMap(java.util.EnumMap); ctor public EnumMap(java.util.Map); @@ -57988,23 +57988,23 @@ package java.util { method public java.util.Set> entrySet(); } - public abstract class EnumSet extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable { - method public static java.util.EnumSet allOf(java.lang.Class); + public abstract class EnumSet> extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable { + method public static > java.util.EnumSet allOf(java.lang.Class); method public java.util.EnumSet clone(); - method public static java.util.EnumSet complementOf(java.util.EnumSet); - method public static java.util.EnumSet copyOf(java.util.EnumSet); - method public static java.util.EnumSet copyOf(java.util.Collection); - method public static java.util.EnumSet noneOf(java.lang.Class); - method public static java.util.EnumSet of(E); - method public static java.util.EnumSet of(E, E); - method public static java.util.EnumSet of(E, E, E); - method public static java.util.EnumSet of(E, E, E, E); - method public static java.util.EnumSet of(E, E, E, E, E); - method public static java.util.EnumSet of(E, E...); - method public static java.util.EnumSet range(E, E); - } - - public abstract interface Enumeration { + method public static > java.util.EnumSet complementOf(java.util.EnumSet); + method public static > java.util.EnumSet copyOf(java.util.EnumSet); + method public static > java.util.EnumSet copyOf(java.util.Collection); + method public static > java.util.EnumSet noneOf(java.lang.Class); + method public static > java.util.EnumSet of(E); + method public static > java.util.EnumSet of(E, E); + method public static > java.util.EnumSet of(E, E, E); + method public static > java.util.EnumSet of(E, E, E, E); + method public static > java.util.EnumSet of(E, E, E, E, E); + method public static > java.util.EnumSet of(E, E...); + method public static > java.util.EnumSet range(E, E); + } + + public abstract interface Enumeration { method public abstract boolean hasMoreElements(); method public abstract E nextElement(); } @@ -58012,7 +58012,7 @@ package java.util { public abstract interface EventListener { } - public abstract class EventListenerProxy implements java.util.EventListener { + public abstract class EventListenerProxy implements java.util.EventListener { ctor public EventListenerProxy(T); method public T getListener(); } @@ -58098,7 +58098,7 @@ package java.util { field public static final int BC = 0; // 0x0 } - public class HashMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable { + public class HashMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable { ctor public HashMap(int, float); ctor public HashMap(int); ctor public HashMap(); @@ -58110,7 +58110,7 @@ package java.util { method public void replaceAll(java.util.function.BiFunction); } - public class HashSet extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable java.util.Set { + public class HashSet extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable java.util.Set { ctor public HashSet(); ctor public HashSet(java.util.Collection); ctor public HashSet(int, float); @@ -58121,7 +58121,7 @@ package java.util { method public java.util.Spliterator spliterator(); } - public class Hashtable extends java.util.Dictionary implements java.lang.Cloneable java.util.Map java.io.Serializable { + public class Hashtable extends java.util.Dictionary implements java.lang.Cloneable java.util.Map java.io.Serializable { ctor public Hashtable(int, float); ctor public Hashtable(int); ctor public Hashtable(); @@ -58156,7 +58156,7 @@ package java.util { method public java.util.Collection values(); } - public class IdentityHashMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable { + public class IdentityHashMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable { ctor public IdentityHashMap(); ctor public IdentityHashMap(int); ctor public IdentityHashMap(java.util.Map); @@ -58223,14 +58223,14 @@ package java.util { ctor public InvalidPropertiesFormatException(java.lang.String); } - public abstract interface Iterator { + public abstract interface Iterator { method public default void forEachRemaining(java.util.function.Consumer); method public abstract boolean hasNext(); method public abstract E next(); method public default void remove(); } - public class LinkedHashMap extends java.util.HashMap implements java.util.Map { + public class LinkedHashMap extends java.util.HashMap implements java.util.Map { ctor public LinkedHashMap(int, float); ctor public LinkedHashMap(int); ctor public LinkedHashMap(); @@ -58239,14 +58239,14 @@ package java.util { method protected boolean removeEldestEntry(java.util.Map.Entry); } - public class LinkedHashSet extends java.util.HashSet implements java.lang.Cloneable java.io.Serializable java.util.Set { + public class LinkedHashSet extends java.util.HashSet implements java.lang.Cloneable java.io.Serializable java.util.Set { ctor public LinkedHashSet(int, float); ctor public LinkedHashSet(int); ctor public LinkedHashSet(); ctor public LinkedHashSet(java.util.Collection); } - public class LinkedList extends java.util.AbstractSequentialList implements java.lang.Cloneable java.util.Deque java.util.List java.io.Serializable { + public class LinkedList extends java.util.AbstractSequentialList implements java.lang.Cloneable java.util.Deque java.util.List java.io.Serializable { ctor public LinkedList(); ctor public LinkedList(java.util.Collection); method public void addFirst(E); @@ -58277,7 +58277,7 @@ package java.util { method public java.util.Spliterator spliterator(); } - public abstract interface List implements java.util.Collection { + public abstract interface List implements java.util.Collection { method public abstract boolean add(E); method public abstract void add(int, E); method public abstract boolean addAll(java.util.Collection); @@ -58304,10 +58304,10 @@ package java.util { method public default void sort(java.util.Comparator); method public abstract java.util.List subList(int, int); method public abstract java.lang.Object[] toArray(); - method public abstract T[] toArray(T[]); + method public abstract T[] toArray(T[]); } - public abstract interface ListIterator implements java.util.Iterator { + public abstract interface ListIterator implements java.util.Iterator { method public abstract void add(E); method public abstract boolean hasNext(); method public abstract boolean hasPrevious(); @@ -58424,7 +58424,7 @@ package java.util { method public final long getSum(); } - public abstract interface Map { + public abstract interface Map { method public abstract void clear(); method public default V compute(K, java.util.function.BiFunction); method public default V computeIfAbsent(K, java.util.function.Function); @@ -58452,11 +58452,11 @@ package java.util { method public abstract java.util.Collection values(); } - public static abstract interface Map.Entry { - method public static java.util.Comparator> comparingByKey(); - method public static java.util.Comparator> comparingByKey(java.util.Comparator); - method public static java.util.Comparator> comparingByValue(); - method public static java.util.Comparator> comparingByValue(java.util.Comparator); + public static abstract interface Map.Entry { + method public static , V> java.util.Comparator> comparingByKey(); + method public static java.util.Comparator> comparingByKey(java.util.Comparator); + method public static > java.util.Comparator> comparingByValue(); + method public static java.util.Comparator> comparingByValue(java.util.Comparator); method public abstract boolean equals(java.lang.Object); method public abstract K getKey(); method public abstract V getValue(); @@ -58480,7 +58480,7 @@ package java.util { method public java.lang.String getKey(); } - public abstract interface NavigableMap implements java.util.SortedMap { + public abstract interface NavigableMap implements java.util.SortedMap { method public abstract java.util.Map.Entry ceilingEntry(K); method public abstract K ceilingKey(K); method public abstract java.util.NavigableSet descendingKeySet(); @@ -58504,7 +58504,7 @@ package java.util { method public abstract java.util.SortedMap tailMap(K); } - public abstract interface NavigableSet implements java.util.SortedSet { + public abstract interface NavigableSet implements java.util.SortedSet { method public abstract E ceiling(E); method public abstract java.util.Iterator descendingIterator(); method public abstract java.util.NavigableSet descendingSet(); @@ -58528,16 +58528,16 @@ package java.util { } public final class Objects { - method public static int compare(T, T, java.util.Comparator); + method public static int compare(T, T, java.util.Comparator); method public static boolean deepEquals(java.lang.Object, java.lang.Object); method public static boolean equals(java.lang.Object, java.lang.Object); method public static int hash(java.lang.Object...); method public static int hashCode(java.lang.Object); method public static boolean isNull(java.lang.Object); method public static boolean nonNull(java.lang.Object); - method public static T requireNonNull(T); - method public static T requireNonNull(T, java.lang.String); - method public static T requireNonNull(T, java.util.function.Supplier); + method public static T requireNonNull(T); + method public static T requireNonNull(T, java.lang.String); + method public static T requireNonNull(T, java.util.function.Supplier); method public static java.lang.String toString(java.lang.Object); method public static java.lang.String toString(java.lang.Object, java.lang.String); } @@ -58559,19 +58559,19 @@ package java.util { method public abstract void update(java.util.Observable, java.lang.Object); } - public final class Optional { - method public static java.util.Optional empty(); + public final class Optional { + method public static java.util.Optional empty(); method public java.util.Optional filter(java.util.function.Predicate); - method public java.util.Optional flatMap(java.util.function.Function>); + method public java.util.Optional flatMap(java.util.function.Function>); method public T get(); method public void ifPresent(java.util.function.Consumer); method public boolean isPresent(); - method public java.util.Optional map(java.util.function.Function); - method public static java.util.Optional of(T); - method public static java.util.Optional ofNullable(T); + method public java.util.Optional map(java.util.function.Function); + method public static java.util.Optional of(T); + method public static java.util.Optional ofNullable(T); method public T orElse(T); method public T orElseGet(java.util.function.Supplier); - method public T orElseThrow(java.util.function.Supplier) throws java.lang.Throwable; + method public T orElseThrow(java.util.function.Supplier) throws java.lang.Throwable; } public final class OptionalDouble { @@ -58582,7 +58582,7 @@ package java.util { method public static java.util.OptionalDouble of(double); method public double orElse(double); method public double orElseGet(java.util.function.DoubleSupplier); - method public double orElseThrow(java.util.function.Supplier) throws java.lang.Throwable; + method public double orElseThrow(java.util.function.Supplier) throws java.lang.Throwable; } public final class OptionalInt { @@ -58593,7 +58593,7 @@ package java.util { method public static java.util.OptionalInt of(int); method public int orElse(int); method public int orElseGet(java.util.function.IntSupplier); - method public int orElseThrow(java.util.function.Supplier) throws java.lang.Throwable; + method public int orElseThrow(java.util.function.Supplier) throws java.lang.Throwable; } public final class OptionalLong { @@ -58604,10 +58604,10 @@ package java.util { method public static java.util.OptionalLong of(long); method public long orElse(long); method public long orElseGet(java.util.function.LongSupplier); - method public long orElseThrow(java.util.function.Supplier) throws java.lang.Throwable; + method public long orElseThrow(java.util.function.Supplier) throws java.lang.Throwable; } - public abstract interface PrimitiveIterator implements java.util.Iterator { + public abstract interface PrimitiveIterator implements java.util.Iterator { method public abstract void forEachRemaining(T_CONS); } @@ -58632,7 +58632,7 @@ package java.util { method public abstract long nextLong(); } - public class PriorityQueue extends java.util.AbstractQueue implements java.io.Serializable { + public class PriorityQueue extends java.util.AbstractQueue implements java.io.Serializable { ctor public PriorityQueue(); ctor public PriorityQueue(int); ctor public PriorityQueue(java.util.Comparator); @@ -58681,7 +58681,7 @@ package java.util { method public java.lang.Object handleGetObject(java.lang.String); } - public abstract interface Queue implements java.util.Collection { + public abstract interface Queue implements java.util.Collection { method public abstract boolean add(E); method public abstract E element(); method public abstract boolean offer(E); @@ -58831,15 +58831,15 @@ package java.util { ctor public ServiceConfigurationError(java.lang.String, java.lang.Throwable); } - public final class ServiceLoader implements java.lang.Iterable { + public final class ServiceLoader implements java.lang.Iterable { method public java.util.Iterator iterator(); - method public static java.util.ServiceLoader load(java.lang.Class, java.lang.ClassLoader); - method public static java.util.ServiceLoader load(java.lang.Class); - method public static java.util.ServiceLoader loadInstalled(java.lang.Class); + method public static java.util.ServiceLoader load(java.lang.Class, java.lang.ClassLoader); + method public static java.util.ServiceLoader load(java.lang.Class); + method public static java.util.ServiceLoader loadInstalled(java.lang.Class); method public void reload(); } - public abstract interface Set implements java.util.Collection { + public abstract interface Set implements java.util.Collection { method public abstract boolean add(E); method public abstract boolean addAll(java.util.Collection); method public abstract void clear(); @@ -58854,7 +58854,7 @@ package java.util { method public abstract boolean retainAll(java.util.Collection); method public abstract int size(); method public abstract java.lang.Object[] toArray(); - method public abstract T[] toArray(T[]); + method public abstract T[] toArray(T[]); } public class SimpleTimeZone extends java.util.TimeZone { @@ -58880,7 +58880,7 @@ package java.util { field public static final int WALL_TIME = 0; // 0x0 } - public abstract interface SortedMap implements java.util.Map { + public abstract interface SortedMap implements java.util.Map { method public abstract java.util.Comparator comparator(); method public abstract java.util.Set> entrySet(); method public abstract K firstKey(); @@ -58892,7 +58892,7 @@ package java.util { method public abstract java.util.Collection values(); } - public abstract interface SortedSet implements java.util.Set { + public abstract interface SortedSet implements java.util.Set { method public abstract java.util.Comparator comparator(); method public abstract E first(); method public abstract java.util.SortedSet headSet(E); @@ -58901,7 +58901,7 @@ package java.util { method public abstract java.util.SortedSet tailSet(E); } - public abstract interface Spliterator { + public abstract interface Spliterator { method public abstract int characteristics(); method public abstract long estimateSize(); method public default void forEachRemaining(java.util.function.Consumer); @@ -58944,7 +58944,7 @@ package java.util { method public abstract java.util.Spliterator.OfLong trySplit(); } - public static abstract interface Spliterator.OfPrimitive implements java.util.Spliterator { + public static abstract interface Spliterator.OfPrimitive> implements java.util.Spliterator { method public default void forEachRemaining(T_CONS); method public abstract boolean tryAdvance(T_CONS); method public abstract T_SPLITR trySplit(); @@ -58954,25 +58954,25 @@ package java.util { method public static java.util.Spliterator.OfDouble emptyDoubleSpliterator(); method public static java.util.Spliterator.OfInt emptyIntSpliterator(); method public static java.util.Spliterator.OfLong emptyLongSpliterator(); - method public static java.util.Spliterator emptySpliterator(); - method public static java.util.Iterator iterator(java.util.Spliterator); + method public static java.util.Spliterator emptySpliterator(); + method public static java.util.Iterator iterator(java.util.Spliterator); method public static java.util.PrimitiveIterator.OfInt iterator(java.util.Spliterator.OfInt); method public static java.util.PrimitiveIterator.OfLong iterator(java.util.Spliterator.OfLong); method public static java.util.PrimitiveIterator.OfDouble iterator(java.util.Spliterator.OfDouble); - method public static java.util.Spliterator spliterator(java.lang.Object[], int); - method public static java.util.Spliterator spliterator(java.lang.Object[], int, int, int); + method public static java.util.Spliterator spliterator(java.lang.Object[], int); + method public static java.util.Spliterator spliterator(java.lang.Object[], int, int, int); method public static java.util.Spliterator.OfInt spliterator(int[], int); method public static java.util.Spliterator.OfInt spliterator(int[], int, int, int); method public static java.util.Spliterator.OfLong spliterator(long[], int); method public static java.util.Spliterator.OfLong spliterator(long[], int, int, int); method public static java.util.Spliterator.OfDouble spliterator(double[], int); method public static java.util.Spliterator.OfDouble spliterator(double[], int, int, int); - method public static java.util.Spliterator spliterator(java.util.Collection, int); - method public static java.util.Spliterator spliterator(java.util.Iterator, long, int); + method public static java.util.Spliterator spliterator(java.util.Collection, int); + method public static java.util.Spliterator spliterator(java.util.Iterator, long, int); method public static java.util.Spliterator.OfInt spliterator(java.util.PrimitiveIterator.OfInt, long, int); method public static java.util.Spliterator.OfLong spliterator(java.util.PrimitiveIterator.OfLong, long, int); method public static java.util.Spliterator.OfDouble spliterator(java.util.PrimitiveIterator.OfDouble, long, int); - method public static java.util.Spliterator spliteratorUnknownSize(java.util.Iterator, int); + method public static java.util.Spliterator spliteratorUnknownSize(java.util.Iterator, int); method public static java.util.Spliterator.OfInt spliteratorUnknownSize(java.util.PrimitiveIterator.OfInt, int); method public static java.util.Spliterator.OfLong spliteratorUnknownSize(java.util.PrimitiveIterator.OfLong, int); method public static java.util.Spliterator.OfDouble spliteratorUnknownSize(java.util.PrimitiveIterator.OfDouble, int); @@ -58999,7 +58999,7 @@ package java.util { method public java.util.Spliterator.OfLong trySplit(); } - public static abstract class Spliterators.AbstractSpliterator implements java.util.Spliterator { + public static abstract class Spliterators.AbstractSpliterator implements java.util.Spliterator { ctor protected Spliterators.AbstractSpliterator(long, int); method public int characteristics(); method public long estimateSize(); @@ -59034,7 +59034,7 @@ package java.util { method public java.util.SplittableRandom split(); } - public class Stack extends java.util.Vector { + public class Stack extends java.util.Vector { ctor public Stack(); method public boolean empty(); method public synchronized E peek(); @@ -59118,7 +59118,7 @@ package java.util { ctor public TooManyListenersException(java.lang.String); } - public class TreeMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.NavigableMap java.io.Serializable { + public class TreeMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.NavigableMap java.io.Serializable { ctor public TreeMap(); ctor public TreeMap(java.util.Comparator); ctor public TreeMap(java.util.Map); @@ -59155,7 +59155,7 @@ package java.util { method public java.util.SortedMap tailMap(K); } - public class TreeSet extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable { + public class TreeSet extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable { ctor public TreeSet(); ctor public TreeSet(java.util.Comparator); ctor public TreeSet(java.util.Collection); @@ -59208,7 +59208,7 @@ package java.util { method public java.lang.String getFlags(); } - public class Vector extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { + public class Vector extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { ctor public Vector(int, int); ctor public Vector(int); ctor public Vector(); @@ -59243,7 +59243,7 @@ package java.util { field protected java.lang.Object[] elementData; } - public class WeakHashMap extends java.util.AbstractMap implements java.util.Map { + public class WeakHashMap extends java.util.AbstractMap implements java.util.Map { ctor public WeakHashMap(int, float); ctor public WeakHashMap(int); ctor public WeakHashMap(); @@ -59259,18 +59259,18 @@ package java.util.concurrent { public abstract class AbstractExecutorService implements java.util.concurrent.ExecutorService { ctor public AbstractExecutorService(); - method public java.util.List> invokeAll(java.util.Collection>) throws java.lang.InterruptedException; - method public java.util.List> invokeAll(java.util.Collection>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; - method public T invokeAny(java.util.Collection>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; - method public T invokeAny(java.util.Collection>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; - method protected java.util.concurrent.RunnableFuture newTaskFor(java.lang.Runnable, T); - method protected java.util.concurrent.RunnableFuture newTaskFor(java.util.concurrent.Callable); + method public java.util.List> invokeAll(java.util.Collection>) throws java.lang.InterruptedException; + method public java.util.List> invokeAll(java.util.Collection>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; + method public T invokeAny(java.util.Collection>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; + method public T invokeAny(java.util.Collection>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; + method protected java.util.concurrent.RunnableFuture newTaskFor(java.lang.Runnable, T); + method protected java.util.concurrent.RunnableFuture newTaskFor(java.util.concurrent.Callable); method public java.util.concurrent.Future submit(java.lang.Runnable); - method public java.util.concurrent.Future submit(java.lang.Runnable, T); - method public java.util.concurrent.Future submit(java.util.concurrent.Callable); + method public java.util.concurrent.Future submit(java.lang.Runnable, T); + method public java.util.concurrent.Future submit(java.util.concurrent.Callable); } - public class ArrayBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { + public class ArrayBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { ctor public ArrayBlockingQueue(int); ctor public ArrayBlockingQueue(int, boolean); ctor public ArrayBlockingQueue(int, boolean, java.util.Collection); @@ -59289,7 +59289,7 @@ package java.util.concurrent { method public E take() throws java.lang.InterruptedException; } - public abstract interface BlockingDeque implements java.util.concurrent.BlockingQueue java.util.Deque { + public abstract interface BlockingDeque implements java.util.concurrent.BlockingQueue java.util.Deque { method public abstract boolean add(E); method public abstract void addFirst(E); method public abstract void addLast(E); @@ -59321,7 +59321,7 @@ package java.util.concurrent { method public abstract E takeLast() throws java.lang.InterruptedException; } - public abstract interface BlockingQueue implements java.util.Queue { + public abstract interface BlockingQueue implements java.util.Queue { method public abstract boolean add(E); method public abstract boolean contains(java.lang.Object); method public abstract int drainTo(java.util.Collection); @@ -59340,7 +59340,7 @@ package java.util.concurrent { ctor public BrokenBarrierException(java.lang.String); } - public abstract interface Callable { + public abstract interface Callable { method public abstract V call() throws java.lang.Exception; } @@ -59349,28 +59349,28 @@ package java.util.concurrent { ctor public CancellationException(java.lang.String); } - public class CompletableFuture implements java.util.concurrent.CompletionStage java.util.concurrent.Future { + public class CompletableFuture implements java.util.concurrent.CompletionStage java.util.concurrent.Future { ctor public CompletableFuture(); method public java.util.concurrent.CompletableFuture acceptEither(java.util.concurrent.CompletionStage, java.util.function.Consumer); method public java.util.concurrent.CompletableFuture acceptEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Consumer); method public java.util.concurrent.CompletableFuture acceptEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Consumer, java.util.concurrent.Executor); method public static java.util.concurrent.CompletableFuture allOf(java.util.concurrent.CompletableFuture...); method public static java.util.concurrent.CompletableFuture anyOf(java.util.concurrent.CompletableFuture...); - method public java.util.concurrent.CompletableFuture applyToEither(java.util.concurrent.CompletionStage, java.util.function.Function); - method public java.util.concurrent.CompletableFuture applyToEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Function); - method public java.util.concurrent.CompletableFuture applyToEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Function, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture applyToEither(java.util.concurrent.CompletionStage, java.util.function.Function); + method public java.util.concurrent.CompletableFuture applyToEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Function); + method public java.util.concurrent.CompletableFuture applyToEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Function, java.util.concurrent.Executor); method public boolean cancel(boolean); method public boolean complete(T); method public boolean completeExceptionally(java.lang.Throwable); - method public static java.util.concurrent.CompletableFuture completedFuture(U); + method public static java.util.concurrent.CompletableFuture completedFuture(U); method public java.util.concurrent.CompletableFuture exceptionally(java.util.function.Function); method public T get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; method public T get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; method public T getNow(T); method public int getNumberOfDependents(); - method public java.util.concurrent.CompletableFuture handle(java.util.function.BiFunction); - method public java.util.concurrent.CompletableFuture handleAsync(java.util.function.BiFunction); - method public java.util.concurrent.CompletableFuture handleAsync(java.util.function.BiFunction, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture handle(java.util.function.BiFunction); + method public java.util.concurrent.CompletableFuture handleAsync(java.util.function.BiFunction); + method public java.util.concurrent.CompletableFuture handleAsync(java.util.function.BiFunction, java.util.concurrent.Executor); method public boolean isCancelled(); method public boolean isCompletedExceptionally(); method public boolean isDone(); @@ -59385,23 +59385,23 @@ package java.util.concurrent { method public java.util.concurrent.CompletableFuture runAfterEitherAsync(java.util.concurrent.CompletionStage, java.lang.Runnable, java.util.concurrent.Executor); method public static java.util.concurrent.CompletableFuture runAsync(java.lang.Runnable); method public static java.util.concurrent.CompletableFuture runAsync(java.lang.Runnable, java.util.concurrent.Executor); - method public static java.util.concurrent.CompletableFuture supplyAsync(java.util.function.Supplier); - method public static java.util.concurrent.CompletableFuture supplyAsync(java.util.function.Supplier, java.util.concurrent.Executor); + method public static java.util.concurrent.CompletableFuture supplyAsync(java.util.function.Supplier); + method public static java.util.concurrent.CompletableFuture supplyAsync(java.util.function.Supplier, java.util.concurrent.Executor); method public java.util.concurrent.CompletableFuture thenAccept(java.util.function.Consumer); method public java.util.concurrent.CompletableFuture thenAcceptAsync(java.util.function.Consumer); method public java.util.concurrent.CompletableFuture thenAcceptAsync(java.util.function.Consumer, java.util.concurrent.Executor); - method public java.util.concurrent.CompletableFuture thenAcceptBoth(java.util.concurrent.CompletionStage, java.util.function.BiConsumer); - method public java.util.concurrent.CompletableFuture thenAcceptBothAsync(java.util.concurrent.CompletionStage, java.util.function.BiConsumer); - method public java.util.concurrent.CompletableFuture thenAcceptBothAsync(java.util.concurrent.CompletionStage, java.util.function.BiConsumer, java.util.concurrent.Executor); - method public java.util.concurrent.CompletableFuture thenApply(java.util.function.Function); - method public java.util.concurrent.CompletableFuture thenApplyAsync(java.util.function.Function); - method public java.util.concurrent.CompletableFuture thenApplyAsync(java.util.function.Function, java.util.concurrent.Executor); - method public java.util.concurrent.CompletableFuture thenCombine(java.util.concurrent.CompletionStage, java.util.function.BiFunction); - method public java.util.concurrent.CompletableFuture thenCombineAsync(java.util.concurrent.CompletionStage, java.util.function.BiFunction); - method public java.util.concurrent.CompletableFuture thenCombineAsync(java.util.concurrent.CompletionStage, java.util.function.BiFunction, java.util.concurrent.Executor); - method public java.util.concurrent.CompletableFuture thenCompose(java.util.function.Function>); - method public java.util.concurrent.CompletableFuture thenComposeAsync(java.util.function.Function>); - method public java.util.concurrent.CompletableFuture thenComposeAsync(java.util.function.Function>, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture thenAcceptBoth(java.util.concurrent.CompletionStage, java.util.function.BiConsumer); + method public java.util.concurrent.CompletableFuture thenAcceptBothAsync(java.util.concurrent.CompletionStage, java.util.function.BiConsumer); + method public java.util.concurrent.CompletableFuture thenAcceptBothAsync(java.util.concurrent.CompletionStage, java.util.function.BiConsumer, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture thenApply(java.util.function.Function); + method public java.util.concurrent.CompletableFuture thenApplyAsync(java.util.function.Function); + method public java.util.concurrent.CompletableFuture thenApplyAsync(java.util.function.Function, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture thenCombine(java.util.concurrent.CompletionStage, java.util.function.BiFunction); + method public java.util.concurrent.CompletableFuture thenCombineAsync(java.util.concurrent.CompletionStage, java.util.function.BiFunction); + method public java.util.concurrent.CompletableFuture thenCombineAsync(java.util.concurrent.CompletionStage, java.util.function.BiFunction, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture thenCompose(java.util.function.Function>); + method public java.util.concurrent.CompletableFuture thenComposeAsync(java.util.function.Function>); + method public java.util.concurrent.CompletableFuture thenComposeAsync(java.util.function.Function>, java.util.concurrent.Executor); method public java.util.concurrent.CompletableFuture thenRun(java.lang.Runnable); method public java.util.concurrent.CompletableFuture thenRunAsync(java.lang.Runnable); method public java.util.concurrent.CompletableFuture thenRunAsync(java.lang.Runnable, java.util.concurrent.Executor); @@ -59421,7 +59421,7 @@ package java.util.concurrent { ctor public CompletionException(java.lang.Throwable); } - public abstract interface CompletionService { + public abstract interface CompletionService { method public abstract java.util.concurrent.Future poll(); method public abstract java.util.concurrent.Future poll(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; method public abstract java.util.concurrent.Future submit(java.util.concurrent.Callable); @@ -59429,17 +59429,17 @@ package java.util.concurrent { method public abstract java.util.concurrent.Future take() throws java.lang.InterruptedException; } - public abstract interface CompletionStage { + public abstract interface CompletionStage { method public abstract java.util.concurrent.CompletionStage acceptEither(java.util.concurrent.CompletionStage, java.util.function.Consumer); method public abstract java.util.concurrent.CompletionStage acceptEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Consumer); method public abstract java.util.concurrent.CompletionStage acceptEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Consumer, java.util.concurrent.Executor); - method public abstract java.util.concurrent.CompletionStage applyToEither(java.util.concurrent.CompletionStage, java.util.function.Function); - method public abstract java.util.concurrent.CompletionStage applyToEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Function); - method public abstract java.util.concurrent.CompletionStage applyToEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Function, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage applyToEither(java.util.concurrent.CompletionStage, java.util.function.Function); + method public abstract java.util.concurrent.CompletionStage applyToEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Function); + method public abstract java.util.concurrent.CompletionStage applyToEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Function, java.util.concurrent.Executor); method public abstract java.util.concurrent.CompletionStage exceptionally(java.util.function.Function); - method public abstract java.util.concurrent.CompletionStage handle(java.util.function.BiFunction); - method public abstract java.util.concurrent.CompletionStage handleAsync(java.util.function.BiFunction); - method public abstract java.util.concurrent.CompletionStage handleAsync(java.util.function.BiFunction, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage handle(java.util.function.BiFunction); + method public abstract java.util.concurrent.CompletionStage handleAsync(java.util.function.BiFunction); + method public abstract java.util.concurrent.CompletionStage handleAsync(java.util.function.BiFunction, java.util.concurrent.Executor); method public abstract java.util.concurrent.CompletionStage runAfterBoth(java.util.concurrent.CompletionStage, java.lang.Runnable); method public abstract java.util.concurrent.CompletionStage runAfterBothAsync(java.util.concurrent.CompletionStage, java.lang.Runnable); method public abstract java.util.concurrent.CompletionStage runAfterBothAsync(java.util.concurrent.CompletionStage, java.lang.Runnable, java.util.concurrent.Executor); @@ -59449,18 +59449,18 @@ package java.util.concurrent { method public abstract java.util.concurrent.CompletionStage thenAccept(java.util.function.Consumer); method public abstract java.util.concurrent.CompletionStage thenAcceptAsync(java.util.function.Consumer); method public abstract java.util.concurrent.CompletionStage thenAcceptAsync(java.util.function.Consumer, java.util.concurrent.Executor); - method public abstract java.util.concurrent.CompletionStage thenAcceptBoth(java.util.concurrent.CompletionStage, java.util.function.BiConsumer); - method public abstract java.util.concurrent.CompletionStage thenAcceptBothAsync(java.util.concurrent.CompletionStage, java.util.function.BiConsumer); - method public abstract java.util.concurrent.CompletionStage thenAcceptBothAsync(java.util.concurrent.CompletionStage, java.util.function.BiConsumer, java.util.concurrent.Executor); - method public abstract java.util.concurrent.CompletionStage thenApply(java.util.function.Function); - method public abstract java.util.concurrent.CompletionStage thenApplyAsync(java.util.function.Function); - method public abstract java.util.concurrent.CompletionStage thenApplyAsync(java.util.function.Function, java.util.concurrent.Executor); - method public abstract java.util.concurrent.CompletionStage thenCombine(java.util.concurrent.CompletionStage, java.util.function.BiFunction); - method public abstract java.util.concurrent.CompletionStage thenCombineAsync(java.util.concurrent.CompletionStage, java.util.function.BiFunction); - method public abstract java.util.concurrent.CompletionStage thenCombineAsync(java.util.concurrent.CompletionStage, java.util.function.BiFunction, java.util.concurrent.Executor); - method public abstract java.util.concurrent.CompletionStage thenCompose(java.util.function.Function>); - method public abstract java.util.concurrent.CompletionStage thenComposeAsync(java.util.function.Function>); - method public abstract java.util.concurrent.CompletionStage thenComposeAsync(java.util.function.Function>, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage thenAcceptBoth(java.util.concurrent.CompletionStage, java.util.function.BiConsumer); + method public abstract java.util.concurrent.CompletionStage thenAcceptBothAsync(java.util.concurrent.CompletionStage, java.util.function.BiConsumer); + method public abstract java.util.concurrent.CompletionStage thenAcceptBothAsync(java.util.concurrent.CompletionStage, java.util.function.BiConsumer, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage thenApply(java.util.function.Function); + method public abstract java.util.concurrent.CompletionStage thenApplyAsync(java.util.function.Function); + method public abstract java.util.concurrent.CompletionStage thenApplyAsync(java.util.function.Function, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage thenCombine(java.util.concurrent.CompletionStage, java.util.function.BiFunction); + method public abstract java.util.concurrent.CompletionStage thenCombineAsync(java.util.concurrent.CompletionStage, java.util.function.BiFunction); + method public abstract java.util.concurrent.CompletionStage thenCombineAsync(java.util.concurrent.CompletionStage, java.util.function.BiFunction, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage thenCompose(java.util.function.Function>); + method public abstract java.util.concurrent.CompletionStage thenComposeAsync(java.util.function.Function>); + method public abstract java.util.concurrent.CompletionStage thenComposeAsync(java.util.function.Function>, java.util.concurrent.Executor); method public abstract java.util.concurrent.CompletionStage thenRun(java.lang.Runnable); method public abstract java.util.concurrent.CompletionStage thenRunAsync(java.lang.Runnable); method public abstract java.util.concurrent.CompletionStage thenRunAsync(java.lang.Runnable, java.util.concurrent.Executor); @@ -59470,7 +59470,7 @@ package java.util.concurrent { method public abstract java.util.concurrent.CompletionStage whenCompleteAsync(java.util.function.BiConsumer, java.util.concurrent.Executor); } - public class ConcurrentHashMap extends java.util.AbstractMap implements java.util.concurrent.ConcurrentMap java.io.Serializable { + public class ConcurrentHashMap extends java.util.AbstractMap implements java.util.concurrent.ConcurrentMap java.io.Serializable { ctor public ConcurrentHashMap(); ctor public ConcurrentHashMap(int); ctor public ConcurrentHashMap(java.util.Map); @@ -59484,29 +59484,29 @@ package java.util.concurrent { method public java.util.Set> entrySet(); method public void forEach(java.util.function.BiConsumer); method public void forEach(long, java.util.function.BiConsumer); - method public void forEach(long, java.util.function.BiFunction, java.util.function.Consumer); + method public void forEach(long, java.util.function.BiFunction, java.util.function.Consumer); method public void forEachEntry(long, java.util.function.Consumer>); - method public void forEachEntry(long, java.util.function.Function, ? extends U>, java.util.function.Consumer); + method public void forEachEntry(long, java.util.function.Function, ? extends U>, java.util.function.Consumer); method public void forEachKey(long, java.util.function.Consumer); - method public void forEachKey(long, java.util.function.Function, java.util.function.Consumer); + method public void forEachKey(long, java.util.function.Function, java.util.function.Consumer); method public void forEachValue(long, java.util.function.Consumer); - method public void forEachValue(long, java.util.function.Function, java.util.function.Consumer); + method public void forEachValue(long, java.util.function.Function, java.util.function.Consumer); method public V getOrDefault(java.lang.Object, V); method public java.util.concurrent.ConcurrentHashMap.KeySetView keySet(V); method public java.util.Enumeration keys(); method public long mappingCount(); method public V merge(K, V, java.util.function.BiFunction); - method public static java.util.concurrent.ConcurrentHashMap.KeySetView newKeySet(); - method public static java.util.concurrent.ConcurrentHashMap.KeySetView newKeySet(int); + method public static java.util.concurrent.ConcurrentHashMap.KeySetView newKeySet(); + method public static java.util.concurrent.ConcurrentHashMap.KeySetView newKeySet(int); method public V putIfAbsent(K, V); - method public U reduce(long, java.util.function.BiFunction, java.util.function.BiFunction); + method public U reduce(long, java.util.function.BiFunction, java.util.function.BiFunction); method public java.util.Map.Entry reduceEntries(long, java.util.function.BiFunction, java.util.Map.Entry, ? extends java.util.Map.Entry>); - method public U reduceEntries(long, java.util.function.Function, ? extends U>, java.util.function.BiFunction); + method public U reduceEntries(long, java.util.function.Function, ? extends U>, java.util.function.BiFunction); method public double reduceEntriesToDouble(long, java.util.function.ToDoubleFunction>, double, java.util.function.DoubleBinaryOperator); method public int reduceEntriesToInt(long, java.util.function.ToIntFunction>, int, java.util.function.IntBinaryOperator); method public long reduceEntriesToLong(long, java.util.function.ToLongFunction>, long, java.util.function.LongBinaryOperator); method public K reduceKeys(long, java.util.function.BiFunction); - method public U reduceKeys(long, java.util.function.Function, java.util.function.BiFunction); + method public U reduceKeys(long, java.util.function.Function, java.util.function.BiFunction); method public double reduceKeysToDouble(long, java.util.function.ToDoubleFunction, double, java.util.function.DoubleBinaryOperator); method public int reduceKeysToInt(long, java.util.function.ToIntFunction, int, java.util.function.IntBinaryOperator); method public long reduceKeysToLong(long, java.util.function.ToLongFunction, long, java.util.function.LongBinaryOperator); @@ -59514,7 +59514,7 @@ package java.util.concurrent { method public int reduceToInt(long, java.util.function.ToIntBiFunction, int, java.util.function.IntBinaryOperator); method public long reduceToLong(long, java.util.function.ToLongBiFunction, long, java.util.function.LongBinaryOperator); method public V reduceValues(long, java.util.function.BiFunction); - method public U reduceValues(long, java.util.function.Function, java.util.function.BiFunction); + method public U reduceValues(long, java.util.function.Function, java.util.function.BiFunction); method public double reduceValuesToDouble(long, java.util.function.ToDoubleFunction, double, java.util.function.DoubleBinaryOperator); method public int reduceValuesToInt(long, java.util.function.ToIntFunction, int, java.util.function.IntBinaryOperator); method public long reduceValuesToLong(long, java.util.function.ToLongFunction, long, java.util.function.LongBinaryOperator); @@ -59522,13 +59522,13 @@ package java.util.concurrent { method public boolean replace(K, V, V); method public V replace(K, V); method public void replaceAll(java.util.function.BiFunction); - method public U search(long, java.util.function.BiFunction); - method public U searchEntries(long, java.util.function.Function, ? extends U>); - method public U searchKeys(long, java.util.function.Function); - method public U searchValues(long, java.util.function.Function); + method public U search(long, java.util.function.BiFunction); + method public U searchEntries(long, java.util.function.Function, ? extends U>); + method public U searchKeys(long, java.util.function.Function); + method public U searchValues(long, java.util.function.Function); } - static abstract class ConcurrentHashMap.CollectionView implements java.util.Collection java.io.Serializable { + static abstract class ConcurrentHashMap.CollectionView implements java.util.Collection java.io.Serializable { method public final void clear(); method public abstract boolean contains(java.lang.Object); method public final boolean containsAll(java.util.Collection); @@ -59540,11 +59540,11 @@ package java.util.concurrent { method public final boolean retainAll(java.util.Collection); method public final int size(); method public final java.lang.Object[] toArray(); - method public final T[] toArray(T[]); + method public final T[] toArray(T[]); method public final java.lang.String toString(); } - public static class ConcurrentHashMap.KeySetView extends java.util.concurrent.ConcurrentHashMap.CollectionView implements java.io.Serializable java.util.Set { + public static class ConcurrentHashMap.KeySetView extends java.util.concurrent.ConcurrentHashMap.CollectionView implements java.io.Serializable java.util.Set { method public boolean add(K); method public boolean addAll(java.util.Collection); method public boolean contains(java.lang.Object); @@ -59555,7 +59555,7 @@ package java.util.concurrent { method public java.util.Spliterator spliterator(); } - public class ConcurrentLinkedDeque extends java.util.AbstractCollection implements java.util.Deque java.io.Serializable { + public class ConcurrentLinkedDeque extends java.util.AbstractCollection implements java.util.Deque java.io.Serializable { ctor public ConcurrentLinkedDeque(); ctor public ConcurrentLinkedDeque(java.util.Collection); method public void addFirst(E); @@ -59585,7 +59585,7 @@ package java.util.concurrent { method public java.util.Spliterator spliterator(); } - public class ConcurrentLinkedQueue extends java.util.AbstractQueue implements java.util.Queue java.io.Serializable { + public class ConcurrentLinkedQueue extends java.util.AbstractQueue implements java.util.Queue java.io.Serializable { ctor public ConcurrentLinkedQueue(); ctor public ConcurrentLinkedQueue(java.util.Collection); method public java.util.Iterator iterator(); @@ -59596,14 +59596,14 @@ package java.util.concurrent { method public java.util.Spliterator spliterator(); } - public abstract interface ConcurrentMap implements java.util.Map { + public abstract interface ConcurrentMap implements java.util.Map { method public abstract V putIfAbsent(K, V); method public abstract boolean remove(java.lang.Object, java.lang.Object); method public abstract boolean replace(K, V, V); method public abstract V replace(K, V); } - public abstract interface ConcurrentNavigableMap implements java.util.concurrent.ConcurrentMap java.util.NavigableMap { + public abstract interface ConcurrentNavigableMap implements java.util.concurrent.ConcurrentMap java.util.NavigableMap { method public abstract java.util.NavigableSet descendingKeySet(); method public abstract java.util.concurrent.ConcurrentNavigableMap descendingMap(); method public abstract java.util.concurrent.ConcurrentNavigableMap headMap(K, boolean); @@ -59616,7 +59616,7 @@ package java.util.concurrent { method public abstract java.util.concurrent.ConcurrentNavigableMap tailMap(K); } - public class ConcurrentSkipListMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.concurrent.ConcurrentNavigableMap java.io.Serializable { + public class ConcurrentSkipListMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.concurrent.ConcurrentNavigableMap java.io.Serializable { ctor public ConcurrentSkipListMap(); ctor public ConcurrentSkipListMap(java.util.Comparator); ctor public ConcurrentSkipListMap(java.util.Map); @@ -59660,7 +59660,7 @@ package java.util.concurrent { method public java.util.concurrent.ConcurrentNavigableMap tailMap(K); } - public class ConcurrentSkipListSet extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable { + public class ConcurrentSkipListSet extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable { ctor public ConcurrentSkipListSet(); ctor public ConcurrentSkipListSet(java.util.Comparator); ctor public ConcurrentSkipListSet(java.util.Collection); @@ -59688,7 +59688,7 @@ package java.util.concurrent { method public java.util.NavigableSet tailSet(E); } - public class CopyOnWriteArrayList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { + public class CopyOnWriteArrayList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { ctor public CopyOnWriteArrayList(); ctor public CopyOnWriteArrayList(java.util.Collection); ctor public CopyOnWriteArrayList(E[]); @@ -59720,10 +59720,10 @@ package java.util.concurrent { method public int size(); method public java.util.List subList(int, int); method public java.lang.Object[] toArray(); - method public T[] toArray(T[]); + method public T[] toArray(T[]); } - public class CopyOnWriteArraySet extends java.util.AbstractSet implements java.io.Serializable { + public class CopyOnWriteArraySet extends java.util.AbstractSet implements java.io.Serializable { ctor public CopyOnWriteArraySet(); ctor public CopyOnWriteArraySet(java.util.Collection); method public void forEach(java.util.function.Consumer); @@ -59741,7 +59741,7 @@ package java.util.concurrent { method public long getCount(); } - public abstract class CountedCompleter extends java.util.concurrent.ForkJoinTask { + public abstract class CountedCompleter extends java.util.concurrent.ForkJoinTask { ctor protected CountedCompleter(java.util.concurrent.CountedCompleter, int); ctor protected CountedCompleter(java.util.concurrent.CountedCompleter); ctor protected CountedCompleter(); @@ -59778,7 +59778,7 @@ package java.util.concurrent { method public void reset(); } - public class DelayQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue { + public class DelayQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue { ctor public DelayQueue(); ctor public DelayQueue(java.util.Collection); method public int drainTo(java.util.Collection); @@ -59799,7 +59799,7 @@ package java.util.concurrent { method public abstract long getDelay(java.util.concurrent.TimeUnit); } - public class Exchanger { + public class Exchanger { ctor public Exchanger(); method public V exchange(V) throws java.lang.InterruptedException; method public V exchange(V, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException, java.util.concurrent.TimeoutException; @@ -59816,7 +59816,7 @@ package java.util.concurrent { method public abstract void execute(java.lang.Runnable); } - public class ExecutorCompletionService implements java.util.concurrent.CompletionService { + public class ExecutorCompletionService implements java.util.concurrent.CompletionService { ctor public ExecutorCompletionService(java.util.concurrent.Executor); ctor public ExecutorCompletionService(java.util.concurrent.Executor, java.util.concurrent.BlockingQueue>); method public java.util.concurrent.Future poll(); @@ -59828,21 +59828,21 @@ package java.util.concurrent { public abstract interface ExecutorService implements java.util.concurrent.Executor { method public abstract boolean awaitTermination(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; - method public abstract java.util.List> invokeAll(java.util.Collection>) throws java.lang.InterruptedException; - method public abstract java.util.List> invokeAll(java.util.Collection>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; - method public abstract T invokeAny(java.util.Collection>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; - method public abstract T invokeAny(java.util.Collection>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; + method public abstract java.util.List> invokeAll(java.util.Collection>) throws java.lang.InterruptedException; + method public abstract java.util.List> invokeAll(java.util.Collection>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; + method public abstract T invokeAny(java.util.Collection>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; + method public abstract T invokeAny(java.util.Collection>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; method public abstract boolean isShutdown(); method public abstract boolean isTerminated(); method public abstract void shutdown(); method public abstract java.util.List shutdownNow(); - method public abstract java.util.concurrent.Future submit(java.util.concurrent.Callable); - method public abstract java.util.concurrent.Future submit(java.lang.Runnable, T); + method public abstract java.util.concurrent.Future submit(java.util.concurrent.Callable); + method public abstract java.util.concurrent.Future submit(java.lang.Runnable, T); method public abstract java.util.concurrent.Future submit(java.lang.Runnable); } public class Executors { - method public static java.util.concurrent.Callable callable(java.lang.Runnable, T); + method public static java.util.concurrent.Callable callable(java.lang.Runnable, T); method public static java.util.concurrent.Callable callable(java.lang.Runnable); method public static java.util.concurrent.Callable callable(java.security.PrivilegedAction); method public static java.util.concurrent.Callable callable(java.security.PrivilegedExceptionAction); @@ -59859,8 +59859,8 @@ package java.util.concurrent { method public static java.util.concurrent.ScheduledExecutorService newSingleThreadScheduledExecutor(java.util.concurrent.ThreadFactory); method public static java.util.concurrent.ExecutorService newWorkStealingPool(int); method public static java.util.concurrent.ExecutorService newWorkStealingPool(); - method public static java.util.concurrent.Callable privilegedCallable(java.util.concurrent.Callable); - method public static java.util.concurrent.Callable privilegedCallableUsingCurrentClassLoader(java.util.concurrent.Callable); + method public static java.util.concurrent.Callable privilegedCallable(java.util.concurrent.Callable); + method public static java.util.concurrent.Callable privilegedCallableUsingCurrentClassLoader(java.util.concurrent.Callable); method public static java.util.concurrent.ThreadFactory privilegedThreadFactory(); method public static java.util.concurrent.ExecutorService unconfigurableExecutorService(java.util.concurrent.ExecutorService); method public static java.util.concurrent.ScheduledExecutorService unconfigurableScheduledExecutorService(java.util.concurrent.ScheduledExecutorService); @@ -59888,7 +59888,7 @@ package java.util.concurrent { method public long getStealCount(); method public java.lang.Thread.UncaughtExceptionHandler getUncaughtExceptionHandler(); method public boolean hasQueuedSubmissions(); - method public T invoke(java.util.concurrent.ForkJoinTask); + method public T invoke(java.util.concurrent.ForkJoinTask); method public boolean isQuiescent(); method public boolean isShutdown(); method public boolean isTerminated(); @@ -59897,7 +59897,7 @@ package java.util.concurrent { method protected java.util.concurrent.ForkJoinTask pollSubmission(); method public void shutdown(); method public java.util.List shutdownNow(); - method public java.util.concurrent.ForkJoinTask submit(java.util.concurrent.ForkJoinTask); + method public java.util.concurrent.ForkJoinTask submit(java.util.concurrent.ForkJoinTask); field public static final java.util.concurrent.ForkJoinPool.ForkJoinWorkerThreadFactory defaultForkJoinWorkerThreadFactory; } @@ -59910,11 +59910,11 @@ package java.util.concurrent { method public abstract boolean isReleasable(); } - public abstract class ForkJoinTask implements java.util.concurrent.Future java.io.Serializable { + public abstract class ForkJoinTask implements java.util.concurrent.Future java.io.Serializable { ctor public ForkJoinTask(); method public static java.util.concurrent.ForkJoinTask adapt(java.lang.Runnable); - method public static java.util.concurrent.ForkJoinTask adapt(java.lang.Runnable, T); - method public static java.util.concurrent.ForkJoinTask adapt(java.util.concurrent.Callable); + method public static java.util.concurrent.ForkJoinTask adapt(java.lang.Runnable, T); + method public static java.util.concurrent.ForkJoinTask adapt(java.util.concurrent.Callable); method public boolean cancel(boolean); method public final boolean compareAndSetForkJoinTaskTag(short, short); method public void complete(V); @@ -59934,7 +59934,7 @@ package java.util.concurrent { method public final V invoke(); method public static void invokeAll(java.util.concurrent.ForkJoinTask, java.util.concurrent.ForkJoinTask); method public static void invokeAll(java.util.concurrent.ForkJoinTask...); - method public static java.util.Collection invokeAll(java.util.Collection); + method public static > java.util.Collection invokeAll(java.util.Collection); method public final boolean isCancelled(); method public final boolean isCompletedAbnormally(); method public final boolean isCompletedNormally(); @@ -59960,7 +59960,7 @@ package java.util.concurrent { method protected void onTermination(java.lang.Throwable); } - public abstract interface Future { + public abstract interface Future { method public abstract boolean cancel(boolean); method public abstract V get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; method public abstract V get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; @@ -59968,7 +59968,7 @@ package java.util.concurrent { method public abstract boolean isDone(); } - public class FutureTask implements java.util.concurrent.RunnableFuture { + public class FutureTask implements java.util.concurrent.RunnableFuture { ctor public FutureTask(java.util.concurrent.Callable); ctor public FutureTask(java.lang.Runnable, V); method public boolean cancel(boolean); @@ -59983,7 +59983,7 @@ package java.util.concurrent { method protected void setException(java.lang.Throwable); } - public class LinkedBlockingDeque extends java.util.AbstractQueue implements java.util.concurrent.BlockingDeque java.io.Serializable { + public class LinkedBlockingDeque extends java.util.AbstractQueue implements java.util.concurrent.BlockingDeque java.io.Serializable { ctor public LinkedBlockingDeque(); ctor public LinkedBlockingDeque(int); ctor public LinkedBlockingDeque(java.util.Collection); @@ -60027,7 +60027,7 @@ package java.util.concurrent { method public E takeLast() throws java.lang.InterruptedException; } - public class LinkedBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { + public class LinkedBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { ctor public LinkedBlockingQueue(); ctor public LinkedBlockingQueue(int); ctor public LinkedBlockingQueue(java.util.Collection); @@ -60046,7 +60046,7 @@ package java.util.concurrent { method public E take() throws java.lang.InterruptedException; } - public class LinkedTransferQueue extends java.util.AbstractQueue implements java.io.Serializable java.util.concurrent.TransferQueue { + public class LinkedTransferQueue extends java.util.AbstractQueue implements java.io.Serializable java.util.concurrent.TransferQueue { ctor public LinkedTransferQueue(); ctor public LinkedTransferQueue(java.util.Collection); method public int drainTo(java.util.Collection); @@ -60093,7 +60093,7 @@ package java.util.concurrent { method public int register(); } - public class PriorityBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { + public class PriorityBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { ctor public PriorityBlockingQueue(); ctor public PriorityBlockingQueue(int); ctor public PriorityBlockingQueue(int, java.util.Comparator); @@ -60122,7 +60122,7 @@ package java.util.concurrent { method protected final void setRawResult(java.lang.Void); } - public abstract class RecursiveTask extends java.util.concurrent.ForkJoinTask { + public abstract class RecursiveTask extends java.util.concurrent.ForkJoinTask { ctor public RecursiveTask(); method protected abstract V compute(); method protected final boolean exec(); @@ -60141,22 +60141,22 @@ package java.util.concurrent { method public abstract void rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor); } - public abstract interface RunnableFuture implements java.util.concurrent.Future java.lang.Runnable { + public abstract interface RunnableFuture implements java.util.concurrent.Future java.lang.Runnable { method public abstract void run(); } - public abstract interface RunnableScheduledFuture implements java.util.concurrent.RunnableFuture java.util.concurrent.ScheduledFuture { + public abstract interface RunnableScheduledFuture implements java.util.concurrent.RunnableFuture java.util.concurrent.ScheduledFuture { method public abstract boolean isPeriodic(); } public abstract interface ScheduledExecutorService implements java.util.concurrent.ExecutorService { method public abstract java.util.concurrent.ScheduledFuture schedule(java.lang.Runnable, long, java.util.concurrent.TimeUnit); - method public abstract java.util.concurrent.ScheduledFuture schedule(java.util.concurrent.Callable, long, java.util.concurrent.TimeUnit); + method public abstract java.util.concurrent.ScheduledFuture schedule(java.util.concurrent.Callable, long, java.util.concurrent.TimeUnit); method public abstract java.util.concurrent.ScheduledFuture scheduleAtFixedRate(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit); method public abstract java.util.concurrent.ScheduledFuture scheduleWithFixedDelay(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit); } - public abstract interface ScheduledFuture implements java.util.concurrent.Delayed java.util.concurrent.Future { + public abstract interface ScheduledFuture implements java.util.concurrent.Delayed java.util.concurrent.Future { } public class ScheduledThreadPoolExecutor extends java.util.concurrent.ThreadPoolExecutor implements java.util.concurrent.ScheduledExecutorService { @@ -60164,13 +60164,13 @@ package java.util.concurrent { ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.ThreadFactory); ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.RejectedExecutionHandler); ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.ThreadFactory, java.util.concurrent.RejectedExecutionHandler); - method protected java.util.concurrent.RunnableScheduledFuture decorateTask(java.lang.Runnable, java.util.concurrent.RunnableScheduledFuture); - method protected java.util.concurrent.RunnableScheduledFuture decorateTask(java.util.concurrent.Callable, java.util.concurrent.RunnableScheduledFuture); + method protected java.util.concurrent.RunnableScheduledFuture decorateTask(java.lang.Runnable, java.util.concurrent.RunnableScheduledFuture); + method protected java.util.concurrent.RunnableScheduledFuture decorateTask(java.util.concurrent.Callable, java.util.concurrent.RunnableScheduledFuture); method public boolean getContinueExistingPeriodicTasksAfterShutdownPolicy(); method public boolean getExecuteExistingDelayedTasksAfterShutdownPolicy(); method public boolean getRemoveOnCancelPolicy(); method public java.util.concurrent.ScheduledFuture schedule(java.lang.Runnable, long, java.util.concurrent.TimeUnit); - method public java.util.concurrent.ScheduledFuture schedule(java.util.concurrent.Callable, long, java.util.concurrent.TimeUnit); + method public java.util.concurrent.ScheduledFuture schedule(java.util.concurrent.Callable, long, java.util.concurrent.TimeUnit); method public java.util.concurrent.ScheduledFuture scheduleAtFixedRate(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit); method public java.util.concurrent.ScheduledFuture scheduleWithFixedDelay(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit); method public void setContinueExistingPeriodicTasksAfterShutdownPolicy(boolean); @@ -60200,7 +60200,7 @@ package java.util.concurrent { method public boolean tryAcquire(int, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; } - public class SynchronousQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { + public class SynchronousQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { ctor public SynchronousQueue(); ctor public SynchronousQueue(boolean); method public int drainTo(java.util.Collection); @@ -60318,7 +60318,7 @@ package java.util.concurrent { ctor public TimeoutException(java.lang.String); } - public abstract interface TransferQueue implements java.util.concurrent.BlockingQueue { + public abstract interface TransferQueue implements java.util.concurrent.BlockingQueue { method public abstract int getWaitingConsumerCount(); method public abstract boolean hasWaitingConsumer(); method public abstract void transfer(E) throws java.lang.InterruptedException; @@ -60388,7 +60388,7 @@ package java.util.concurrent.atomic { method public final boolean weakCompareAndSet(int, int, int); } - public abstract class AtomicIntegerFieldUpdater { + public abstract class AtomicIntegerFieldUpdater { ctor protected AtomicIntegerFieldUpdater(); method public final int accumulateAndGet(T, int, java.util.function.IntBinaryOperator); method public int addAndGet(T, int); @@ -60403,7 +60403,7 @@ package java.util.concurrent.atomic { method public final int getAndUpdate(T, java.util.function.IntUnaryOperator); method public int incrementAndGet(T); method public abstract void lazySet(T, int); - method public static java.util.concurrent.atomic.AtomicIntegerFieldUpdater newUpdater(java.lang.Class, java.lang.String); + method public static java.util.concurrent.atomic.AtomicIntegerFieldUpdater newUpdater(java.lang.Class, java.lang.String); method public abstract void set(T, int); method public final int updateAndGet(T, java.util.function.IntUnaryOperator); method public abstract boolean weakCompareAndSet(T, int, int); @@ -60456,7 +60456,7 @@ package java.util.concurrent.atomic { method public final boolean weakCompareAndSet(int, long, long); } - public abstract class AtomicLongFieldUpdater { + public abstract class AtomicLongFieldUpdater { ctor protected AtomicLongFieldUpdater(); method public final long accumulateAndGet(T, long, java.util.function.LongBinaryOperator); method public long addAndGet(T, long); @@ -60471,13 +60471,13 @@ package java.util.concurrent.atomic { method public final long getAndUpdate(T, java.util.function.LongUnaryOperator); method public long incrementAndGet(T); method public abstract void lazySet(T, long); - method public static java.util.concurrent.atomic.AtomicLongFieldUpdater newUpdater(java.lang.Class, java.lang.String); + method public static java.util.concurrent.atomic.AtomicLongFieldUpdater newUpdater(java.lang.Class, java.lang.String); method public abstract void set(T, long); method public final long updateAndGet(T, java.util.function.LongUnaryOperator); method public abstract boolean weakCompareAndSet(T, long, long); } - public class AtomicMarkableReference { + public class AtomicMarkableReference { ctor public AtomicMarkableReference(V, boolean); method public boolean attemptMark(V, boolean); method public boolean compareAndSet(V, V, boolean, boolean); @@ -60488,7 +60488,7 @@ package java.util.concurrent.atomic { method public boolean weakCompareAndSet(V, V, boolean, boolean); } - public class AtomicReference implements java.io.Serializable { + public class AtomicReference implements java.io.Serializable { ctor public AtomicReference(V); ctor public AtomicReference(); method public final V accumulateAndGet(V, java.util.function.BinaryOperator); @@ -60503,7 +60503,7 @@ package java.util.concurrent.atomic { method public final boolean weakCompareAndSet(V, V); } - public class AtomicReferenceArray implements java.io.Serializable { + public class AtomicReferenceArray implements java.io.Serializable { ctor public AtomicReferenceArray(int); ctor public AtomicReferenceArray(E[]); method public final E accumulateAndGet(int, E, java.util.function.BinaryOperator); @@ -60519,7 +60519,7 @@ package java.util.concurrent.atomic { method public final boolean weakCompareAndSet(int, E, E); } - public abstract class AtomicReferenceFieldUpdater { + public abstract class AtomicReferenceFieldUpdater { ctor protected AtomicReferenceFieldUpdater(); method public final V accumulateAndGet(T, V, java.util.function.BinaryOperator); method public abstract boolean compareAndSet(T, V, V); @@ -60528,13 +60528,13 @@ package java.util.concurrent.atomic { method public V getAndSet(T, V); method public final V getAndUpdate(T, java.util.function.UnaryOperator); method public abstract void lazySet(T, V); - method public static java.util.concurrent.atomic.AtomicReferenceFieldUpdater newUpdater(java.lang.Class, java.lang.Class, java.lang.String); + method public static java.util.concurrent.atomic.AtomicReferenceFieldUpdater newUpdater(java.lang.Class, java.lang.Class, java.lang.String); method public abstract void set(T, V); method public final V updateAndGet(T, java.util.function.UnaryOperator); method public abstract boolean weakCompareAndSet(T, V, V); } - public class AtomicStampedReference { + public class AtomicStampedReference { ctor public AtomicStampedReference(V, int); method public boolean attemptStamp(V, int); method public boolean compareAndSet(V, V, int, int); @@ -60837,33 +60837,33 @@ package java.util.concurrent.locks { package java.util.function { - public abstract interface BiConsumer { + public abstract interface BiConsumer { method public abstract void accept(T, U); method public default java.util.function.BiConsumer andThen(java.util.function.BiConsumer); } - public abstract interface BiFunction { - method public default java.util.function.BiFunction andThen(java.util.function.Function); + public abstract interface BiFunction { + method public default java.util.function.BiFunction andThen(java.util.function.Function); method public abstract R apply(T, U); } - public abstract interface BiPredicate { + public abstract interface BiPredicate { method public default java.util.function.BiPredicate and(java.util.function.BiPredicate); method public default java.util.function.BiPredicate negate(); method public default java.util.function.BiPredicate or(java.util.function.BiPredicate); method public abstract boolean test(T, U); } - public abstract interface BinaryOperator implements java.util.function.BiFunction { - method public static java.util.function.BinaryOperator maxBy(java.util.Comparator); - method public static java.util.function.BinaryOperator minBy(java.util.Comparator); + public abstract interface BinaryOperator implements java.util.function.BiFunction { + method public static java.util.function.BinaryOperator maxBy(java.util.Comparator); + method public static java.util.function.BinaryOperator minBy(java.util.Comparator); } public abstract interface BooleanSupplier { method public abstract boolean getAsBoolean(); } - public abstract interface Consumer { + public abstract interface Consumer { method public abstract void accept(T); method public default java.util.function.Consumer andThen(java.util.function.Consumer); } @@ -60877,7 +60877,7 @@ package java.util.function { method public default java.util.function.DoubleConsumer andThen(java.util.function.DoubleConsumer); } - public abstract interface DoubleFunction { + public abstract interface DoubleFunction { method public abstract R apply(double); } @@ -60907,11 +60907,11 @@ package java.util.function { method public static java.util.function.DoubleUnaryOperator identity(); } - public abstract interface Function { - method public default java.util.function.Function andThen(java.util.function.Function); + public abstract interface Function { + method public default java.util.function.Function andThen(java.util.function.Function); method public abstract R apply(T); - method public default java.util.function.Function compose(java.util.function.Function); - method public static java.util.function.Function identity(); + method public default java.util.function.Function compose(java.util.function.Function); + method public static java.util.function.Function identity(); } public abstract interface IntBinaryOperator { @@ -60923,7 +60923,7 @@ package java.util.function { method public default java.util.function.IntConsumer andThen(java.util.function.IntConsumer); } - public abstract interface IntFunction { + public abstract interface IntFunction { method public abstract R apply(int); } @@ -60962,7 +60962,7 @@ package java.util.function { method public default java.util.function.LongConsumer andThen(java.util.function.LongConsumer); } - public abstract interface LongFunction { + public abstract interface LongFunction { method public abstract R apply(long); } @@ -60992,56 +60992,56 @@ package java.util.function { method public static java.util.function.LongUnaryOperator identity(); } - public abstract interface ObjDoubleConsumer { + public abstract interface ObjDoubleConsumer { method public abstract void accept(T, double); } - public abstract interface ObjIntConsumer { + public abstract interface ObjIntConsumer { method public abstract void accept(T, int); } - public abstract interface ObjLongConsumer { + public abstract interface ObjLongConsumer { method public abstract void accept(T, long); } - public abstract interface Predicate { + public abstract interface Predicate { method public default java.util.function.Predicate and(java.util.function.Predicate); - method public static java.util.function.Predicate isEqual(java.lang.Object); + method public static java.util.function.Predicate isEqual(java.lang.Object); method public default java.util.function.Predicate negate(); method public default java.util.function.Predicate or(java.util.function.Predicate); method public abstract boolean test(T); } - public abstract interface Supplier { + public abstract interface Supplier { method public abstract T get(); } - public abstract interface ToDoubleBiFunction { + public abstract interface ToDoubleBiFunction { method public abstract double applyAsDouble(T, U); } - public abstract interface ToDoubleFunction { + public abstract interface ToDoubleFunction { method public abstract double applyAsDouble(T); } - public abstract interface ToIntBiFunction { + public abstract interface ToIntBiFunction { method public abstract int applyAsInt(T, U); } - public abstract interface ToIntFunction { + public abstract interface ToIntFunction { method public abstract int applyAsInt(T); } - public abstract interface ToLongBiFunction { + public abstract interface ToLongBiFunction { method public abstract long applyAsLong(T, U); } - public abstract interface ToLongFunction { + public abstract interface ToLongFunction { method public abstract long applyAsLong(T); } - public abstract interface UnaryOperator implements java.util.function.Function { - method public static java.util.function.UnaryOperator identity(); + public abstract interface UnaryOperator implements java.util.function.Function { + method public static java.util.function.UnaryOperator identity(); } } @@ -61629,7 +61629,7 @@ package java.util.regex { package java.util.stream { - public abstract interface BaseStream implements java.lang.AutoCloseable { + public abstract interface BaseStream> implements java.lang.AutoCloseable { method public abstract void close(); method public abstract boolean isParallel(); method public abstract java.util.Iterator iterator(); @@ -61640,13 +61640,13 @@ package java.util.stream { method public abstract S unordered(); } - public abstract interface Collector { + public abstract interface Collector { method public abstract java.util.function.BiConsumer accumulator(); method public abstract java.util.Set characteristics(); method public abstract java.util.function.BinaryOperator combiner(); method public abstract java.util.function.Function finisher(); - method public static java.util.stream.Collector of(java.util.function.Supplier, java.util.function.BiConsumer, java.util.function.BinaryOperator, java.util.stream.Collector.Characteristics...); - method public static java.util.stream.Collector of(java.util.function.Supplier, java.util.function.BiConsumer, java.util.function.BinaryOperator, java.util.function.Function, java.util.stream.Collector.Characteristics...); + method public static java.util.stream.Collector of(java.util.function.Supplier, java.util.function.BiConsumer, java.util.function.BinaryOperator, java.util.stream.Collector.Characteristics...); + method public static java.util.stream.Collector of(java.util.function.Supplier, java.util.function.BiConsumer, java.util.function.BinaryOperator, java.util.function.Function, java.util.stream.Collector.Characteristics...); method public abstract java.util.function.Supplier supplier(); } @@ -61659,43 +61659,43 @@ package java.util.stream { } public final class Collectors { - method public static java.util.stream.Collector averagingDouble(java.util.function.ToDoubleFunction); - method public static java.util.stream.Collector averagingInt(java.util.function.ToIntFunction); - method public static java.util.stream.Collector averagingLong(java.util.function.ToLongFunction); - method public static java.util.stream.Collector collectingAndThen(java.util.stream.Collector, java.util.function.Function); - method public static java.util.stream.Collector counting(); - method public static java.util.stream.Collector>> groupingBy(java.util.function.Function); - method public static java.util.stream.Collector> groupingBy(java.util.function.Function, java.util.stream.Collector); - method public static java.util.stream.Collector groupingBy(java.util.function.Function, java.util.function.Supplier, java.util.stream.Collector); - method public static java.util.stream.Collector>> groupingByConcurrent(java.util.function.Function); - method public static java.util.stream.Collector> groupingByConcurrent(java.util.function.Function, java.util.stream.Collector); - method public static java.util.stream.Collector groupingByConcurrent(java.util.function.Function, java.util.function.Supplier, java.util.stream.Collector); + method public static java.util.stream.Collector averagingDouble(java.util.function.ToDoubleFunction); + method public static java.util.stream.Collector averagingInt(java.util.function.ToIntFunction); + method public static java.util.stream.Collector averagingLong(java.util.function.ToLongFunction); + method public static java.util.stream.Collector collectingAndThen(java.util.stream.Collector, java.util.function.Function); + method public static java.util.stream.Collector counting(); + method public static java.util.stream.Collector>> groupingBy(java.util.function.Function); + method public static java.util.stream.Collector> groupingBy(java.util.function.Function, java.util.stream.Collector); + method public static > java.util.stream.Collector groupingBy(java.util.function.Function, java.util.function.Supplier, java.util.stream.Collector); + method public static java.util.stream.Collector>> groupingByConcurrent(java.util.function.Function); + method public static java.util.stream.Collector> groupingByConcurrent(java.util.function.Function, java.util.stream.Collector); + method public static > java.util.stream.Collector groupingByConcurrent(java.util.function.Function, java.util.function.Supplier, java.util.stream.Collector); method public static java.util.stream.Collector joining(); method public static java.util.stream.Collector joining(java.lang.CharSequence); method public static java.util.stream.Collector joining(java.lang.CharSequence, java.lang.CharSequence, java.lang.CharSequence); - method public static java.util.stream.Collector mapping(java.util.function.Function, java.util.stream.Collector); - method public static java.util.stream.Collector> maxBy(java.util.Comparator); - method public static java.util.stream.Collector> minBy(java.util.Comparator); - method public static java.util.stream.Collector>> partitioningBy(java.util.function.Predicate); - method public static java.util.stream.Collector> partitioningBy(java.util.function.Predicate, java.util.stream.Collector); - method public static java.util.stream.Collector reducing(T, java.util.function.BinaryOperator); - method public static java.util.stream.Collector> reducing(java.util.function.BinaryOperator); - method public static java.util.stream.Collector reducing(U, java.util.function.Function, java.util.function.BinaryOperator); - method public static java.util.stream.Collector summarizingDouble(java.util.function.ToDoubleFunction); - method public static java.util.stream.Collector summarizingInt(java.util.function.ToIntFunction); - method public static java.util.stream.Collector summarizingLong(java.util.function.ToLongFunction); - method public static java.util.stream.Collector summingDouble(java.util.function.ToDoubleFunction); - method public static java.util.stream.Collector summingInt(java.util.function.ToIntFunction); - method public static java.util.stream.Collector summingLong(java.util.function.ToLongFunction); - method public static java.util.stream.Collector toCollection(java.util.function.Supplier); - method public static java.util.stream.Collector> toConcurrentMap(java.util.function.Function, java.util.function.Function); - method public static java.util.stream.Collector> toConcurrentMap(java.util.function.Function, java.util.function.Function, java.util.function.BinaryOperator); - method public static java.util.stream.Collector toConcurrentMap(java.util.function.Function, java.util.function.Function, java.util.function.BinaryOperator, java.util.function.Supplier); - method public static java.util.stream.Collector> toList(); - method public static java.util.stream.Collector> toMap(java.util.function.Function, java.util.function.Function); - method public static java.util.stream.Collector> toMap(java.util.function.Function, java.util.function.Function, java.util.function.BinaryOperator); - method public static java.util.stream.Collector toMap(java.util.function.Function, java.util.function.Function, java.util.function.BinaryOperator, java.util.function.Supplier); - method public static java.util.stream.Collector> toSet(); + method public static java.util.stream.Collector mapping(java.util.function.Function, java.util.stream.Collector); + method public static java.util.stream.Collector> maxBy(java.util.Comparator); + method public static java.util.stream.Collector> minBy(java.util.Comparator); + method public static java.util.stream.Collector>> partitioningBy(java.util.function.Predicate); + method public static java.util.stream.Collector> partitioningBy(java.util.function.Predicate, java.util.stream.Collector); + method public static java.util.stream.Collector reducing(T, java.util.function.BinaryOperator); + method public static java.util.stream.Collector> reducing(java.util.function.BinaryOperator); + method public static java.util.stream.Collector reducing(U, java.util.function.Function, java.util.function.BinaryOperator); + method public static java.util.stream.Collector summarizingDouble(java.util.function.ToDoubleFunction); + method public static java.util.stream.Collector summarizingInt(java.util.function.ToIntFunction); + method public static java.util.stream.Collector summarizingLong(java.util.function.ToLongFunction); + method public static java.util.stream.Collector summingDouble(java.util.function.ToDoubleFunction); + method public static java.util.stream.Collector summingInt(java.util.function.ToIntFunction); + method public static java.util.stream.Collector summingLong(java.util.function.ToLongFunction); + method public static > java.util.stream.Collector toCollection(java.util.function.Supplier); + method public static java.util.stream.Collector> toConcurrentMap(java.util.function.Function, java.util.function.Function); + method public static java.util.stream.Collector> toConcurrentMap(java.util.function.Function, java.util.function.Function, java.util.function.BinaryOperator); + method public static > java.util.stream.Collector toConcurrentMap(java.util.function.Function, java.util.function.Function, java.util.function.BinaryOperator, java.util.function.Supplier); + method public static java.util.stream.Collector> toList(); + method public static java.util.stream.Collector> toMap(java.util.function.Function, java.util.function.Function); + method public static java.util.stream.Collector> toMap(java.util.function.Function, java.util.function.Function, java.util.function.BinaryOperator); + method public static > java.util.stream.Collector toMap(java.util.function.Function, java.util.function.Function, java.util.function.BinaryOperator, java.util.function.Supplier); + method public static java.util.stream.Collector> toSet(); } public abstract interface DoubleStream implements java.util.stream.BaseStream { @@ -61704,7 +61704,7 @@ package java.util.stream { method public abstract java.util.OptionalDouble average(); method public abstract java.util.stream.Stream boxed(); method public static java.util.stream.DoubleStream.Builder builder(); - method public abstract R collect(java.util.function.Supplier, java.util.function.ObjDoubleConsumer, java.util.function.BiConsumer); + method public abstract R collect(java.util.function.Supplier, java.util.function.ObjDoubleConsumer, java.util.function.BiConsumer); method public static java.util.stream.DoubleStream concat(java.util.stream.DoubleStream, java.util.stream.DoubleStream); method public abstract long count(); method public abstract java.util.stream.DoubleStream distinct(); @@ -61722,7 +61722,7 @@ package java.util.stream { method public abstract java.util.stream.DoubleStream map(java.util.function.DoubleUnaryOperator); method public abstract java.util.stream.IntStream mapToInt(java.util.function.DoubleToIntFunction); method public abstract java.util.stream.LongStream mapToLong(java.util.function.DoubleToLongFunction); - method public abstract java.util.stream.Stream mapToObj(java.util.function.DoubleFunction); + method public abstract java.util.stream.Stream mapToObj(java.util.function.DoubleFunction); method public abstract java.util.OptionalDouble max(); method public abstract java.util.OptionalDouble min(); method public abstract boolean noneMatch(java.util.function.DoublePredicate); @@ -61755,7 +61755,7 @@ package java.util.stream { method public abstract java.util.OptionalDouble average(); method public abstract java.util.stream.Stream boxed(); method public static java.util.stream.IntStream.Builder builder(); - method public abstract R collect(java.util.function.Supplier, java.util.function.ObjIntConsumer, java.util.function.BiConsumer); + method public abstract R collect(java.util.function.Supplier, java.util.function.ObjIntConsumer, java.util.function.BiConsumer); method public static java.util.stream.IntStream concat(java.util.stream.IntStream, java.util.stream.IntStream); method public abstract long count(); method public abstract java.util.stream.IntStream distinct(); @@ -61773,7 +61773,7 @@ package java.util.stream { method public abstract java.util.stream.IntStream map(java.util.function.IntUnaryOperator); method public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.IntToDoubleFunction); method public abstract java.util.stream.LongStream mapToLong(java.util.function.IntToLongFunction); - method public abstract java.util.stream.Stream mapToObj(java.util.function.IntFunction); + method public abstract java.util.stream.Stream mapToObj(java.util.function.IntFunction); method public abstract java.util.OptionalInt max(); method public abstract java.util.OptionalInt min(); method public abstract boolean noneMatch(java.util.function.IntPredicate); @@ -61807,7 +61807,7 @@ package java.util.stream { method public abstract java.util.OptionalDouble average(); method public abstract java.util.stream.Stream boxed(); method public static java.util.stream.LongStream.Builder builder(); - method public abstract R collect(java.util.function.Supplier, java.util.function.ObjLongConsumer, java.util.function.BiConsumer); + method public abstract R collect(java.util.function.Supplier, java.util.function.ObjLongConsumer, java.util.function.BiConsumer); method public static java.util.stream.LongStream concat(java.util.stream.LongStream, java.util.stream.LongStream); method public abstract long count(); method public abstract java.util.stream.LongStream distinct(); @@ -61825,7 +61825,7 @@ package java.util.stream { method public abstract java.util.stream.LongStream map(java.util.function.LongUnaryOperator); method public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.LongToDoubleFunction); method public abstract java.util.stream.IntStream mapToInt(java.util.function.LongToIntFunction); - method public abstract java.util.stream.Stream mapToObj(java.util.function.LongFunction); + method public abstract java.util.stream.Stream mapToObj(java.util.function.LongFunction); method public abstract java.util.OptionalLong max(); method public abstract java.util.OptionalLong min(); method public abstract boolean noneMatch(java.util.function.LongPredicate); @@ -61852,49 +61852,49 @@ package java.util.stream { method public abstract java.util.stream.LongStream build(); } - public abstract interface Stream implements java.util.stream.BaseStream { + public abstract interface Stream implements java.util.stream.BaseStream { method public abstract boolean allMatch(java.util.function.Predicate); method public abstract boolean anyMatch(java.util.function.Predicate); - method public static java.util.stream.Stream.Builder builder(); - method public abstract R collect(java.util.function.Supplier, java.util.function.BiConsumer, java.util.function.BiConsumer); - method public abstract R collect(java.util.stream.Collector); - method public static java.util.stream.Stream concat(java.util.stream.Stream, java.util.stream.Stream); + method public static java.util.stream.Stream.Builder builder(); + method public abstract R collect(java.util.function.Supplier, java.util.function.BiConsumer, java.util.function.BiConsumer); + method public abstract R collect(java.util.stream.Collector); + method public static java.util.stream.Stream concat(java.util.stream.Stream, java.util.stream.Stream); method public abstract long count(); method public abstract java.util.stream.Stream distinct(); - method public static java.util.stream.Stream empty(); + method public static java.util.stream.Stream empty(); method public abstract java.util.stream.Stream filter(java.util.function.Predicate); method public abstract java.util.Optional findAny(); method public abstract java.util.Optional findFirst(); - method public abstract java.util.stream.Stream flatMap(java.util.function.Function>); + method public abstract java.util.stream.Stream flatMap(java.util.function.Function>); method public abstract java.util.stream.DoubleStream flatMapToDouble(java.util.function.Function); method public abstract java.util.stream.IntStream flatMapToInt(java.util.function.Function); method public abstract java.util.stream.LongStream flatMapToLong(java.util.function.Function); method public abstract void forEach(java.util.function.Consumer); method public abstract void forEachOrdered(java.util.function.Consumer); - method public static java.util.stream.Stream generate(java.util.function.Supplier); - method public static java.util.stream.Stream iterate(T, java.util.function.UnaryOperator); + method public static java.util.stream.Stream generate(java.util.function.Supplier); + method public static java.util.stream.Stream iterate(T, java.util.function.UnaryOperator); method public abstract java.util.stream.Stream limit(long); - method public abstract java.util.stream.Stream map(java.util.function.Function); + method public abstract java.util.stream.Stream map(java.util.function.Function); method public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.ToDoubleFunction); method public abstract java.util.stream.IntStream mapToInt(java.util.function.ToIntFunction); method public abstract java.util.stream.LongStream mapToLong(java.util.function.ToLongFunction); method public abstract java.util.Optional max(java.util.Comparator); method public abstract java.util.Optional min(java.util.Comparator); method public abstract boolean noneMatch(java.util.function.Predicate); - method public static java.util.stream.Stream of(T); - method public static java.util.stream.Stream of(T...); + method public static java.util.stream.Stream of(T); + method public static java.util.stream.Stream of(T...); method public abstract java.util.stream.Stream peek(java.util.function.Consumer); method public abstract T reduce(T, java.util.function.BinaryOperator); method public abstract java.util.Optional reduce(java.util.function.BinaryOperator); - method public abstract U reduce(U, java.util.function.BiFunction, java.util.function.BinaryOperator); + method public abstract U reduce(U, java.util.function.BiFunction, java.util.function.BinaryOperator); method public abstract java.util.stream.Stream skip(long); method public abstract java.util.stream.Stream sorted(); method public abstract java.util.stream.Stream sorted(java.util.Comparator); method public abstract java.lang.Object[] toArray(); - method public abstract A[] toArray(java.util.function.IntFunction); + method public abstract A[] toArray(java.util.function.IntFunction); } - public static abstract interface Stream.Builder implements java.util.function.Consumer { + public static abstract interface Stream.Builder implements java.util.function.Consumer { method public abstract void accept(T); method public default java.util.stream.Stream.Builder add(T); method public abstract java.util.stream.Stream build(); @@ -61907,8 +61907,8 @@ package java.util.stream { method public static java.util.stream.IntStream intStream(java.util.function.Supplier, int, boolean); method public static java.util.stream.LongStream longStream(java.util.Spliterator.OfLong, boolean); method public static java.util.stream.LongStream longStream(java.util.function.Supplier, int, boolean); - method public static java.util.stream.Stream stream(java.util.Spliterator, boolean); - method public static java.util.stream.Stream stream(java.util.function.Supplier>, int, boolean); + method public static java.util.stream.Stream stream(java.util.Spliterator, boolean); + method public static java.util.stream.Stream stream(java.util.function.Supplier>, int, boolean); } } @@ -64079,16 +64079,16 @@ package javax.security.auth { public final class Subject implements java.io.Serializable { ctor public Subject(); ctor public Subject(boolean, java.util.Set, java.util.Set, java.util.Set); - method public static T doAs(javax.security.auth.Subject, java.security.PrivilegedAction); - method public static T doAs(javax.security.auth.Subject, java.security.PrivilegedExceptionAction) throws java.security.PrivilegedActionException; - method public static T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedAction, java.security.AccessControlContext); - method public static T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedExceptionAction, java.security.AccessControlContext) throws java.security.PrivilegedActionException; + method public static T doAs(javax.security.auth.Subject, java.security.PrivilegedAction); + method public static T doAs(javax.security.auth.Subject, java.security.PrivilegedExceptionAction) throws java.security.PrivilegedActionException; + method public static T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedAction, java.security.AccessControlContext); + method public static T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedExceptionAction, java.security.AccessControlContext) throws java.security.PrivilegedActionException; method public java.util.Set getPrincipals(); - method public java.util.Set getPrincipals(java.lang.Class); + method public java.util.Set getPrincipals(java.lang.Class); method public java.util.Set getPrivateCredentials(); - method public java.util.Set getPrivateCredentials(java.lang.Class); + method public java.util.Set getPrivateCredentials(java.lang.Class); method public java.util.Set getPublicCredentials(); - method public java.util.Set getPublicCredentials(java.lang.Class); + method public java.util.Set getPublicCredentials(java.lang.Class); method public static javax.security.auth.Subject getSubject(java.security.AccessControlContext); method public boolean isReadOnly(); method public void setReadOnly(); diff --git a/api/system-current.txt b/api/system-current.txt index c33fe6eed6cc983005903996552c3e3af4127704..0fe164a269cdc19b66d1b9d86956bf443200c054 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -3031,11 +3031,11 @@ package android.accounts { field public static final java.lang.String LOGIN_ACCOUNTS_CHANGED_ACTION = "android.accounts.LOGIN_ACCOUNTS_CHANGED"; } - public abstract interface AccountManagerCallback { + public abstract interface AccountManagerCallback { method public abstract void run(android.accounts.AccountManagerFuture); } - public abstract interface AccountManagerFuture { + public abstract interface AccountManagerFuture { method public abstract boolean cancel(boolean); method public abstract V getResult() throws android.accounts.AuthenticatorException, java.io.IOException, android.accounts.OperationCanceledException; method public abstract V getResult(long, java.util.concurrent.TimeUnit) throws android.accounts.AuthenticatorException, java.io.IOException, android.accounts.OperationCanceledException; @@ -3181,7 +3181,7 @@ package android.animation { method public java.lang.Object evaluate(float, java.lang.Object, java.lang.Object); } - public abstract class BidirectionalTypeConverter extends android.animation.TypeConverter { + public abstract class BidirectionalTypeConverter extends android.animation.TypeConverter { ctor public BidirectionalTypeConverter(java.lang.Class, java.lang.Class); method public abstract T convertBack(V); method public android.animation.BidirectionalTypeConverter invert(); @@ -3273,26 +3273,26 @@ package android.animation { method public java.lang.String getPropertyName(); method public java.lang.Object getTarget(); method public static android.animation.ObjectAnimator ofArgb(java.lang.Object, java.lang.String, int...); - method public static android.animation.ObjectAnimator ofArgb(T, android.util.Property, int...); + method public static android.animation.ObjectAnimator ofArgb(T, android.util.Property, int...); method public static android.animation.ObjectAnimator ofFloat(java.lang.Object, java.lang.String, float...); method public static android.animation.ObjectAnimator ofFloat(java.lang.Object, java.lang.String, java.lang.String, android.graphics.Path); - method public static android.animation.ObjectAnimator ofFloat(T, android.util.Property, float...); - method public static android.animation.ObjectAnimator ofFloat(T, android.util.Property, android.util.Property, android.graphics.Path); + method public static android.animation.ObjectAnimator ofFloat(T, android.util.Property, float...); + method public static android.animation.ObjectAnimator ofFloat(T, android.util.Property, android.util.Property, android.graphics.Path); method public static android.animation.ObjectAnimator ofInt(java.lang.Object, java.lang.String, int...); method public static android.animation.ObjectAnimator ofInt(java.lang.Object, java.lang.String, java.lang.String, android.graphics.Path); - method public static android.animation.ObjectAnimator ofInt(T, android.util.Property, int...); - method public static android.animation.ObjectAnimator ofInt(T, android.util.Property, android.util.Property, android.graphics.Path); + method public static android.animation.ObjectAnimator ofInt(T, android.util.Property, int...); + method public static android.animation.ObjectAnimator ofInt(T, android.util.Property, android.util.Property, android.graphics.Path); method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, float[][]); method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, android.graphics.Path); - method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, T...); + method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, T...); method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, int[][]); method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, android.graphics.Path); - method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, T...); + method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, T...); method public static android.animation.ObjectAnimator ofObject(java.lang.Object, java.lang.String, android.animation.TypeEvaluator, java.lang.Object...); method public static android.animation.ObjectAnimator ofObject(java.lang.Object, java.lang.String, android.animation.TypeConverter, android.graphics.Path); - method public static android.animation.ObjectAnimator ofObject(T, android.util.Property, android.animation.TypeEvaluator, V...); - method public static android.animation.ObjectAnimator ofObject(T, android.util.Property, android.animation.TypeConverter, android.animation.TypeEvaluator, V...); - method public static android.animation.ObjectAnimator ofObject(T, android.util.Property, android.animation.TypeConverter, android.graphics.Path); + method public static android.animation.ObjectAnimator ofObject(T, android.util.Property, android.animation.TypeEvaluator, V...); + method public static android.animation.ObjectAnimator ofObject(T, android.util.Property, android.animation.TypeConverter, android.animation.TypeEvaluator, V...); + method public static android.animation.ObjectAnimator ofObject(T, android.util.Property, android.animation.TypeConverter, android.graphics.Path); method public static android.animation.ObjectAnimator ofPropertyValuesHolder(java.lang.Object, android.animation.PropertyValuesHolder...); method public void setAutoCancel(boolean); method public void setProperty(android.util.Property); @@ -3316,17 +3316,17 @@ package android.animation { method public static android.animation.PropertyValuesHolder ofKeyframe(android.util.Property, android.animation.Keyframe...); method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, float[][]); method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.graphics.Path); - method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, V...); - method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, android.animation.Keyframe...); + method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, V...); + method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, android.animation.Keyframe...); method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, int[][]); method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.graphics.Path); - method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, V...); - method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, android.animation.Keyframe...); + method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, V...); + method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, android.animation.Keyframe...); method public static android.animation.PropertyValuesHolder ofObject(java.lang.String, android.animation.TypeEvaluator, java.lang.Object...); method public static android.animation.PropertyValuesHolder ofObject(java.lang.String, android.animation.TypeConverter, android.graphics.Path); - method public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeEvaluator, V...); - method public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeConverter, android.animation.TypeEvaluator, T...); - method public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeConverter, android.graphics.Path); + method public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeEvaluator, V...); + method public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeConverter, android.animation.TypeEvaluator, T...); + method public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeConverter, android.graphics.Path); method public void setConverter(android.animation.TypeConverter); method public void setEvaluator(android.animation.TypeEvaluator); method public void setFloatValues(float...); @@ -3363,12 +3363,12 @@ package android.animation { method public abstract float getInterpolation(float); } - public abstract class TypeConverter { + public abstract class TypeConverter { ctor public TypeConverter(java.lang.Class, java.lang.Class); method public abstract V convert(T); } - public abstract interface TypeEvaluator { + public abstract interface TypeEvaluator { method public abstract T evaluate(float, T, T); } @@ -4726,7 +4726,7 @@ package android.app { method public android.os.Parcelable saveAllState(); } - public abstract class FragmentHostCallback extends android.app.FragmentContainer { + public abstract class FragmentHostCallback extends android.app.FragmentContainer { ctor public FragmentHostCallback(android.content.Context, android.os.Handler, int); method public void onAttachFragment(android.app.Fragment); method public void onDump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]); @@ -4993,12 +4993,12 @@ package android.app { method public abstract void destroyLoader(int); method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]); method public static void enableDebugLogging(boolean); - method public abstract android.content.Loader getLoader(int); - method public abstract android.content.Loader initLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks); - method public abstract android.content.Loader restartLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks); + method public abstract android.content.Loader getLoader(int); + method public abstract android.content.Loader initLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks); + method public abstract android.content.Loader restartLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks); } - public static abstract interface LoaderManager.LoaderCallbacks { + public static abstract interface LoaderManager.LoaderCallbacks { method public abstract android.content.Loader onCreateLoader(int, android.os.Bundle); method public abstract void onLoadFinished(android.content.Loader, D); method public abstract void onLoaderReset(android.content.Loader); @@ -7952,7 +7952,7 @@ package android.content { ctor public AsyncQueryHandler.WorkerHandler(android.os.Looper); } - public abstract class AsyncTaskLoader extends android.content.Loader { + public abstract class AsyncTaskLoader extends android.content.Loader { ctor public AsyncTaskLoader(android.content.Context); method public void cancelLoadInBackground(); method public boolean isLoadInBackgroundCanceled(); @@ -8134,7 +8134,7 @@ package android.content { method public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException; method public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException; method protected final android.os.ParcelFileDescriptor openFileHelper(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException; - method public android.os.ParcelFileDescriptor openPipeHelper(android.net.Uri, java.lang.String, android.os.Bundle, T, android.content.ContentProvider.PipeDataWriter) throws java.io.FileNotFoundException; + method public android.os.ParcelFileDescriptor openPipeHelper(android.net.Uri, java.lang.String, android.os.Bundle, T, android.content.ContentProvider.PipeDataWriter) throws java.io.FileNotFoundException; method public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle) throws java.io.FileNotFoundException; method public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal) throws java.io.FileNotFoundException; method public abstract android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String); @@ -8147,7 +8147,7 @@ package android.content { method public abstract int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]); } - public static abstract interface ContentProvider.PipeDataWriter { + public static abstract interface ContentProvider.PipeDataWriter { method public abstract void writeDataToPipe(android.os.ParcelFileDescriptor, android.net.Uri, java.lang.String, android.os.Bundle, T); } @@ -8420,7 +8420,7 @@ package android.content { method public final java.lang.String getString(int); method public final java.lang.String getString(int, java.lang.Object...); method public abstract java.lang.Object getSystemService(java.lang.String); - method public final T getSystemService(java.lang.Class); + method public final T getSystemService(java.lang.Class); method public abstract java.lang.String getSystemServiceName(java.lang.Class); method public final java.lang.CharSequence getText(int); method public abstract android.content.res.Resources.Theme getTheme(); @@ -8789,8 +8789,8 @@ package android.content { method public long getLongExtra(java.lang.String, long); method public java.lang.String getPackage(); method public android.os.Parcelable[] getParcelableArrayExtra(java.lang.String); - method public java.util.ArrayList getParcelableArrayListExtra(java.lang.String); - method public T getParcelableExtra(java.lang.String); + method public java.util.ArrayList getParcelableArrayListExtra(java.lang.String); + method public T getParcelableExtra(java.lang.String); method public java.lang.String getScheme(); method public android.content.Intent getSelector(); method public java.io.Serializable getSerializableExtra(java.lang.String); @@ -9277,7 +9277,7 @@ package android.content { ctor public IntentSender.SendIntentException(java.lang.Exception); } - public class Loader { + public class Loader { ctor public Loader(android.content.Context); method public void abandon(); method public boolean cancelLoad(); @@ -9314,11 +9314,11 @@ package android.content { ctor public Loader.ForceLoadContentObserver(); } - public static abstract interface Loader.OnLoadCanceledListener { + public static abstract interface Loader.OnLoadCanceledListener { method public abstract void onLoadCanceled(android.content.Loader); } - public static abstract interface Loader.OnLoadCompleteListener { + public static abstract interface Loader.OnLoadCompleteListener { method public abstract void onLoadComplete(android.content.Loader, D); } @@ -11287,7 +11287,7 @@ package android.database { method public boolean isNull(int); } - public abstract class Observable { + public abstract class Observable { ctor public Observable(); method public void registerObserver(T); method public void unregisterAll(); @@ -13177,7 +13177,7 @@ package android.graphics.drawable { public class AnimatedStateListDrawable extends android.graphics.drawable.StateListDrawable { ctor public AnimatedStateListDrawable(); method public void addState(int[], android.graphics.drawable.Drawable, int); - method public void addTransition(int, int, T, boolean); + method public void addTransition(int, int, T, boolean); } public class AnimatedVectorDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Animatable2 { @@ -14309,7 +14309,7 @@ package android.hardware.camera2 { } public final class CameraCharacteristics extends android.hardware.camera2.CameraMetadata { - method public T get(android.hardware.camera2.CameraCharacteristics.Key); + method public T get(android.hardware.camera2.CameraCharacteristics.Key); method public java.util.List> getAvailableCaptureRequestKeys(); method public java.util.List> getAvailableCaptureResultKeys(); field public static final android.hardware.camera2.CameraCharacteristics.Key COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES; @@ -14394,7 +14394,7 @@ package android.hardware.camera2 { field public static final android.hardware.camera2.CameraCharacteristics.Key TONEMAP_MAX_CURVE_POINTS; } - public static final class CameraCharacteristics.Key { + public static final class CameraCharacteristics.Key { method public final boolean equals(java.lang.Object); method public java.lang.String getName(); method public final int hashCode(); @@ -14459,7 +14459,7 @@ package android.hardware.camera2 { method public void onTorchModeUnavailable(java.lang.String); } - public abstract class CameraMetadata { + public abstract class CameraMetadata { method public java.util.List getKeys(); field public static final int COLOR_CORRECTION_ABERRATION_MODE_FAST = 1; // 0x1 field public static final int COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY = 2; // 0x2 @@ -14667,7 +14667,7 @@ package android.hardware.camera2 { public final class CaptureRequest extends android.hardware.camera2.CameraMetadata implements android.os.Parcelable { method public int describeContents(); - method public T get(android.hardware.camera2.CaptureRequest.Key); + method public T get(android.hardware.camera2.CaptureRequest.Key); method public java.lang.Object getTag(); method public boolean isReprocess(); method public void writeToParcel(android.os.Parcel, int); @@ -14730,20 +14730,20 @@ package android.hardware.camera2 { public static final class CaptureRequest.Builder { method public void addTarget(android.view.Surface); method public android.hardware.camera2.CaptureRequest build(); - method public T get(android.hardware.camera2.CaptureRequest.Key); + method public T get(android.hardware.camera2.CaptureRequest.Key); method public void removeTarget(android.view.Surface); - method public void set(android.hardware.camera2.CaptureRequest.Key, T); + method public void set(android.hardware.camera2.CaptureRequest.Key, T); method public void setTag(java.lang.Object); } - public static final class CaptureRequest.Key { + public static final class CaptureRequest.Key { method public final boolean equals(java.lang.Object); method public java.lang.String getName(); method public final int hashCode(); } public class CaptureResult extends android.hardware.camera2.CameraMetadata { - method public T get(android.hardware.camera2.CaptureResult.Key); + method public T get(android.hardware.camera2.CaptureResult.Key); method public long getFrameNumber(); method public android.hardware.camera2.CaptureRequest getRequest(); method public int getSequenceId(); @@ -14824,7 +14824,7 @@ package android.hardware.camera2 { field public static final android.hardware.camera2.CaptureResult.Key TONEMAP_PRESET_CURVE; } - public static final class CaptureResult.Key { + public static final class CaptureResult.Key { method public final boolean equals(java.lang.Object); method public java.lang.String getName(); method public final int hashCode(); @@ -14956,14 +14956,14 @@ package android.hardware.camera2.params { method public android.util.Size[] getInputSizes(int); method public final int[] getOutputFormats(); method public long getOutputMinFrameDuration(int, android.util.Size); - method public long getOutputMinFrameDuration(java.lang.Class, android.util.Size); - method public android.util.Size[] getOutputSizes(java.lang.Class); + method public long getOutputMinFrameDuration(java.lang.Class, android.util.Size); + method public android.util.Size[] getOutputSizes(java.lang.Class); method public android.util.Size[] getOutputSizes(int); method public long getOutputStallDuration(int, android.util.Size); - method public long getOutputStallDuration(java.lang.Class, android.util.Size); + method public long getOutputStallDuration(java.lang.Class, android.util.Size); method public final int[] getValidOutputFormatsForInput(int); method public boolean isOutputSupportedFor(int); - method public static boolean isOutputSupportedFor(java.lang.Class); + method public static boolean isOutputSupportedFor(java.lang.Class); method public boolean isOutputSupportedFor(android.view.Surface); } @@ -17411,7 +17411,7 @@ package android.icu.math { package android.icu.text { - public final class AlphabeticIndex implements java.lang.Iterable { + public final class AlphabeticIndex implements java.lang.Iterable { ctor public AlphabeticIndex(android.icu.util.ULocale); ctor public AlphabeticIndex(java.util.Locale); ctor public AlphabeticIndex(android.icu.text.RuleBasedCollator); @@ -17437,7 +17437,7 @@ package android.icu.text { method public android.icu.text.AlphabeticIndex setUnderflowLabel(java.lang.String); } - public static class AlphabeticIndex.Bucket implements java.lang.Iterable { + public static class AlphabeticIndex.Bucket implements java.lang.Iterable { method public java.lang.String getLabel(); method public android.icu.text.AlphabeticIndex.Bucket.LabelType getLabelType(); method public java.util.Iterator> iterator(); @@ -17453,14 +17453,14 @@ package android.icu.text { enum_constant public static final android.icu.text.AlphabeticIndex.Bucket.LabelType UNDERFLOW; } - public static final class AlphabeticIndex.ImmutableIndex implements java.lang.Iterable { + public static final class AlphabeticIndex.ImmutableIndex implements java.lang.Iterable { method public android.icu.text.AlphabeticIndex.Bucket getBucket(int); method public int getBucketCount(); method public int getBucketIndex(java.lang.CharSequence); method public java.util.Iterator> iterator(); } - public static class AlphabeticIndex.Record { + public static class AlphabeticIndex.Record { method public V getData(); method public java.lang.CharSequence getName(); } @@ -18973,8 +18973,8 @@ package android.icu.text { method public final android.icu.text.UnicodeSet addAll(java.lang.CharSequence); method public android.icu.text.UnicodeSet addAll(android.icu.text.UnicodeSet); method public android.icu.text.UnicodeSet addAll(java.lang.Iterable); - method public android.icu.text.UnicodeSet addAll(T...); - method public T addAllTo(T); + method public android.icu.text.UnicodeSet addAll(T...); + method public > T addAllTo(T); method public void addMatchSetTo(android.icu.text.UnicodeSet); method public android.icu.text.UnicodeSet applyIntPropertyValue(int, int); method public final android.icu.text.UnicodeSet applyPattern(java.lang.String); @@ -19002,15 +19002,15 @@ package android.icu.text { method public final boolean contains(java.lang.CharSequence); method public boolean containsAll(android.icu.text.UnicodeSet); method public boolean containsAll(java.lang.String); - method public boolean containsAll(java.lang.Iterable); + method public boolean containsAll(java.lang.Iterable); method public boolean containsNone(int, int); method public boolean containsNone(android.icu.text.UnicodeSet); method public boolean containsNone(java.lang.CharSequence); - method public boolean containsNone(java.lang.Iterable); + method public boolean containsNone(java.lang.Iterable); method public final boolean containsSome(int, int); method public final boolean containsSome(android.icu.text.UnicodeSet); method public final boolean containsSome(java.lang.CharSequence); - method public final boolean containsSome(java.lang.Iterable); + method public final boolean containsSome(java.lang.Iterable); method public android.icu.text.UnicodeSet freeze(); method public static android.icu.text.UnicodeSet from(java.lang.CharSequence); method public static android.icu.text.UnicodeSet fromAll(java.lang.CharSequence); @@ -19028,14 +19028,14 @@ package android.icu.text { method public final android.icu.text.UnicodeSet remove(java.lang.CharSequence); method public final android.icu.text.UnicodeSet removeAll(java.lang.CharSequence); method public android.icu.text.UnicodeSet removeAll(android.icu.text.UnicodeSet); - method public android.icu.text.UnicodeSet removeAll(java.lang.Iterable); + method public android.icu.text.UnicodeSet removeAll(java.lang.Iterable); method public final android.icu.text.UnicodeSet removeAllStrings(); method public android.icu.text.UnicodeSet retain(int, int); method public final android.icu.text.UnicodeSet retain(int); method public final android.icu.text.UnicodeSet retain(java.lang.CharSequence); method public final android.icu.text.UnicodeSet retainAll(java.lang.CharSequence); method public android.icu.text.UnicodeSet retainAll(android.icu.text.UnicodeSet); - method public android.icu.text.UnicodeSet retainAll(java.lang.Iterable); + method public android.icu.text.UnicodeSet retainAll(java.lang.Iterable); method public android.icu.text.UnicodeSet set(int, int); method public android.icu.text.UnicodeSet set(android.icu.text.UnicodeSet); method public int size(); @@ -19445,7 +19445,7 @@ package android.icu.util { method public long getToDate(); } - public abstract interface Freezable implements java.lang.Cloneable { + public abstract interface Freezable implements java.lang.Cloneable { method public abstract T cloneAsThawed(); method public abstract T freeze(); method public abstract boolean isFrozen(); @@ -19727,7 +19727,7 @@ package android.icu.util { field public static final android.icu.util.TimeUnit YEAR; } - public class Output { + public class Output { ctor public Output(); ctor public Output(T); field public T value; @@ -30658,7 +30658,7 @@ package android.opengl { package android.os { - public abstract class AsyncTask { + public abstract class AsyncTask { ctor public AsyncTask(); method public final boolean cancel(boolean); method protected abstract Result doInBackground(Params...); @@ -30886,16 +30886,16 @@ package android.os { method public float getFloat(java.lang.String, float); method public float[] getFloatArray(java.lang.String); method public java.util.ArrayList getIntegerArrayList(java.lang.String); - method public T getParcelable(java.lang.String); + method public T getParcelable(java.lang.String); method public android.os.Parcelable[] getParcelableArray(java.lang.String); - method public java.util.ArrayList getParcelableArrayList(java.lang.String); + method public java.util.ArrayList getParcelableArrayList(java.lang.String); method public java.io.Serializable getSerializable(java.lang.String); method public short getShort(java.lang.String); method public short getShort(java.lang.String, short); method public short[] getShortArray(java.lang.String); method public android.util.Size getSize(java.lang.String); method public android.util.SizeF getSizeF(java.lang.String); - method public android.util.SparseArray getSparseParcelableArray(java.lang.String); + method public android.util.SparseArray getSparseParcelableArray(java.lang.String); method public java.util.ArrayList getStringArrayList(java.lang.String); method public boolean hasFileDescriptors(); method public void putAll(android.os.Bundle); @@ -31400,8 +31400,8 @@ package android.os { method public final long[] createLongArray(); method public final java.lang.String[] createStringArray(); method public final java.util.ArrayList createStringArrayList(); - method public final T[] createTypedArray(android.os.Parcelable.Creator); - method public final java.util.ArrayList createTypedArrayList(android.os.Parcelable.Creator); + method public final T[] createTypedArray(android.os.Parcelable.Creator); + method public final java.util.ArrayList createTypedArrayList(android.os.Parcelable.Creator); method public final int dataAvail(); method public final int dataCapacity(); method public final int dataPosition(); @@ -31434,7 +31434,7 @@ package android.os { method public final long readLong(); method public final void readLongArray(long[]); method public final void readMap(java.util.Map, java.lang.ClassLoader); - method public final T readParcelable(java.lang.ClassLoader); + method public final T readParcelable(java.lang.ClassLoader); method public final android.os.Parcelable[] readParcelableArray(java.lang.ClassLoader); method public final android.os.PersistableBundle readPersistableBundle(); method public final android.os.PersistableBundle readPersistableBundle(java.lang.ClassLoader); @@ -31447,9 +31447,9 @@ package android.os { method public final void readStringArray(java.lang.String[]); method public final void readStringList(java.util.List); method public final android.os.IBinder readStrongBinder(); - method public final void readTypedArray(T[], android.os.Parcelable.Creator); - method public final void readTypedList(java.util.List, android.os.Parcelable.Creator); - method public final T readTypedObject(android.os.Parcelable.Creator); + method public final void readTypedArray(T[], android.os.Parcelable.Creator); + method public final void readTypedList(java.util.List, android.os.Parcelable.Creator); + method public final T readTypedObject(android.os.Parcelable.Creator); method public final java.lang.Object readValue(java.lang.ClassLoader); method public final void recycle(); method public final void setDataCapacity(int); @@ -31480,7 +31480,7 @@ package android.os { method public final void writeMap(java.util.Map); method public final void writeNoException(); method public final void writeParcelable(android.os.Parcelable, int); - method public final void writeParcelableArray(T[], int); + method public final void writeParcelableArray(T[], int); method public final void writePersistableBundle(android.os.PersistableBundle); method public final void writeSerializable(java.io.Serializable); method public final void writeSize(android.util.Size); @@ -31492,9 +31492,9 @@ package android.os { method public final void writeStringList(java.util.List); method public final void writeStrongBinder(android.os.IBinder); method public final void writeStrongInterface(android.os.IInterface); - method public final void writeTypedArray(T[], int); - method public final void writeTypedList(java.util.List); - method public final void writeTypedObject(T, int); + method public final void writeTypedArray(T[], int); + method public final void writeTypedList(java.util.List); + method public final void writeTypedObject(T, int); method public final void writeValue(java.lang.Object); field public static final android.os.Parcelable.Creator STRING_CREATOR; } @@ -31572,11 +31572,11 @@ package android.os { field public static final int PARCELABLE_WRITE_RETURN_VALUE = 1; // 0x1 } - public static abstract interface Parcelable.ClassLoaderCreator implements android.os.Parcelable.Creator { + public static abstract interface Parcelable.ClassLoaderCreator implements android.os.Parcelable.Creator { method public abstract T createFromParcel(android.os.Parcel, java.lang.ClassLoader); } - public static abstract interface Parcelable.Creator { + public static abstract interface Parcelable.Creator { method public abstract T createFromParcel(android.os.Parcel); method public abstract T[] newArray(int); } @@ -31718,7 +31718,7 @@ package android.os { method public abstract void onResult(android.os.Bundle); } - public class RemoteCallbackList { + public class RemoteCallbackList { ctor public RemoteCallbackList(); method public int beginBroadcast(); method public void finishBroadcast(); @@ -35238,7 +35238,7 @@ package android.provider { field public static final java.lang.String RADIO_CELL = "cell"; field public static final java.lang.String RADIO_NFC = "nfc"; field public static final java.lang.String RADIO_WIFI = "wifi"; - field public static final java.lang.String SHOW_PROCESSES = "show_processes"; + field public static final deprecated java.lang.String SHOW_PROCESSES = "show_processes"; field public static final java.lang.String STAY_ON_WHILE_PLUGGED_IN = "stay_on_while_plugged_in"; field public static final java.lang.String THEATER_MODE_ON = "theater_mode_on"; field public static final java.lang.String TRANSITION_ANIMATION_SCALE = "transition_animation_scale"; @@ -37278,7 +37278,7 @@ package android.service.carrier { field public static final java.lang.String SERVICE_INTERFACE = "android.service.carrier.CarrierMessagingService"; } - public static abstract interface CarrierMessagingService.ResultCallback { + public static abstract interface CarrierMessagingService.ResultCallback { method public abstract void onReceiveResult(T) throws android.os.RemoteException; } @@ -37429,7 +37429,7 @@ package android.service.media { field public static final java.lang.String EXTRA_SUGGESTED = "android.service.media.extra.SUGGESTED"; } - public class MediaBrowserService.Result { + public class MediaBrowserService.Result { method public void detach(); method public void sendResult(T); } @@ -40749,14 +40749,14 @@ package android.telephony.gsm { package android.test { - public abstract deprecated class ActivityInstrumentationTestCase extends android.test.ActivityTestCase { + public abstract deprecated class ActivityInstrumentationTestCase extends android.test.ActivityTestCase { ctor public ActivityInstrumentationTestCase(java.lang.String, java.lang.Class); ctor public ActivityInstrumentationTestCase(java.lang.String, java.lang.Class, boolean); method public T getActivity(); method public void testActivityTestCaseSetUpProperly() throws java.lang.Exception; } - public abstract deprecated class ActivityInstrumentationTestCase2 extends android.test.ActivityTestCase { + public abstract deprecated class ActivityInstrumentationTestCase2 extends android.test.ActivityTestCase { ctor public deprecated ActivityInstrumentationTestCase2(java.lang.String, java.lang.Class); ctor public ActivityInstrumentationTestCase2(java.lang.Class); method public T getActivity(); @@ -40771,7 +40771,7 @@ package android.test { method protected void setActivity(android.app.Activity); } - public abstract deprecated class ActivityUnitTestCase extends android.test.ActivityTestCase { + public abstract deprecated class ActivityUnitTestCase extends android.test.ActivityTestCase { ctor public ActivityUnitTestCase(java.lang.Class); method public T getActivity(); method public int getFinishedActivityRequest(); @@ -40817,7 +40817,7 @@ package android.test { method public void testStarted(java.lang.String); } - public abstract deprecated class ApplicationTestCase extends android.test.AndroidTestCase { + public abstract deprecated class ApplicationTestCase extends android.test.AndroidTestCase { ctor public ApplicationTestCase(java.lang.Class); method protected final void createApplication(); method public T getApplication(); @@ -40843,8 +40843,8 @@ package android.test { method public android.app.Instrumentation getInstrumentation(); method public deprecated void injectInsrumentation(android.app.Instrumentation); method public void injectInstrumentation(android.app.Instrumentation); - method public final T launchActivity(java.lang.String, java.lang.Class, android.os.Bundle); - method public final T launchActivityWithIntent(java.lang.String, java.lang.Class, android.content.Intent); + method public final T launchActivity(java.lang.String, java.lang.Class, android.os.Bundle); + method public final T launchActivityWithIntent(java.lang.String, java.lang.Class, android.content.Intent); method public void runTestOnUiThread(java.lang.Runnable) throws java.lang.Throwable; method public void sendKeys(java.lang.String); method public void sendKeys(int...); @@ -40884,7 +40884,7 @@ package android.test { public class LoaderTestCase extends android.test.AndroidTestCase { ctor public LoaderTestCase(); - method public T getLoaderResultSynchronously(android.content.Loader); + method public T getLoaderResultSynchronously(android.content.Loader); } public final deprecated class MoreAsserts { @@ -40939,20 +40939,20 @@ package android.test { method public abstract void startTiming(boolean); } - public abstract deprecated class ProviderTestCase extends android.test.InstrumentationTestCase { + public abstract deprecated class ProviderTestCase extends android.test.InstrumentationTestCase { ctor public ProviderTestCase(java.lang.Class, java.lang.String); method public android.test.mock.MockContentResolver getMockContentResolver(); method public android.test.IsolatedContext getMockContext(); method public T getProvider(); - method public static android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.Class, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; + method public static android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.Class, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; } - public abstract class ProviderTestCase2 extends android.test.AndroidTestCase { + public abstract class ProviderTestCase2 extends android.test.AndroidTestCase { ctor public ProviderTestCase2(java.lang.Class, java.lang.String); method public android.test.mock.MockContentResolver getMockContentResolver(); method public android.test.IsolatedContext getMockContext(); method public T getProvider(); - method public static android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.String, java.lang.Class, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; + method public static android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.String, java.lang.Class, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; } public deprecated class RenamingDelegatingContext extends android.content.ContextWrapper { @@ -40960,11 +40960,11 @@ package android.test { ctor public RenamingDelegatingContext(android.content.Context, android.content.Context, java.lang.String); method public java.lang.String getDatabasePrefix(); method public void makeExistingFilesAndDbsAccessible(); - method public static T providerWithRenamedContext(java.lang.Class, android.content.Context, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; - method public static T providerWithRenamedContext(java.lang.Class, android.content.Context, java.lang.String, boolean) throws java.lang.IllegalAccessException, java.lang.InstantiationException; + method public static T providerWithRenamedContext(java.lang.Class, android.content.Context, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; + method public static T providerWithRenamedContext(java.lang.Class, android.content.Context, java.lang.String, boolean) throws java.lang.IllegalAccessException, java.lang.InstantiationException; } - public abstract deprecated class ServiceTestCase extends android.test.AndroidTestCase { + public abstract deprecated class ServiceTestCase extends android.test.AndroidTestCase { ctor public ServiceTestCase(java.lang.Class); method protected android.os.IBinder bindService(android.content.Intent); method public android.app.Application getApplication(); @@ -40977,7 +40977,7 @@ package android.test { method public void testServiceTestCaseSetUpProperly() throws java.lang.Exception; } - public abstract deprecated class SingleLaunchActivityTestCase extends android.test.InstrumentationTestCase { + public abstract deprecated class SingleLaunchActivityTestCase extends android.test.InstrumentationTestCase { ctor public SingleLaunchActivityTestCase(java.lang.String, java.lang.Class); method public T getActivity(); method public void testActivityTestCaseSetUpProperly() throws java.lang.Exception; @@ -41344,7 +41344,7 @@ package android.test.suitebuilder { ctor public TestMethod(java.lang.String, java.lang.Class); ctor public TestMethod(junit.framework.TestCase); method public junit.framework.TestCase createTest() throws java.lang.IllegalAccessException, java.lang.InstantiationException, java.lang.reflect.InvocationTargetException; - method public T getAnnotation(java.lang.Class); + method public T getAnnotation(java.lang.Class); method public java.lang.Class getEnclosingClass(); method public java.lang.String getEnclosingClassname(); method public java.lang.String getName(); @@ -41787,7 +41787,7 @@ package android.text { method public int getSpanEnd(java.lang.Object); method public int getSpanFlags(java.lang.Object); method public int getSpanStart(java.lang.Object); - method public T[] getSpans(int, int, java.lang.Class); + method public T[] getSpans(int, int, java.lang.Class); method public deprecated int getTextRunCursor(int, int, int, int, int, android.graphics.Paint); method public int getTextWatcherDepth(); method public android.text.SpannableStringBuilder insert(int, java.lang.CharSequence, int, int); @@ -41809,7 +41809,7 @@ package android.text { method public int getSpanEnd(java.lang.Object); method public int getSpanFlags(java.lang.Object); method public int getSpanStart(java.lang.Object); - method public T[] getSpans(int, int, java.lang.Class); + method public T[] getSpans(int, int, java.lang.Class); method public final int length(); method public int nextSpanTransition(int, int, java.lang.Class); method public final java.lang.String toString(); @@ -41819,7 +41819,7 @@ package android.text { method public abstract int getSpanEnd(java.lang.Object); method public abstract int getSpanFlags(java.lang.Object); method public abstract int getSpanStart(java.lang.Object); - method public abstract T[] getSpans(int, int, java.lang.Class); + method public abstract T[] getSpans(int, int, java.lang.Class); method public abstract int nextSpanTransition(int, int, java.lang.Class); field public static final int SPAN_COMPOSING = 256; // 0x100 field public static final int SPAN_EXCLUSIVE_EXCLUSIVE = 33; // 0x21 @@ -42796,7 +42796,7 @@ package android.text.style { field public static final int WEEKDAY_WEDNESDAY = 4; // 0x4 } - public static class TtsSpan.Builder { + public static class TtsSpan.Builder> { ctor public TtsSpan.Builder(java.lang.String); method public android.text.style.TtsSpan build(); method public C setIntArgument(java.lang.String, int); @@ -42892,7 +42892,7 @@ package android.text.style { method public android.text.style.TtsSpan.OrdinalBuilder setNumber(java.lang.String); } - public static class TtsSpan.SemioticClassBuilder extends android.text.style.TtsSpan.Builder { + public static class TtsSpan.SemioticClassBuilder> extends android.text.style.TtsSpan.Builder { ctor public TtsSpan.SemioticClassBuilder(java.lang.String); method public C setAnimacy(java.lang.String); method public C setCase(java.lang.String); @@ -43299,7 +43299,7 @@ package android.util { ctor public AndroidRuntimeException(java.lang.Exception); } - public final class ArrayMap implements java.util.Map { + public final class ArrayMap implements java.util.Map { ctor public ArrayMap(); ctor public ArrayMap(int); ctor public ArrayMap(android.util.ArrayMap); @@ -43327,7 +43327,7 @@ package android.util { method public java.util.Collection values(); } - public final class ArraySet implements java.util.Collection java.util.Set { + public final class ArraySet implements java.util.Collection java.util.Set { ctor public ArraySet(); ctor public ArraySet(int); ctor public ArraySet(android.util.ArraySet); @@ -43348,7 +43348,7 @@ package android.util { method public boolean retainAll(java.util.Collection); method public int size(); method public java.lang.Object[] toArray(); - method public T[] toArray(T[]); + method public T[] toArray(T[]); method public E valueAt(int); } @@ -43493,13 +43493,13 @@ package android.util { public deprecated class FloatMath { } - public abstract class FloatProperty extends android.util.Property { + public abstract class FloatProperty extends android.util.Property { ctor public FloatProperty(java.lang.String); method public final void set(T, java.lang.Float); method public abstract void setValue(T, float); } - public abstract class IntProperty extends android.util.Property { + public abstract class IntProperty extends android.util.Property { ctor public IntProperty(java.lang.String); method public final void set(T, java.lang.Integer); method public abstract void setValue(T, int); @@ -43599,7 +43599,7 @@ package android.util { method public void println(java.lang.String); } - public class LongSparseArray implements java.lang.Cloneable { + public class LongSparseArray implements java.lang.Cloneable { ctor public LongSparseArray(); ctor public LongSparseArray(int); method public void append(long, E); @@ -43619,7 +43619,7 @@ package android.util { method public E valueAt(int); } - public class LruCache { + public class LruCache { ctor public LruCache(int); method protected V create(K); method public final synchronized int createCount(); @@ -43707,9 +43707,9 @@ package android.util { ctor public NoSuchPropertyException(java.lang.String); } - public class Pair { + public class Pair { ctor public Pair(F, S); - method public static android.util.Pair create(A, B); + method public static android.util.Pair create(A, B); field public final F first; field public final S second; } @@ -43742,22 +43742,22 @@ package android.util { method public abstract void println(java.lang.String); } - public abstract class Property { + public abstract class Property { ctor public Property(java.lang.Class, java.lang.String); method public abstract V get(T); method public java.lang.String getName(); method public java.lang.Class getType(); method public boolean isReadOnly(); - method public static android.util.Property of(java.lang.Class, java.lang.Class, java.lang.String); + method public static android.util.Property of(java.lang.Class, java.lang.Class, java.lang.String); method public void set(T, V); } - public final class Range { + public final class Range> { ctor public Range(T, T); method public T clamp(T); method public boolean contains(T); method public boolean contains(android.util.Range); - method public static android.util.Range create(T, T); + method public static > android.util.Range create(T, T); method public android.util.Range extend(android.util.Range); method public android.util.Range extend(T, T); method public android.util.Range extend(T); @@ -43801,7 +43801,7 @@ package android.util { method public static android.util.SizeF parseSizeF(java.lang.String) throws java.lang.NumberFormatException; } - public class SparseArray implements java.lang.Cloneable { + public class SparseArray implements java.lang.Cloneable { ctor public SparseArray(); ctor public SparseArray(int); method public void append(int, E); @@ -48606,7 +48606,7 @@ package android.webkit { method public static java.lang.String stripAnchor(java.lang.String); } - public abstract interface ValueCallback { + public abstract interface ValueCallback { method public abstract void onReceiveValue(T); } @@ -49621,7 +49621,7 @@ package android.widget { field public static final int NO_SELECTION = -2147483648; // 0x80000000 } - public abstract class AdapterView extends android.view.ViewGroup { + public abstract class AdapterView extends android.view.ViewGroup { ctor public AdapterView(android.content.Context); ctor public AdapterView(android.content.Context, android.util.AttributeSet); ctor public AdapterView(android.content.Context, android.util.AttributeSet, int); @@ -49744,7 +49744,7 @@ package android.widget { ctor public AnalogClock(android.content.Context, android.util.AttributeSet, int, int); } - public class ArrayAdapter extends android.widget.BaseAdapter implements android.widget.Filterable android.widget.ThemedSpinnerAdapter { + public class ArrayAdapter extends android.widget.BaseAdapter implements android.widget.Filterable android.widget.ThemedSpinnerAdapter { ctor public ArrayAdapter(android.content.Context, int); ctor public ArrayAdapter(android.content.Context, int, int); ctor public ArrayAdapter(android.content.Context, int, T[]); @@ -49805,7 +49805,7 @@ package android.widget { method protected void performFiltering(java.lang.CharSequence, int); method public void performValidation(); method protected void replaceText(java.lang.CharSequence); - method public void setAdapter(T); + method public void setAdapter(T); method public void setCompletionHint(java.lang.CharSequence); method public void setDropDownAnchor(int); method public void setDropDownBackgroundDrawable(android.graphics.drawable.Drawable); @@ -52090,7 +52090,7 @@ package android.widget { package com.android.internal.util { - public abstract interface Predicate { + public abstract interface Predicate { method public abstract boolean apply(T); } @@ -54137,13 +54137,13 @@ package java.lang { enum_constant public static final java.lang.Character.UnicodeScript YI; } - public final class Class implements java.lang.reflect.AnnotatedElement java.lang.reflect.GenericDeclaration java.io.Serializable java.lang.reflect.Type { - method public java.lang.Class asSubclass(java.lang.Class); + public final class Class implements java.lang.reflect.AnnotatedElement java.lang.reflect.GenericDeclaration java.io.Serializable java.lang.reflect.Type { + method public java.lang.Class asSubclass(java.lang.Class); method public T cast(java.lang.Object); method public boolean desiredAssertionStatus(); method public static java.lang.Class forName(java.lang.String) throws java.lang.ClassNotFoundException; method public static java.lang.Class forName(java.lang.String, boolean, java.lang.ClassLoader) throws java.lang.ClassNotFoundException; - method public A getAnnotation(java.lang.Class); + method public A getAnnotation(java.lang.Class); method public java.lang.annotation.Annotation[] getAnnotations(); method public java.lang.String getCanonicalName(); method public java.lang.ClassLoader getClassLoader(); @@ -54260,7 +54260,7 @@ package java.lang { public abstract interface Cloneable { } - public abstract interface Comparable { + public abstract interface Comparable { method public abstract int compareTo(T); } @@ -54314,7 +54314,7 @@ package java.lang { field public static final java.lang.Class TYPE; } - public abstract class Enum implements java.lang.Comparable java.io.Serializable { + public abstract class Enum> implements java.lang.Comparable java.io.Serializable { ctor protected Enum(java.lang.String, int); method protected final java.lang.Object clone() throws java.lang.CloneNotSupportedException; method public final int compareTo(E); @@ -54324,7 +54324,7 @@ package java.lang { method public final int hashCode(); method public final java.lang.String name(); method public final int ordinal(); - method public static T valueOf(java.lang.Class, java.lang.String); + method public static > T valueOf(java.lang.Class, java.lang.String); } public class EnumConstantNotPresentException extends java.lang.RuntimeException { @@ -54443,7 +54443,7 @@ package java.lang { ctor public IndexOutOfBoundsException(java.lang.String); } - public class InheritableThreadLocal extends java.lang.ThreadLocal { + public class InheritableThreadLocal extends java.lang.ThreadLocal { ctor public InheritableThreadLocal(); method protected T childValue(T); } @@ -54514,7 +54514,7 @@ package java.lang { ctor public InterruptedException(java.lang.String); } - public abstract interface Iterable { + public abstract interface Iterable { method public default void forEach(java.util.function.Consumer); method public abstract java.util.Iterator iterator(); method public default java.util.Spliterator spliterator(); @@ -54722,12 +54722,12 @@ package java.lang { } public class Package implements java.lang.reflect.AnnotatedElement { - method public A getAnnotation(java.lang.Class); + method public A getAnnotation(java.lang.Class); method public java.lang.annotation.Annotation[] getAnnotations(); - method public A[] getAnnotationsByType(java.lang.Class); - method public A getDeclaredAnnotation(java.lang.Class); + method public A[] getAnnotationsByType(java.lang.Class); + method public A getDeclaredAnnotation(java.lang.Class); method public java.lang.annotation.Annotation[] getDeclaredAnnotations(); - method public A[] getDeclaredAnnotationsByType(java.lang.Class); + method public A[] getDeclaredAnnotationsByType(java.lang.Class); method public java.lang.String getImplementationTitle(); method public java.lang.String getImplementationVendor(); method public java.lang.String getImplementationVersion(); @@ -55287,7 +55287,7 @@ package java.lang { method public void uncaughtException(java.lang.Thread, java.lang.Throwable); } - public class ThreadLocal { + public class ThreadLocal { ctor public ThreadLocal(); method public T get(); method protected T initialValue(); @@ -55427,30 +55427,30 @@ package java.lang.annotation { package java.lang.ref { - public class PhantomReference extends java.lang.ref.Reference { + public class PhantomReference extends java.lang.ref.Reference { ctor public PhantomReference(T, java.lang.ref.ReferenceQueue); } - public abstract class Reference { + public abstract class Reference { method public void clear(); method public boolean enqueue(); method public T get(); method public boolean isEnqueued(); } - public class ReferenceQueue { + public class ReferenceQueue { ctor public ReferenceQueue(); method public java.lang.ref.Reference poll(); method public java.lang.ref.Reference remove(long) throws java.lang.IllegalArgumentException, java.lang.InterruptedException; method public java.lang.ref.Reference remove() throws java.lang.InterruptedException; } - public class SoftReference extends java.lang.ref.Reference { + public class SoftReference extends java.lang.ref.Reference { ctor public SoftReference(T); ctor public SoftReference(T, java.lang.ref.ReferenceQueue); } - public class WeakReference extends java.lang.ref.Reference { + public class WeakReference extends java.lang.ref.Reference { ctor public WeakReference(T); ctor public WeakReference(T, java.lang.ref.ReferenceQueue); } @@ -55461,7 +55461,7 @@ package java.lang.reflect { public class AccessibleObject implements java.lang.reflect.AnnotatedElement { ctor protected AccessibleObject(); - method public T getAnnotation(java.lang.Class); + method public T getAnnotation(java.lang.Class); method public java.lang.annotation.Annotation[] getAnnotations(); method public java.lang.annotation.Annotation[] getDeclaredAnnotations(); method public boolean isAccessible(); @@ -55470,12 +55470,12 @@ package java.lang.reflect { } public abstract interface AnnotatedElement { - method public abstract T getAnnotation(java.lang.Class); + method public abstract T getAnnotation(java.lang.Class); method public abstract java.lang.annotation.Annotation[] getAnnotations(); - method public default T[] getAnnotationsByType(java.lang.Class); - method public default java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class); + method public default T[] getAnnotationsByType(java.lang.Class); + method public default java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class); method public abstract java.lang.annotation.Annotation[] getDeclaredAnnotations(); - method public default T[] getDeclaredAnnotationsByType(java.lang.Class); + method public default T[] getDeclaredAnnotationsByType(java.lang.Class); method public default boolean isAnnotationPresent(java.lang.Class); } @@ -55503,8 +55503,8 @@ package java.lang.reflect { method public static void setShort(java.lang.Object, int, short) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException; } - public final class Constructor extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member { - method public A getAnnotation(java.lang.Class); + public final class Constructor extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member { + method public A getAnnotation(java.lang.Class); method public java.lang.Class getDeclaringClass(); method public java.lang.Class[] getExceptionTypes(); method public java.lang.reflect.Type[] getGenericExceptionTypes(); @@ -55523,7 +55523,7 @@ package java.lang.reflect { public final class Field extends java.lang.reflect.AccessibleObject implements java.lang.reflect.Member { method public java.lang.Object get(java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException; - method public A getAnnotation(java.lang.Class); + method public A getAnnotation(java.lang.Class); method public boolean getBoolean(java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException; method public byte getByte(java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException; method public char getChar(java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException; @@ -55589,7 +55589,7 @@ package java.lang.reflect { } public final class Method extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member { - method public A getAnnotation(java.lang.Class); + method public A getAnnotation(java.lang.Class); method public java.lang.Class getDeclaringClass(); method public java.lang.Object getDefaultValue(); method public java.lang.Class[] getExceptionTypes(); @@ -55667,7 +55667,7 @@ package java.lang.reflect { public abstract interface Type { } - public abstract interface TypeVariable implements java.lang.reflect.Type { + public abstract interface TypeVariable implements java.lang.reflect.Type { method public abstract java.lang.reflect.Type[] getBounds(); method public abstract D getGenericDeclaration(); method public abstract java.lang.String getName(); @@ -56456,7 +56456,7 @@ package java.net { method public abstract java.net.SocketImpl createSocketImpl(); } - public abstract interface SocketOption { + public abstract interface SocketOption { method public abstract java.lang.String name(); method public abstract java.lang.Class type(); } @@ -57040,7 +57040,7 @@ package java.nio.channels { method public final long read(java.nio.ByteBuffer[]) throws java.io.IOException; method public abstract java.net.SocketAddress receive(java.nio.ByteBuffer) throws java.io.IOException; method public abstract int send(java.nio.ByteBuffer, java.net.SocketAddress) throws java.io.IOException; - method public abstract java.nio.channels.DatagramChannel setOption(java.net.SocketOption, T) throws java.io.IOException; + method public abstract java.nio.channels.DatagramChannel setOption(java.net.SocketOption, T) throws java.io.IOException; method public abstract java.net.DatagramSocket socket(); method public final int validOps(); method public abstract int write(java.nio.ByteBuffer) throws java.io.IOException; @@ -57116,8 +57116,8 @@ package java.nio.channels { public abstract interface NetworkChannel implements java.nio.channels.Channel { method public abstract java.nio.channels.NetworkChannel bind(java.net.SocketAddress) throws java.io.IOException; method public abstract java.net.SocketAddress getLocalAddress() throws java.io.IOException; - method public abstract T getOption(java.net.SocketOption) throws java.io.IOException; - method public abstract java.nio.channels.NetworkChannel setOption(java.net.SocketOption, T) throws java.io.IOException; + method public abstract T getOption(java.net.SocketOption) throws java.io.IOException; + method public abstract java.nio.channels.NetworkChannel setOption(java.net.SocketOption, T) throws java.io.IOException; method public abstract java.util.Set> supportedOptions(); } @@ -57234,7 +57234,7 @@ package java.nio.channels { method public final java.nio.channels.ServerSocketChannel bind(java.net.SocketAddress) throws java.io.IOException; method public abstract java.nio.channels.ServerSocketChannel bind(java.net.SocketAddress, int) throws java.io.IOException; method public static java.nio.channels.ServerSocketChannel open() throws java.io.IOException; - method public abstract java.nio.channels.ServerSocketChannel setOption(java.net.SocketOption, T) throws java.io.IOException; + method public abstract java.nio.channels.ServerSocketChannel setOption(java.net.SocketOption, T) throws java.io.IOException; method public abstract java.net.ServerSocket socket(); method public final int validOps(); } @@ -57252,7 +57252,7 @@ package java.nio.channels { method public abstract int read(java.nio.ByteBuffer) throws java.io.IOException; method public abstract long read(java.nio.ByteBuffer[], int, int) throws java.io.IOException; method public final long read(java.nio.ByteBuffer[]) throws java.io.IOException; - method public abstract java.nio.channels.SocketChannel setOption(java.net.SocketOption, T) throws java.io.IOException; + method public abstract java.nio.channels.SocketChannel setOption(java.net.SocketOption, T) throws java.io.IOException; method public abstract java.nio.channels.SocketChannel shutdownInput() throws java.io.IOException; method public abstract java.nio.channels.SocketChannel shutdownOutput() throws java.io.IOException; method public abstract java.net.Socket socket(); @@ -57499,12 +57499,12 @@ package java.security { public final class AccessController { method public static void checkPermission(java.security.Permission) throws java.security.AccessControlException; - method public static T doPrivileged(java.security.PrivilegedAction); - method public static T doPrivileged(java.security.PrivilegedAction, java.security.AccessControlContext); - method public static T doPrivileged(java.security.PrivilegedExceptionAction) throws java.security.PrivilegedActionException; - method public static T doPrivileged(java.security.PrivilegedExceptionAction, java.security.AccessControlContext) throws java.security.PrivilegedActionException; - method public static T doPrivilegedWithCombiner(java.security.PrivilegedAction); - method public static T doPrivilegedWithCombiner(java.security.PrivilegedExceptionAction) throws java.security.PrivilegedActionException; + method public static T doPrivileged(java.security.PrivilegedAction); + method public static T doPrivileged(java.security.PrivilegedAction, java.security.AccessControlContext); + method public static T doPrivileged(java.security.PrivilegedExceptionAction) throws java.security.PrivilegedActionException; + method public static T doPrivileged(java.security.PrivilegedExceptionAction, java.security.AccessControlContext) throws java.security.PrivilegedActionException; + method public static T doPrivilegedWithCombiner(java.security.PrivilegedAction); + method public static T doPrivilegedWithCombiner(java.security.PrivilegedExceptionAction) throws java.security.PrivilegedActionException; method public static java.security.AccessControlContext getContext(); } @@ -57543,7 +57543,7 @@ package java.security { method public static java.security.AlgorithmParameters getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException; method public static java.security.AlgorithmParameters getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException; method public static java.security.AlgorithmParameters getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException; - method public final T getParameterSpec(java.lang.Class) throws java.security.spec.InvalidParameterSpecException; + method public final T getParameterSpec(java.lang.Class) throws java.security.spec.InvalidParameterSpecException; method public final java.security.Provider getProvider(); method public final void init(java.security.spec.AlgorithmParameterSpec) throws java.security.spec.InvalidParameterSpecException; method public final void init(byte[]) throws java.io.IOException; @@ -57555,7 +57555,7 @@ package java.security { ctor public AlgorithmParametersSpi(); method protected abstract byte[] engineGetEncoded() throws java.io.IOException; method protected abstract byte[] engineGetEncoded(java.lang.String) throws java.io.IOException; - method protected abstract T engineGetParameterSpec(java.lang.Class) throws java.security.spec.InvalidParameterSpecException; + method protected abstract T engineGetParameterSpec(java.lang.Class) throws java.security.spec.InvalidParameterSpecException; method protected abstract void engineInit(java.security.spec.AlgorithmParameterSpec) throws java.security.spec.InvalidParameterSpecException; method protected abstract void engineInit(byte[]) throws java.io.IOException; method protected abstract void engineInit(byte[], java.lang.String) throws java.io.IOException; @@ -57740,7 +57740,7 @@ package java.security { method public static java.security.KeyFactory getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException; method public static java.security.KeyFactory getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException; method public static java.security.KeyFactory getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException; - method public final T getKeySpec(java.security.Key, java.lang.Class) throws java.security.spec.InvalidKeySpecException; + method public final T getKeySpec(java.security.Key, java.lang.Class) throws java.security.spec.InvalidKeySpecException; method public final java.security.Provider getProvider(); method public final java.security.Key translateKey(java.security.Key) throws java.security.InvalidKeyException; } @@ -57749,7 +57749,7 @@ package java.security { ctor public KeyFactorySpi(); method protected abstract java.security.PrivateKey engineGeneratePrivate(java.security.spec.KeySpec) throws java.security.spec.InvalidKeySpecException; method protected abstract java.security.PublicKey engineGeneratePublic(java.security.spec.KeySpec) throws java.security.spec.InvalidKeySpecException; - method protected abstract T engineGetKeySpec(java.security.Key, java.lang.Class) throws java.security.spec.InvalidKeySpecException; + method protected abstract T engineGetKeySpec(java.security.Key, java.lang.Class) throws java.security.spec.InvalidKeySpecException; method protected abstract java.security.Key engineTranslateKey(java.security.Key) throws java.security.InvalidKeyException; } @@ -58018,7 +58018,7 @@ package java.security { field public static final long serialVersionUID = 6034044314589513430L; // 0x53bd3b559a12c6d6L } - public abstract interface PrivilegedAction { + public abstract interface PrivilegedAction { method public abstract T run(); } @@ -58027,7 +58027,7 @@ package java.security { method public java.lang.Exception getException(); } - public abstract interface PrivilegedExceptionAction { + public abstract interface PrivilegedExceptionAction { method public abstract T run() throws java.lang.Exception; } @@ -60209,11 +60209,11 @@ package java.sql { method public abstract void free() throws java.sql.SQLException; method public abstract java.io.InputStream getBinaryStream() throws java.sql.SQLException; method public abstract java.io.Reader getCharacterStream() throws java.sql.SQLException; - method public abstract T getSource(java.lang.Class) throws java.sql.SQLException; + method public abstract T getSource(java.lang.Class) throws java.sql.SQLException; method public abstract java.lang.String getString() throws java.sql.SQLException; method public abstract java.io.OutputStream setBinaryStream() throws java.sql.SQLException; method public abstract java.io.Writer setCharacterStream() throws java.sql.SQLException; - method public abstract T setResult(java.lang.Class) throws java.sql.SQLException; + method public abstract T setResult(java.lang.Class) throws java.sql.SQLException; method public abstract void setString(java.lang.String) throws java.sql.SQLException; } @@ -60337,7 +60337,7 @@ package java.sql { public abstract interface Wrapper { method public abstract boolean isWrapperFor(java.lang.Class) throws java.sql.SQLException; - method public abstract T unwrap(java.lang.Class) throws java.sql.SQLException; + method public abstract T unwrap(java.lang.Class) throws java.sql.SQLException; } } @@ -60870,7 +60870,7 @@ package java.text { package java.util { - public abstract class AbstractCollection implements java.util.Collection { + public abstract class AbstractCollection implements java.util.Collection { ctor protected AbstractCollection(); method public boolean add(E); method public boolean addAll(java.util.Collection); @@ -60884,10 +60884,10 @@ package java.util { method public boolean retainAll(java.util.Collection); method public abstract int size(); method public java.lang.Object[] toArray(); - method public T[] toArray(T[]); + method public T[] toArray(T[]); } - public abstract class AbstractList extends java.util.AbstractCollection implements java.util.List { + public abstract class AbstractList extends java.util.AbstractCollection implements java.util.List { ctor protected AbstractList(); method public void add(int, E); method public boolean addAll(int, java.util.Collection); @@ -60904,7 +60904,7 @@ package java.util { field protected transient int modCount; } - public abstract class AbstractMap implements java.util.Map { + public abstract class AbstractMap implements java.util.Map { ctor protected AbstractMap(); method public void clear(); method public boolean containsKey(java.lang.Object); @@ -60920,7 +60920,7 @@ package java.util { method public java.util.Collection values(); } - public static class AbstractMap.SimpleEntry implements java.util.Map.Entry java.io.Serializable { + public static class AbstractMap.SimpleEntry implements java.util.Map.Entry java.io.Serializable { ctor public AbstractMap.SimpleEntry(K, V); ctor public AbstractMap.SimpleEntry(java.util.Map.Entry); method public K getKey(); @@ -60928,7 +60928,7 @@ package java.util { method public V setValue(V); } - public static class AbstractMap.SimpleImmutableEntry implements java.util.Map.Entry java.io.Serializable { + public static class AbstractMap.SimpleImmutableEntry implements java.util.Map.Entry java.io.Serializable { ctor public AbstractMap.SimpleImmutableEntry(K, V); ctor public AbstractMap.SimpleImmutableEntry(java.util.Map.Entry); method public K getKey(); @@ -60936,23 +60936,23 @@ package java.util { method public V setValue(V); } - public abstract class AbstractQueue extends java.util.AbstractCollection implements java.util.Queue { + public abstract class AbstractQueue extends java.util.AbstractCollection implements java.util.Queue { ctor protected AbstractQueue(); method public E element(); method public E remove(); } - public abstract class AbstractSequentialList extends java.util.AbstractList { + public abstract class AbstractSequentialList extends java.util.AbstractList { ctor protected AbstractSequentialList(); method public E get(int); method public abstract java.util.ListIterator listIterator(int); } - public abstract class AbstractSet extends java.util.AbstractCollection implements java.util.Set { + public abstract class AbstractSet extends java.util.AbstractCollection implements java.util.Set { ctor protected AbstractSet(); } - public class ArrayDeque extends java.util.AbstractCollection implements java.lang.Cloneable java.util.Deque java.io.Serializable { + public class ArrayDeque extends java.util.AbstractCollection implements java.lang.Cloneable java.util.Deque java.io.Serializable { ctor public ArrayDeque(); ctor public ArrayDeque(int); ctor public ArrayDeque(java.util.Collection); @@ -60984,7 +60984,7 @@ package java.util { method public java.util.Spliterator spliterator(); } - public class ArrayList extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { + public class ArrayList extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { ctor public ArrayList(int); ctor public ArrayList(); ctor public ArrayList(java.util.Collection); @@ -61001,7 +61001,7 @@ package java.util { } public class Arrays { - method public static java.util.List asList(T...); + method public static java.util.List asList(T...); method public static int binarySearch(long[], long); method public static int binarySearch(long[], int, int, long); method public static int binarySearch(int[], int); @@ -61018,10 +61018,10 @@ package java.util { method public static int binarySearch(float[], int, int, float); method public static int binarySearch(java.lang.Object[], java.lang.Object); method public static int binarySearch(java.lang.Object[], int, int, java.lang.Object); - method public static int binarySearch(T[], T, java.util.Comparator); - method public static int binarySearch(T[], int, int, T, java.util.Comparator); - method public static T[] copyOf(T[], int); - method public static T[] copyOf(U[], int, java.lang.Class); + method public static int binarySearch(T[], T, java.util.Comparator); + method public static int binarySearch(T[], int, int, T, java.util.Comparator); + method public static T[] copyOf(T[], int); + method public static T[] copyOf(U[], int, java.lang.Class); method public static byte[] copyOf(byte[], int); method public static short[] copyOf(short[], int); method public static int[] copyOf(int[], int); @@ -61030,8 +61030,8 @@ package java.util { method public static float[] copyOf(float[], int); method public static double[] copyOf(double[], int); method public static boolean[] copyOf(boolean[], int); - method public static T[] copyOfRange(T[], int, int); - method public static T[] copyOfRange(U[], int, int, java.lang.Class); + method public static T[] copyOfRange(T[], int, int); + method public static T[] copyOfRange(U[], int, int, java.lang.Class); method public static byte[] copyOfRange(byte[], int, int); method public static short[] copyOfRange(short[], int, int); method public static int[] copyOfRange(int[], int, int); @@ -61079,15 +61079,15 @@ package java.util { method public static int hashCode(float[]); method public static int hashCode(double[]); method public static int hashCode(java.lang.Object[]); - method public static void parallelPrefix(T[], java.util.function.BinaryOperator); - method public static void parallelPrefix(T[], int, int, java.util.function.BinaryOperator); + method public static void parallelPrefix(T[], java.util.function.BinaryOperator); + method public static void parallelPrefix(T[], int, int, java.util.function.BinaryOperator); method public static void parallelPrefix(long[], java.util.function.LongBinaryOperator); method public static void parallelPrefix(long[], int, int, java.util.function.LongBinaryOperator); method public static void parallelPrefix(double[], java.util.function.DoubleBinaryOperator); method public static void parallelPrefix(double[], int, int, java.util.function.DoubleBinaryOperator); method public static void parallelPrefix(int[], java.util.function.IntBinaryOperator); method public static void parallelPrefix(int[], int, int, java.util.function.IntBinaryOperator); - method public static void parallelSetAll(T[], java.util.function.IntFunction); + method public static void parallelSetAll(T[], java.util.function.IntFunction); method public static void parallelSetAll(int[], java.util.function.IntUnaryOperator); method public static void parallelSetAll(long[], java.util.function.IntToLongFunction); method public static void parallelSetAll(double[], java.util.function.IntToDoubleFunction); @@ -61105,11 +61105,11 @@ package java.util { method public static void parallelSort(float[], int, int); method public static void parallelSort(double[]); method public static void parallelSort(double[], int, int); - method public static void parallelSort(T[]); - method public static void parallelSort(T[], int, int); - method public static void parallelSort(T[], java.util.Comparator); - method public static void parallelSort(T[], int, int, java.util.Comparator); - method public static void setAll(T[], java.util.function.IntFunction); + method public static > void parallelSort(T[]); + method public static > void parallelSort(T[], int, int); + method public static void parallelSort(T[], java.util.Comparator); + method public static void parallelSort(T[], int, int, java.util.Comparator); + method public static void setAll(T[], java.util.function.IntFunction); method public static void setAll(int[], java.util.function.IntUnaryOperator); method public static void setAll(long[], java.util.function.IntToLongFunction); method public static void setAll(double[], java.util.function.IntToDoubleFunction); @@ -61129,18 +61129,18 @@ package java.util { method public static void sort(double[], int, int); method public static void sort(java.lang.Object[]); method public static void sort(java.lang.Object[], int, int); - method public static void sort(T[], java.util.Comparator); - method public static void sort(T[], int, int, java.util.Comparator); - method public static java.util.Spliterator spliterator(T[]); - method public static java.util.Spliterator spliterator(T[], int, int); + method public static void sort(T[], java.util.Comparator); + method public static void sort(T[], int, int, java.util.Comparator); + method public static java.util.Spliterator spliterator(T[]); + method public static java.util.Spliterator spliterator(T[], int, int); method public static java.util.Spliterator.OfInt spliterator(int[]); method public static java.util.Spliterator.OfInt spliterator(int[], int, int); method public static java.util.Spliterator.OfLong spliterator(long[]); method public static java.util.Spliterator.OfLong spliterator(long[], int, int); method public static java.util.Spliterator.OfDouble spliterator(double[]); method public static java.util.Spliterator.OfDouble spliterator(double[], int, int); - method public static java.util.stream.Stream stream(T[]); - method public static java.util.stream.Stream stream(T[], int, int); + method public static java.util.stream.Stream stream(T[]); + method public static java.util.stream.Stream stream(T[], int, int); method public static java.util.stream.IntStream stream(int[]); method public static java.util.stream.IntStream stream(int[], int, int); method public static java.util.stream.LongStream stream(long[]); @@ -61297,7 +61297,7 @@ package java.util { field protected long time; } - public abstract interface Collection implements java.lang.Iterable { + public abstract interface Collection implements java.lang.Iterable { method public abstract boolean add(E); method public abstract boolean addAll(java.util.Collection); method public abstract void clear(); @@ -61315,86 +61315,86 @@ package java.util { method public abstract int size(); method public default java.util.stream.Stream stream(); method public abstract java.lang.Object[] toArray(); - method public abstract T[] toArray(T[]); + method public abstract T[] toArray(T[]); } public class Collections { - method public static boolean addAll(java.util.Collection, T...); - method public static java.util.Queue asLifoQueue(java.util.Deque); - method public static int binarySearch(java.util.List>, T); - method public static int binarySearch(java.util.List, T, java.util.Comparator); - method public static java.util.Collection checkedCollection(java.util.Collection, java.lang.Class); - method public static java.util.List checkedList(java.util.List, java.lang.Class); - method public static java.util.Map checkedMap(java.util.Map, java.lang.Class, java.lang.Class); - method public static java.util.Set checkedSet(java.util.Set, java.lang.Class); - method public static java.util.SortedMap checkedSortedMap(java.util.SortedMap, java.lang.Class, java.lang.Class); - method public static java.util.SortedSet checkedSortedSet(java.util.SortedSet, java.lang.Class); - method public static void copy(java.util.List, java.util.List); + method public static boolean addAll(java.util.Collection, T...); + method public static java.util.Queue asLifoQueue(java.util.Deque); + method public static int binarySearch(java.util.List>, T); + method public static int binarySearch(java.util.List, T, java.util.Comparator); + method public static java.util.Collection checkedCollection(java.util.Collection, java.lang.Class); + method public static java.util.List checkedList(java.util.List, java.lang.Class); + method public static java.util.Map checkedMap(java.util.Map, java.lang.Class, java.lang.Class); + method public static java.util.Set checkedSet(java.util.Set, java.lang.Class); + method public static java.util.SortedMap checkedSortedMap(java.util.SortedMap, java.lang.Class, java.lang.Class); + method public static java.util.SortedSet checkedSortedSet(java.util.SortedSet, java.lang.Class); + method public static void copy(java.util.List, java.util.List); method public static boolean disjoint(java.util.Collection, java.util.Collection); - method public static java.util.Enumeration emptyEnumeration(); - method public static java.util.Iterator emptyIterator(); - method public static final java.util.List emptyList(); - method public static java.util.ListIterator emptyListIterator(); - method public static final java.util.Map emptyMap(); - method public static final java.util.Set emptySet(); - method public static java.util.Enumeration enumeration(java.util.Collection); - method public static void fill(java.util.List, T); + method public static java.util.Enumeration emptyEnumeration(); + method public static java.util.Iterator emptyIterator(); + method public static final java.util.List emptyList(); + method public static java.util.ListIterator emptyListIterator(); + method public static final java.util.Map emptyMap(); + method public static final java.util.Set emptySet(); + method public static java.util.Enumeration enumeration(java.util.Collection); + method public static void fill(java.util.List, T); method public static int frequency(java.util.Collection, java.lang.Object); method public static int indexOfSubList(java.util.List, java.util.List); method public static int lastIndexOfSubList(java.util.List, java.util.List); - method public static java.util.ArrayList list(java.util.Enumeration); - method public static T max(java.util.Collection); - method public static T max(java.util.Collection, java.util.Comparator); - method public static T min(java.util.Collection); - method public static T min(java.util.Collection, java.util.Comparator); - method public static java.util.List nCopies(int, T); - method public static java.util.Set newSetFromMap(java.util.Map); - method public static boolean replaceAll(java.util.List, T, T); + method public static java.util.ArrayList list(java.util.Enumeration); + method public static > T max(java.util.Collection); + method public static T max(java.util.Collection, java.util.Comparator); + method public static > T min(java.util.Collection); + method public static T min(java.util.Collection, java.util.Comparator); + method public static java.util.List nCopies(int, T); + method public static java.util.Set newSetFromMap(java.util.Map); + method public static boolean replaceAll(java.util.List, T, T); method public static void reverse(java.util.List); - method public static java.util.Comparator reverseOrder(); - method public static java.util.Comparator reverseOrder(java.util.Comparator); + method public static java.util.Comparator reverseOrder(); + method public static java.util.Comparator reverseOrder(java.util.Comparator); method public static void rotate(java.util.List, int); method public static void shuffle(java.util.List); method public static void shuffle(java.util.List, java.util.Random); - method public static java.util.Set singleton(E); - method public static java.util.List singletonList(E); - method public static java.util.Map singletonMap(K, V); - method public static void sort(java.util.List); - method public static void sort(java.util.List, java.util.Comparator); + method public static java.util.Set singleton(E); + method public static java.util.List singletonList(E); + method public static java.util.Map singletonMap(K, V); + method public static > void sort(java.util.List); + method public static void sort(java.util.List, java.util.Comparator); method public static void swap(java.util.List, int, int); - method public static java.util.Collection synchronizedCollection(java.util.Collection); - method public static java.util.List synchronizedList(java.util.List); - method public static java.util.Map synchronizedMap(java.util.Map); - method public static java.util.Set synchronizedSet(java.util.Set); - method public static java.util.SortedMap synchronizedSortedMap(java.util.SortedMap); - method public static java.util.SortedSet synchronizedSortedSet(java.util.SortedSet); - method public static java.util.Collection unmodifiableCollection(java.util.Collection); - method public static java.util.List unmodifiableList(java.util.List); - method public static java.util.Map unmodifiableMap(java.util.Map); - method public static java.util.Set unmodifiableSet(java.util.Set); - method public static java.util.SortedMap unmodifiableSortedMap(java.util.SortedMap); - method public static java.util.SortedSet unmodifiableSortedSet(java.util.SortedSet); + method public static java.util.Collection synchronizedCollection(java.util.Collection); + method public static java.util.List synchronizedList(java.util.List); + method public static java.util.Map synchronizedMap(java.util.Map); + method public static java.util.Set synchronizedSet(java.util.Set); + method public static java.util.SortedMap synchronizedSortedMap(java.util.SortedMap); + method public static java.util.SortedSet synchronizedSortedSet(java.util.SortedSet); + method public static java.util.Collection unmodifiableCollection(java.util.Collection); + method public static java.util.List unmodifiableList(java.util.List); + method public static java.util.Map unmodifiableMap(java.util.Map); + method public static java.util.Set unmodifiableSet(java.util.Set); + method public static java.util.SortedMap unmodifiableSortedMap(java.util.SortedMap); + method public static java.util.SortedSet unmodifiableSortedSet(java.util.SortedSet); field public static final java.util.List EMPTY_LIST; field public static final java.util.Map EMPTY_MAP; field public static final java.util.Set EMPTY_SET; } - public abstract interface Comparator { + public abstract interface Comparator { method public abstract int compare(T, T); - method public static java.util.Comparator comparing(java.util.function.Function, java.util.Comparator); - method public static java.util.Comparator comparing(java.util.function.Function); - method public static java.util.Comparator comparingDouble(java.util.function.ToDoubleFunction); - method public static java.util.Comparator comparingInt(java.util.function.ToIntFunction); - method public static java.util.Comparator comparingLong(java.util.function.ToLongFunction); + method public static java.util.Comparator comparing(java.util.function.Function, java.util.Comparator); + method public static > java.util.Comparator comparing(java.util.function.Function); + method public static java.util.Comparator comparingDouble(java.util.function.ToDoubleFunction); + method public static java.util.Comparator comparingInt(java.util.function.ToIntFunction); + method public static java.util.Comparator comparingLong(java.util.function.ToLongFunction); method public abstract boolean equals(java.lang.Object); - method public static java.util.Comparator naturalOrder(); - method public static java.util.Comparator nullsFirst(java.util.Comparator); - method public static java.util.Comparator nullsLast(java.util.Comparator); - method public static java.util.Comparator reverseOrder(); + method public static > java.util.Comparator naturalOrder(); + method public static java.util.Comparator nullsFirst(java.util.Comparator); + method public static java.util.Comparator nullsLast(java.util.Comparator); + method public static > java.util.Comparator reverseOrder(); method public default java.util.Comparator reversed(); method public default java.util.Comparator thenComparing(java.util.Comparator); - method public default java.util.Comparator thenComparing(java.util.function.Function, java.util.Comparator); - method public default java.util.Comparator thenComparing(java.util.function.Function); + method public default java.util.Comparator thenComparing(java.util.function.Function, java.util.Comparator); + method public default > java.util.Comparator thenComparing(java.util.function.Function); method public default java.util.Comparator thenComparingDouble(java.util.function.ToDoubleFunction); method public default java.util.Comparator thenComparingInt(java.util.function.ToIntFunction); method public default java.util.Comparator thenComparingLong(java.util.function.ToLongFunction); @@ -61453,7 +61453,7 @@ package java.util { method public deprecated java.lang.String toLocaleString(); } - public abstract interface Deque implements java.util.Queue { + public abstract interface Deque implements java.util.Queue { method public abstract boolean add(E); method public abstract void addFirst(E); method public abstract void addLast(E); @@ -61483,7 +61483,7 @@ package java.util { method public abstract int size(); } - public abstract class Dictionary { + public abstract class Dictionary { ctor public Dictionary(); method public abstract java.util.Enumeration elements(); method public abstract V get(java.lang.Object); @@ -61514,7 +61514,7 @@ package java.util { ctor public EmptyStackException(); } - public class EnumMap extends java.util.AbstractMap implements java.lang.Cloneable java.io.Serializable { + public class EnumMap, V> extends java.util.AbstractMap implements java.lang.Cloneable java.io.Serializable { ctor public EnumMap(java.lang.Class); ctor public EnumMap(java.util.EnumMap); ctor public EnumMap(java.util.Map); @@ -61522,23 +61522,23 @@ package java.util { method public java.util.Set> entrySet(); } - public abstract class EnumSet extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable { - method public static java.util.EnumSet allOf(java.lang.Class); + public abstract class EnumSet> extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable { + method public static > java.util.EnumSet allOf(java.lang.Class); method public java.util.EnumSet clone(); - method public static java.util.EnumSet complementOf(java.util.EnumSet); - method public static java.util.EnumSet copyOf(java.util.EnumSet); - method public static java.util.EnumSet copyOf(java.util.Collection); - method public static java.util.EnumSet noneOf(java.lang.Class); - method public static java.util.EnumSet of(E); - method public static java.util.EnumSet of(E, E); - method public static java.util.EnumSet of(E, E, E); - method public static java.util.EnumSet of(E, E, E, E); - method public static java.util.EnumSet of(E, E, E, E, E); - method public static java.util.EnumSet of(E, E...); - method public static java.util.EnumSet range(E, E); - } - - public abstract interface Enumeration { + method public static > java.util.EnumSet complementOf(java.util.EnumSet); + method public static > java.util.EnumSet copyOf(java.util.EnumSet); + method public static > java.util.EnumSet copyOf(java.util.Collection); + method public static > java.util.EnumSet noneOf(java.lang.Class); + method public static > java.util.EnumSet of(E); + method public static > java.util.EnumSet of(E, E); + method public static > java.util.EnumSet of(E, E, E); + method public static > java.util.EnumSet of(E, E, E, E); + method public static > java.util.EnumSet of(E, E, E, E, E); + method public static > java.util.EnumSet of(E, E...); + method public static > java.util.EnumSet range(E, E); + } + + public abstract interface Enumeration { method public abstract boolean hasMoreElements(); method public abstract E nextElement(); } @@ -61546,7 +61546,7 @@ package java.util { public abstract interface EventListener { } - public abstract class EventListenerProxy implements java.util.EventListener { + public abstract class EventListenerProxy implements java.util.EventListener { ctor public EventListenerProxy(T); method public T getListener(); } @@ -61632,7 +61632,7 @@ package java.util { field public static final int BC = 0; // 0x0 } - public class HashMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable { + public class HashMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable { ctor public HashMap(int, float); ctor public HashMap(int); ctor public HashMap(); @@ -61644,7 +61644,7 @@ package java.util { method public void replaceAll(java.util.function.BiFunction); } - public class HashSet extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable java.util.Set { + public class HashSet extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable java.util.Set { ctor public HashSet(); ctor public HashSet(java.util.Collection); ctor public HashSet(int, float); @@ -61655,7 +61655,7 @@ package java.util { method public java.util.Spliterator spliterator(); } - public class Hashtable extends java.util.Dictionary implements java.lang.Cloneable java.util.Map java.io.Serializable { + public class Hashtable extends java.util.Dictionary implements java.lang.Cloneable java.util.Map java.io.Serializable { ctor public Hashtable(int, float); ctor public Hashtable(int); ctor public Hashtable(); @@ -61690,7 +61690,7 @@ package java.util { method public java.util.Collection values(); } - public class IdentityHashMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable { + public class IdentityHashMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable { ctor public IdentityHashMap(); ctor public IdentityHashMap(int); ctor public IdentityHashMap(java.util.Map); @@ -61757,14 +61757,14 @@ package java.util { ctor public InvalidPropertiesFormatException(java.lang.String); } - public abstract interface Iterator { + public abstract interface Iterator { method public default void forEachRemaining(java.util.function.Consumer); method public abstract boolean hasNext(); method public abstract E next(); method public default void remove(); } - public class LinkedHashMap extends java.util.HashMap implements java.util.Map { + public class LinkedHashMap extends java.util.HashMap implements java.util.Map { ctor public LinkedHashMap(int, float); ctor public LinkedHashMap(int); ctor public LinkedHashMap(); @@ -61773,14 +61773,14 @@ package java.util { method protected boolean removeEldestEntry(java.util.Map.Entry); } - public class LinkedHashSet extends java.util.HashSet implements java.lang.Cloneable java.io.Serializable java.util.Set { + public class LinkedHashSet extends java.util.HashSet implements java.lang.Cloneable java.io.Serializable java.util.Set { ctor public LinkedHashSet(int, float); ctor public LinkedHashSet(int); ctor public LinkedHashSet(); ctor public LinkedHashSet(java.util.Collection); } - public class LinkedList extends java.util.AbstractSequentialList implements java.lang.Cloneable java.util.Deque java.util.List java.io.Serializable { + public class LinkedList extends java.util.AbstractSequentialList implements java.lang.Cloneable java.util.Deque java.util.List java.io.Serializable { ctor public LinkedList(); ctor public LinkedList(java.util.Collection); method public void addFirst(E); @@ -61811,7 +61811,7 @@ package java.util { method public java.util.Spliterator spliterator(); } - public abstract interface List implements java.util.Collection { + public abstract interface List implements java.util.Collection { method public abstract boolean add(E); method public abstract void add(int, E); method public abstract boolean addAll(java.util.Collection); @@ -61838,10 +61838,10 @@ package java.util { method public default void sort(java.util.Comparator); method public abstract java.util.List subList(int, int); method public abstract java.lang.Object[] toArray(); - method public abstract T[] toArray(T[]); + method public abstract T[] toArray(T[]); } - public abstract interface ListIterator implements java.util.Iterator { + public abstract interface ListIterator implements java.util.Iterator { method public abstract void add(E); method public abstract boolean hasNext(); method public abstract boolean hasPrevious(); @@ -61958,7 +61958,7 @@ package java.util { method public final long getSum(); } - public abstract interface Map { + public abstract interface Map { method public abstract void clear(); method public default V compute(K, java.util.function.BiFunction); method public default V computeIfAbsent(K, java.util.function.Function); @@ -61986,11 +61986,11 @@ package java.util { method public abstract java.util.Collection values(); } - public static abstract interface Map.Entry { - method public static java.util.Comparator> comparingByKey(); - method public static java.util.Comparator> comparingByKey(java.util.Comparator); - method public static java.util.Comparator> comparingByValue(); - method public static java.util.Comparator> comparingByValue(java.util.Comparator); + public static abstract interface Map.Entry { + method public static , V> java.util.Comparator> comparingByKey(); + method public static java.util.Comparator> comparingByKey(java.util.Comparator); + method public static > java.util.Comparator> comparingByValue(); + method public static java.util.Comparator> comparingByValue(java.util.Comparator); method public abstract boolean equals(java.lang.Object); method public abstract K getKey(); method public abstract V getValue(); @@ -62014,7 +62014,7 @@ package java.util { method public java.lang.String getKey(); } - public abstract interface NavigableMap implements java.util.SortedMap { + public abstract interface NavigableMap implements java.util.SortedMap { method public abstract java.util.Map.Entry ceilingEntry(K); method public abstract K ceilingKey(K); method public abstract java.util.NavigableSet descendingKeySet(); @@ -62038,7 +62038,7 @@ package java.util { method public abstract java.util.SortedMap tailMap(K); } - public abstract interface NavigableSet implements java.util.SortedSet { + public abstract interface NavigableSet implements java.util.SortedSet { method public abstract E ceiling(E); method public abstract java.util.Iterator descendingIterator(); method public abstract java.util.NavigableSet descendingSet(); @@ -62062,16 +62062,16 @@ package java.util { } public final class Objects { - method public static int compare(T, T, java.util.Comparator); + method public static int compare(T, T, java.util.Comparator); method public static boolean deepEquals(java.lang.Object, java.lang.Object); method public static boolean equals(java.lang.Object, java.lang.Object); method public static int hash(java.lang.Object...); method public static int hashCode(java.lang.Object); method public static boolean isNull(java.lang.Object); method public static boolean nonNull(java.lang.Object); - method public static T requireNonNull(T); - method public static T requireNonNull(T, java.lang.String); - method public static T requireNonNull(T, java.util.function.Supplier); + method public static T requireNonNull(T); + method public static T requireNonNull(T, java.lang.String); + method public static T requireNonNull(T, java.util.function.Supplier); method public static java.lang.String toString(java.lang.Object); method public static java.lang.String toString(java.lang.Object, java.lang.String); } @@ -62093,19 +62093,19 @@ package java.util { method public abstract void update(java.util.Observable, java.lang.Object); } - public final class Optional { - method public static java.util.Optional empty(); + public final class Optional { + method public static java.util.Optional empty(); method public java.util.Optional filter(java.util.function.Predicate); - method public java.util.Optional flatMap(java.util.function.Function>); + method public java.util.Optional flatMap(java.util.function.Function>); method public T get(); method public void ifPresent(java.util.function.Consumer); method public boolean isPresent(); - method public java.util.Optional map(java.util.function.Function); - method public static java.util.Optional of(T); - method public static java.util.Optional ofNullable(T); + method public java.util.Optional map(java.util.function.Function); + method public static java.util.Optional of(T); + method public static java.util.Optional ofNullable(T); method public T orElse(T); method public T orElseGet(java.util.function.Supplier); - method public T orElseThrow(java.util.function.Supplier) throws java.lang.Throwable; + method public T orElseThrow(java.util.function.Supplier) throws java.lang.Throwable; } public final class OptionalDouble { @@ -62116,7 +62116,7 @@ package java.util { method public static java.util.OptionalDouble of(double); method public double orElse(double); method public double orElseGet(java.util.function.DoubleSupplier); - method public double orElseThrow(java.util.function.Supplier) throws java.lang.Throwable; + method public double orElseThrow(java.util.function.Supplier) throws java.lang.Throwable; } public final class OptionalInt { @@ -62127,7 +62127,7 @@ package java.util { method public static java.util.OptionalInt of(int); method public int orElse(int); method public int orElseGet(java.util.function.IntSupplier); - method public int orElseThrow(java.util.function.Supplier) throws java.lang.Throwable; + method public int orElseThrow(java.util.function.Supplier) throws java.lang.Throwable; } public final class OptionalLong { @@ -62138,10 +62138,10 @@ package java.util { method public static java.util.OptionalLong of(long); method public long orElse(long); method public long orElseGet(java.util.function.LongSupplier); - method public long orElseThrow(java.util.function.Supplier) throws java.lang.Throwable; + method public long orElseThrow(java.util.function.Supplier) throws java.lang.Throwable; } - public abstract interface PrimitiveIterator implements java.util.Iterator { + public abstract interface PrimitiveIterator implements java.util.Iterator { method public abstract void forEachRemaining(T_CONS); } @@ -62166,7 +62166,7 @@ package java.util { method public abstract long nextLong(); } - public class PriorityQueue extends java.util.AbstractQueue implements java.io.Serializable { + public class PriorityQueue extends java.util.AbstractQueue implements java.io.Serializable { ctor public PriorityQueue(); ctor public PriorityQueue(int); ctor public PriorityQueue(java.util.Comparator); @@ -62215,7 +62215,7 @@ package java.util { method public java.lang.Object handleGetObject(java.lang.String); } - public abstract interface Queue implements java.util.Collection { + public abstract interface Queue implements java.util.Collection { method public abstract boolean add(E); method public abstract E element(); method public abstract boolean offer(E); @@ -62365,15 +62365,15 @@ package java.util { ctor public ServiceConfigurationError(java.lang.String, java.lang.Throwable); } - public final class ServiceLoader implements java.lang.Iterable { + public final class ServiceLoader implements java.lang.Iterable { method public java.util.Iterator iterator(); - method public static java.util.ServiceLoader load(java.lang.Class, java.lang.ClassLoader); - method public static java.util.ServiceLoader load(java.lang.Class); - method public static java.util.ServiceLoader loadInstalled(java.lang.Class); + method public static java.util.ServiceLoader load(java.lang.Class, java.lang.ClassLoader); + method public static java.util.ServiceLoader load(java.lang.Class); + method public static java.util.ServiceLoader loadInstalled(java.lang.Class); method public void reload(); } - public abstract interface Set implements java.util.Collection { + public abstract interface Set implements java.util.Collection { method public abstract boolean add(E); method public abstract boolean addAll(java.util.Collection); method public abstract void clear(); @@ -62388,7 +62388,7 @@ package java.util { method public abstract boolean retainAll(java.util.Collection); method public abstract int size(); method public abstract java.lang.Object[] toArray(); - method public abstract T[] toArray(T[]); + method public abstract T[] toArray(T[]); } public class SimpleTimeZone extends java.util.TimeZone { @@ -62414,7 +62414,7 @@ package java.util { field public static final int WALL_TIME = 0; // 0x0 } - public abstract interface SortedMap implements java.util.Map { + public abstract interface SortedMap implements java.util.Map { method public abstract java.util.Comparator comparator(); method public abstract java.util.Set> entrySet(); method public abstract K firstKey(); @@ -62426,7 +62426,7 @@ package java.util { method public abstract java.util.Collection values(); } - public abstract interface SortedSet implements java.util.Set { + public abstract interface SortedSet implements java.util.Set { method public abstract java.util.Comparator comparator(); method public abstract E first(); method public abstract java.util.SortedSet headSet(E); @@ -62435,7 +62435,7 @@ package java.util { method public abstract java.util.SortedSet tailSet(E); } - public abstract interface Spliterator { + public abstract interface Spliterator { method public abstract int characteristics(); method public abstract long estimateSize(); method public default void forEachRemaining(java.util.function.Consumer); @@ -62478,7 +62478,7 @@ package java.util { method public abstract java.util.Spliterator.OfLong trySplit(); } - public static abstract interface Spliterator.OfPrimitive implements java.util.Spliterator { + public static abstract interface Spliterator.OfPrimitive> implements java.util.Spliterator { method public default void forEachRemaining(T_CONS); method public abstract boolean tryAdvance(T_CONS); method public abstract T_SPLITR trySplit(); @@ -62488,25 +62488,25 @@ package java.util { method public static java.util.Spliterator.OfDouble emptyDoubleSpliterator(); method public static java.util.Spliterator.OfInt emptyIntSpliterator(); method public static java.util.Spliterator.OfLong emptyLongSpliterator(); - method public static java.util.Spliterator emptySpliterator(); - method public static java.util.Iterator iterator(java.util.Spliterator); + method public static java.util.Spliterator emptySpliterator(); + method public static java.util.Iterator iterator(java.util.Spliterator); method public static java.util.PrimitiveIterator.OfInt iterator(java.util.Spliterator.OfInt); method public static java.util.PrimitiveIterator.OfLong iterator(java.util.Spliterator.OfLong); method public static java.util.PrimitiveIterator.OfDouble iterator(java.util.Spliterator.OfDouble); - method public static java.util.Spliterator spliterator(java.lang.Object[], int); - method public static java.util.Spliterator spliterator(java.lang.Object[], int, int, int); + method public static java.util.Spliterator spliterator(java.lang.Object[], int); + method public static java.util.Spliterator spliterator(java.lang.Object[], int, int, int); method public static java.util.Spliterator.OfInt spliterator(int[], int); method public static java.util.Spliterator.OfInt spliterator(int[], int, int, int); method public static java.util.Spliterator.OfLong spliterator(long[], int); method public static java.util.Spliterator.OfLong spliterator(long[], int, int, int); method public static java.util.Spliterator.OfDouble spliterator(double[], int); method public static java.util.Spliterator.OfDouble spliterator(double[], int, int, int); - method public static java.util.Spliterator spliterator(java.util.Collection, int); - method public static java.util.Spliterator spliterator(java.util.Iterator, long, int); + method public static java.util.Spliterator spliterator(java.util.Collection, int); + method public static java.util.Spliterator spliterator(java.util.Iterator, long, int); method public static java.util.Spliterator.OfInt spliterator(java.util.PrimitiveIterator.OfInt, long, int); method public static java.util.Spliterator.OfLong spliterator(java.util.PrimitiveIterator.OfLong, long, int); method public static java.util.Spliterator.OfDouble spliterator(java.util.PrimitiveIterator.OfDouble, long, int); - method public static java.util.Spliterator spliteratorUnknownSize(java.util.Iterator, int); + method public static java.util.Spliterator spliteratorUnknownSize(java.util.Iterator, int); method public static java.util.Spliterator.OfInt spliteratorUnknownSize(java.util.PrimitiveIterator.OfInt, int); method public static java.util.Spliterator.OfLong spliteratorUnknownSize(java.util.PrimitiveIterator.OfLong, int); method public static java.util.Spliterator.OfDouble spliteratorUnknownSize(java.util.PrimitiveIterator.OfDouble, int); @@ -62533,7 +62533,7 @@ package java.util { method public java.util.Spliterator.OfLong trySplit(); } - public static abstract class Spliterators.AbstractSpliterator implements java.util.Spliterator { + public static abstract class Spliterators.AbstractSpliterator implements java.util.Spliterator { ctor protected Spliterators.AbstractSpliterator(long, int); method public int characteristics(); method public long estimateSize(); @@ -62568,7 +62568,7 @@ package java.util { method public java.util.SplittableRandom split(); } - public class Stack extends java.util.Vector { + public class Stack extends java.util.Vector { ctor public Stack(); method public boolean empty(); method public synchronized E peek(); @@ -62652,7 +62652,7 @@ package java.util { ctor public TooManyListenersException(java.lang.String); } - public class TreeMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.NavigableMap java.io.Serializable { + public class TreeMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.NavigableMap java.io.Serializable { ctor public TreeMap(); ctor public TreeMap(java.util.Comparator); ctor public TreeMap(java.util.Map); @@ -62689,7 +62689,7 @@ package java.util { method public java.util.SortedMap tailMap(K); } - public class TreeSet extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable { + public class TreeSet extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable { ctor public TreeSet(); ctor public TreeSet(java.util.Comparator); ctor public TreeSet(java.util.Collection); @@ -62742,7 +62742,7 @@ package java.util { method public java.lang.String getFlags(); } - public class Vector extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { + public class Vector extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { ctor public Vector(int, int); ctor public Vector(int); ctor public Vector(); @@ -62777,7 +62777,7 @@ package java.util { field protected java.lang.Object[] elementData; } - public class WeakHashMap extends java.util.AbstractMap implements java.util.Map { + public class WeakHashMap extends java.util.AbstractMap implements java.util.Map { ctor public WeakHashMap(int, float); ctor public WeakHashMap(int); ctor public WeakHashMap(); @@ -62793,18 +62793,18 @@ package java.util.concurrent { public abstract class AbstractExecutorService implements java.util.concurrent.ExecutorService { ctor public AbstractExecutorService(); - method public java.util.List> invokeAll(java.util.Collection>) throws java.lang.InterruptedException; - method public java.util.List> invokeAll(java.util.Collection>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; - method public T invokeAny(java.util.Collection>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; - method public T invokeAny(java.util.Collection>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; - method protected java.util.concurrent.RunnableFuture newTaskFor(java.lang.Runnable, T); - method protected java.util.concurrent.RunnableFuture newTaskFor(java.util.concurrent.Callable); + method public java.util.List> invokeAll(java.util.Collection>) throws java.lang.InterruptedException; + method public java.util.List> invokeAll(java.util.Collection>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; + method public T invokeAny(java.util.Collection>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; + method public T invokeAny(java.util.Collection>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; + method protected java.util.concurrent.RunnableFuture newTaskFor(java.lang.Runnable, T); + method protected java.util.concurrent.RunnableFuture newTaskFor(java.util.concurrent.Callable); method public java.util.concurrent.Future submit(java.lang.Runnable); - method public java.util.concurrent.Future submit(java.lang.Runnable, T); - method public java.util.concurrent.Future submit(java.util.concurrent.Callable); + method public java.util.concurrent.Future submit(java.lang.Runnable, T); + method public java.util.concurrent.Future submit(java.util.concurrent.Callable); } - public class ArrayBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { + public class ArrayBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { ctor public ArrayBlockingQueue(int); ctor public ArrayBlockingQueue(int, boolean); ctor public ArrayBlockingQueue(int, boolean, java.util.Collection); @@ -62823,7 +62823,7 @@ package java.util.concurrent { method public E take() throws java.lang.InterruptedException; } - public abstract interface BlockingDeque implements java.util.concurrent.BlockingQueue java.util.Deque { + public abstract interface BlockingDeque implements java.util.concurrent.BlockingQueue java.util.Deque { method public abstract boolean add(E); method public abstract void addFirst(E); method public abstract void addLast(E); @@ -62855,7 +62855,7 @@ package java.util.concurrent { method public abstract E takeLast() throws java.lang.InterruptedException; } - public abstract interface BlockingQueue implements java.util.Queue { + public abstract interface BlockingQueue implements java.util.Queue { method public abstract boolean add(E); method public abstract boolean contains(java.lang.Object); method public abstract int drainTo(java.util.Collection); @@ -62874,7 +62874,7 @@ package java.util.concurrent { ctor public BrokenBarrierException(java.lang.String); } - public abstract interface Callable { + public abstract interface Callable { method public abstract V call() throws java.lang.Exception; } @@ -62883,28 +62883,28 @@ package java.util.concurrent { ctor public CancellationException(java.lang.String); } - public class CompletableFuture implements java.util.concurrent.CompletionStage java.util.concurrent.Future { + public class CompletableFuture implements java.util.concurrent.CompletionStage java.util.concurrent.Future { ctor public CompletableFuture(); method public java.util.concurrent.CompletableFuture acceptEither(java.util.concurrent.CompletionStage, java.util.function.Consumer); method public java.util.concurrent.CompletableFuture acceptEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Consumer); method public java.util.concurrent.CompletableFuture acceptEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Consumer, java.util.concurrent.Executor); method public static java.util.concurrent.CompletableFuture allOf(java.util.concurrent.CompletableFuture...); method public static java.util.concurrent.CompletableFuture anyOf(java.util.concurrent.CompletableFuture...); - method public java.util.concurrent.CompletableFuture applyToEither(java.util.concurrent.CompletionStage, java.util.function.Function); - method public java.util.concurrent.CompletableFuture applyToEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Function); - method public java.util.concurrent.CompletableFuture applyToEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Function, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture applyToEither(java.util.concurrent.CompletionStage, java.util.function.Function); + method public java.util.concurrent.CompletableFuture applyToEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Function); + method public java.util.concurrent.CompletableFuture applyToEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Function, java.util.concurrent.Executor); method public boolean cancel(boolean); method public boolean complete(T); method public boolean completeExceptionally(java.lang.Throwable); - method public static java.util.concurrent.CompletableFuture completedFuture(U); + method public static java.util.concurrent.CompletableFuture completedFuture(U); method public java.util.concurrent.CompletableFuture exceptionally(java.util.function.Function); method public T get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; method public T get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; method public T getNow(T); method public int getNumberOfDependents(); - method public java.util.concurrent.CompletableFuture handle(java.util.function.BiFunction); - method public java.util.concurrent.CompletableFuture handleAsync(java.util.function.BiFunction); - method public java.util.concurrent.CompletableFuture handleAsync(java.util.function.BiFunction, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture handle(java.util.function.BiFunction); + method public java.util.concurrent.CompletableFuture handleAsync(java.util.function.BiFunction); + method public java.util.concurrent.CompletableFuture handleAsync(java.util.function.BiFunction, java.util.concurrent.Executor); method public boolean isCancelled(); method public boolean isCompletedExceptionally(); method public boolean isDone(); @@ -62919,23 +62919,23 @@ package java.util.concurrent { method public java.util.concurrent.CompletableFuture runAfterEitherAsync(java.util.concurrent.CompletionStage, java.lang.Runnable, java.util.concurrent.Executor); method public static java.util.concurrent.CompletableFuture runAsync(java.lang.Runnable); method public static java.util.concurrent.CompletableFuture runAsync(java.lang.Runnable, java.util.concurrent.Executor); - method public static java.util.concurrent.CompletableFuture supplyAsync(java.util.function.Supplier); - method public static java.util.concurrent.CompletableFuture supplyAsync(java.util.function.Supplier, java.util.concurrent.Executor); + method public static java.util.concurrent.CompletableFuture supplyAsync(java.util.function.Supplier); + method public static java.util.concurrent.CompletableFuture supplyAsync(java.util.function.Supplier, java.util.concurrent.Executor); method public java.util.concurrent.CompletableFuture thenAccept(java.util.function.Consumer); method public java.util.concurrent.CompletableFuture thenAcceptAsync(java.util.function.Consumer); method public java.util.concurrent.CompletableFuture thenAcceptAsync(java.util.function.Consumer, java.util.concurrent.Executor); - method public java.util.concurrent.CompletableFuture thenAcceptBoth(java.util.concurrent.CompletionStage, java.util.function.BiConsumer); - method public java.util.concurrent.CompletableFuture thenAcceptBothAsync(java.util.concurrent.CompletionStage, java.util.function.BiConsumer); - method public java.util.concurrent.CompletableFuture thenAcceptBothAsync(java.util.concurrent.CompletionStage, java.util.function.BiConsumer, java.util.concurrent.Executor); - method public java.util.concurrent.CompletableFuture thenApply(java.util.function.Function); - method public java.util.concurrent.CompletableFuture thenApplyAsync(java.util.function.Function); - method public java.util.concurrent.CompletableFuture thenApplyAsync(java.util.function.Function, java.util.concurrent.Executor); - method public java.util.concurrent.CompletableFuture thenCombine(java.util.concurrent.CompletionStage, java.util.function.BiFunction); - method public java.util.concurrent.CompletableFuture thenCombineAsync(java.util.concurrent.CompletionStage, java.util.function.BiFunction); - method public java.util.concurrent.CompletableFuture thenCombineAsync(java.util.concurrent.CompletionStage, java.util.function.BiFunction, java.util.concurrent.Executor); - method public java.util.concurrent.CompletableFuture thenCompose(java.util.function.Function>); - method public java.util.concurrent.CompletableFuture thenComposeAsync(java.util.function.Function>); - method public java.util.concurrent.CompletableFuture thenComposeAsync(java.util.function.Function>, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture thenAcceptBoth(java.util.concurrent.CompletionStage, java.util.function.BiConsumer); + method public java.util.concurrent.CompletableFuture thenAcceptBothAsync(java.util.concurrent.CompletionStage, java.util.function.BiConsumer); + method public java.util.concurrent.CompletableFuture thenAcceptBothAsync(java.util.concurrent.CompletionStage, java.util.function.BiConsumer, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture thenApply(java.util.function.Function); + method public java.util.concurrent.CompletableFuture thenApplyAsync(java.util.function.Function); + method public java.util.concurrent.CompletableFuture thenApplyAsync(java.util.function.Function, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture thenCombine(java.util.concurrent.CompletionStage, java.util.function.BiFunction); + method public java.util.concurrent.CompletableFuture thenCombineAsync(java.util.concurrent.CompletionStage, java.util.function.BiFunction); + method public java.util.concurrent.CompletableFuture thenCombineAsync(java.util.concurrent.CompletionStage, java.util.function.BiFunction, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture thenCompose(java.util.function.Function>); + method public java.util.concurrent.CompletableFuture thenComposeAsync(java.util.function.Function>); + method public java.util.concurrent.CompletableFuture thenComposeAsync(java.util.function.Function>, java.util.concurrent.Executor); method public java.util.concurrent.CompletableFuture thenRun(java.lang.Runnable); method public java.util.concurrent.CompletableFuture thenRunAsync(java.lang.Runnable); method public java.util.concurrent.CompletableFuture thenRunAsync(java.lang.Runnable, java.util.concurrent.Executor); @@ -62955,7 +62955,7 @@ package java.util.concurrent { ctor public CompletionException(java.lang.Throwable); } - public abstract interface CompletionService { + public abstract interface CompletionService { method public abstract java.util.concurrent.Future poll(); method public abstract java.util.concurrent.Future poll(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; method public abstract java.util.concurrent.Future submit(java.util.concurrent.Callable); @@ -62963,17 +62963,17 @@ package java.util.concurrent { method public abstract java.util.concurrent.Future take() throws java.lang.InterruptedException; } - public abstract interface CompletionStage { + public abstract interface CompletionStage { method public abstract java.util.concurrent.CompletionStage acceptEither(java.util.concurrent.CompletionStage, java.util.function.Consumer); method public abstract java.util.concurrent.CompletionStage acceptEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Consumer); method public abstract java.util.concurrent.CompletionStage acceptEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Consumer, java.util.concurrent.Executor); - method public abstract java.util.concurrent.CompletionStage applyToEither(java.util.concurrent.CompletionStage, java.util.function.Function); - method public abstract java.util.concurrent.CompletionStage applyToEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Function); - method public abstract java.util.concurrent.CompletionStage applyToEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Function, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage applyToEither(java.util.concurrent.CompletionStage, java.util.function.Function); + method public abstract java.util.concurrent.CompletionStage applyToEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Function); + method public abstract java.util.concurrent.CompletionStage applyToEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Function, java.util.concurrent.Executor); method public abstract java.util.concurrent.CompletionStage exceptionally(java.util.function.Function); - method public abstract java.util.concurrent.CompletionStage handle(java.util.function.BiFunction); - method public abstract java.util.concurrent.CompletionStage handleAsync(java.util.function.BiFunction); - method public abstract java.util.concurrent.CompletionStage handleAsync(java.util.function.BiFunction, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage handle(java.util.function.BiFunction); + method public abstract java.util.concurrent.CompletionStage handleAsync(java.util.function.BiFunction); + method public abstract java.util.concurrent.CompletionStage handleAsync(java.util.function.BiFunction, java.util.concurrent.Executor); method public abstract java.util.concurrent.CompletionStage runAfterBoth(java.util.concurrent.CompletionStage, java.lang.Runnable); method public abstract java.util.concurrent.CompletionStage runAfterBothAsync(java.util.concurrent.CompletionStage, java.lang.Runnable); method public abstract java.util.concurrent.CompletionStage runAfterBothAsync(java.util.concurrent.CompletionStage, java.lang.Runnable, java.util.concurrent.Executor); @@ -62983,18 +62983,18 @@ package java.util.concurrent { method public abstract java.util.concurrent.CompletionStage thenAccept(java.util.function.Consumer); method public abstract java.util.concurrent.CompletionStage thenAcceptAsync(java.util.function.Consumer); method public abstract java.util.concurrent.CompletionStage thenAcceptAsync(java.util.function.Consumer, java.util.concurrent.Executor); - method public abstract java.util.concurrent.CompletionStage thenAcceptBoth(java.util.concurrent.CompletionStage, java.util.function.BiConsumer); - method public abstract java.util.concurrent.CompletionStage thenAcceptBothAsync(java.util.concurrent.CompletionStage, java.util.function.BiConsumer); - method public abstract java.util.concurrent.CompletionStage thenAcceptBothAsync(java.util.concurrent.CompletionStage, java.util.function.BiConsumer, java.util.concurrent.Executor); - method public abstract java.util.concurrent.CompletionStage thenApply(java.util.function.Function); - method public abstract java.util.concurrent.CompletionStage thenApplyAsync(java.util.function.Function); - method public abstract java.util.concurrent.CompletionStage thenApplyAsync(java.util.function.Function, java.util.concurrent.Executor); - method public abstract java.util.concurrent.CompletionStage thenCombine(java.util.concurrent.CompletionStage, java.util.function.BiFunction); - method public abstract java.util.concurrent.CompletionStage thenCombineAsync(java.util.concurrent.CompletionStage, java.util.function.BiFunction); - method public abstract java.util.concurrent.CompletionStage thenCombineAsync(java.util.concurrent.CompletionStage, java.util.function.BiFunction, java.util.concurrent.Executor); - method public abstract java.util.concurrent.CompletionStage thenCompose(java.util.function.Function>); - method public abstract java.util.concurrent.CompletionStage thenComposeAsync(java.util.function.Function>); - method public abstract java.util.concurrent.CompletionStage thenComposeAsync(java.util.function.Function>, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage thenAcceptBoth(java.util.concurrent.CompletionStage, java.util.function.BiConsumer); + method public abstract java.util.concurrent.CompletionStage thenAcceptBothAsync(java.util.concurrent.CompletionStage, java.util.function.BiConsumer); + method public abstract java.util.concurrent.CompletionStage thenAcceptBothAsync(java.util.concurrent.CompletionStage, java.util.function.BiConsumer, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage thenApply(java.util.function.Function); + method public abstract java.util.concurrent.CompletionStage thenApplyAsync(java.util.function.Function); + method public abstract java.util.concurrent.CompletionStage thenApplyAsync(java.util.function.Function, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage thenCombine(java.util.concurrent.CompletionStage, java.util.function.BiFunction); + method public abstract java.util.concurrent.CompletionStage thenCombineAsync(java.util.concurrent.CompletionStage, java.util.function.BiFunction); + method public abstract java.util.concurrent.CompletionStage thenCombineAsync(java.util.concurrent.CompletionStage, java.util.function.BiFunction, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage thenCompose(java.util.function.Function>); + method public abstract java.util.concurrent.CompletionStage thenComposeAsync(java.util.function.Function>); + method public abstract java.util.concurrent.CompletionStage thenComposeAsync(java.util.function.Function>, java.util.concurrent.Executor); method public abstract java.util.concurrent.CompletionStage thenRun(java.lang.Runnable); method public abstract java.util.concurrent.CompletionStage thenRunAsync(java.lang.Runnable); method public abstract java.util.concurrent.CompletionStage thenRunAsync(java.lang.Runnable, java.util.concurrent.Executor); @@ -63004,7 +63004,7 @@ package java.util.concurrent { method public abstract java.util.concurrent.CompletionStage whenCompleteAsync(java.util.function.BiConsumer, java.util.concurrent.Executor); } - public class ConcurrentHashMap extends java.util.AbstractMap implements java.util.concurrent.ConcurrentMap java.io.Serializable { + public class ConcurrentHashMap extends java.util.AbstractMap implements java.util.concurrent.ConcurrentMap java.io.Serializable { ctor public ConcurrentHashMap(); ctor public ConcurrentHashMap(int); ctor public ConcurrentHashMap(java.util.Map); @@ -63018,29 +63018,29 @@ package java.util.concurrent { method public java.util.Set> entrySet(); method public void forEach(java.util.function.BiConsumer); method public void forEach(long, java.util.function.BiConsumer); - method public void forEach(long, java.util.function.BiFunction, java.util.function.Consumer); + method public void forEach(long, java.util.function.BiFunction, java.util.function.Consumer); method public void forEachEntry(long, java.util.function.Consumer>); - method public void forEachEntry(long, java.util.function.Function, ? extends U>, java.util.function.Consumer); + method public void forEachEntry(long, java.util.function.Function, ? extends U>, java.util.function.Consumer); method public void forEachKey(long, java.util.function.Consumer); - method public void forEachKey(long, java.util.function.Function, java.util.function.Consumer); + method public void forEachKey(long, java.util.function.Function, java.util.function.Consumer); method public void forEachValue(long, java.util.function.Consumer); - method public void forEachValue(long, java.util.function.Function, java.util.function.Consumer); + method public void forEachValue(long, java.util.function.Function, java.util.function.Consumer); method public V getOrDefault(java.lang.Object, V); method public java.util.concurrent.ConcurrentHashMap.KeySetView keySet(V); method public java.util.Enumeration keys(); method public long mappingCount(); method public V merge(K, V, java.util.function.BiFunction); - method public static java.util.concurrent.ConcurrentHashMap.KeySetView newKeySet(); - method public static java.util.concurrent.ConcurrentHashMap.KeySetView newKeySet(int); + method public static java.util.concurrent.ConcurrentHashMap.KeySetView newKeySet(); + method public static java.util.concurrent.ConcurrentHashMap.KeySetView newKeySet(int); method public V putIfAbsent(K, V); - method public U reduce(long, java.util.function.BiFunction, java.util.function.BiFunction); + method public U reduce(long, java.util.function.BiFunction, java.util.function.BiFunction); method public java.util.Map.Entry reduceEntries(long, java.util.function.BiFunction, java.util.Map.Entry, ? extends java.util.Map.Entry>); - method public U reduceEntries(long, java.util.function.Function, ? extends U>, java.util.function.BiFunction); + method public U reduceEntries(long, java.util.function.Function, ? extends U>, java.util.function.BiFunction); method public double reduceEntriesToDouble(long, java.util.function.ToDoubleFunction>, double, java.util.function.DoubleBinaryOperator); method public int reduceEntriesToInt(long, java.util.function.ToIntFunction>, int, java.util.function.IntBinaryOperator); method public long reduceEntriesToLong(long, java.util.function.ToLongFunction>, long, java.util.function.LongBinaryOperator); method public K reduceKeys(long, java.util.function.BiFunction); - method public U reduceKeys(long, java.util.function.Function, java.util.function.BiFunction); + method public U reduceKeys(long, java.util.function.Function, java.util.function.BiFunction); method public double reduceKeysToDouble(long, java.util.function.ToDoubleFunction, double, java.util.function.DoubleBinaryOperator); method public int reduceKeysToInt(long, java.util.function.ToIntFunction, int, java.util.function.IntBinaryOperator); method public long reduceKeysToLong(long, java.util.function.ToLongFunction, long, java.util.function.LongBinaryOperator); @@ -63048,7 +63048,7 @@ package java.util.concurrent { method public int reduceToInt(long, java.util.function.ToIntBiFunction, int, java.util.function.IntBinaryOperator); method public long reduceToLong(long, java.util.function.ToLongBiFunction, long, java.util.function.LongBinaryOperator); method public V reduceValues(long, java.util.function.BiFunction); - method public U reduceValues(long, java.util.function.Function, java.util.function.BiFunction); + method public U reduceValues(long, java.util.function.Function, java.util.function.BiFunction); method public double reduceValuesToDouble(long, java.util.function.ToDoubleFunction, double, java.util.function.DoubleBinaryOperator); method public int reduceValuesToInt(long, java.util.function.ToIntFunction, int, java.util.function.IntBinaryOperator); method public long reduceValuesToLong(long, java.util.function.ToLongFunction, long, java.util.function.LongBinaryOperator); @@ -63056,13 +63056,13 @@ package java.util.concurrent { method public boolean replace(K, V, V); method public V replace(K, V); method public void replaceAll(java.util.function.BiFunction); - method public U search(long, java.util.function.BiFunction); - method public U searchEntries(long, java.util.function.Function, ? extends U>); - method public U searchKeys(long, java.util.function.Function); - method public U searchValues(long, java.util.function.Function); + method public U search(long, java.util.function.BiFunction); + method public U searchEntries(long, java.util.function.Function, ? extends U>); + method public U searchKeys(long, java.util.function.Function); + method public U searchValues(long, java.util.function.Function); } - static abstract class ConcurrentHashMap.CollectionView implements java.util.Collection java.io.Serializable { + static abstract class ConcurrentHashMap.CollectionView implements java.util.Collection java.io.Serializable { method public final void clear(); method public abstract boolean contains(java.lang.Object); method public final boolean containsAll(java.util.Collection); @@ -63074,11 +63074,11 @@ package java.util.concurrent { method public final boolean retainAll(java.util.Collection); method public final int size(); method public final java.lang.Object[] toArray(); - method public final T[] toArray(T[]); + method public final T[] toArray(T[]); method public final java.lang.String toString(); } - public static class ConcurrentHashMap.KeySetView extends java.util.concurrent.ConcurrentHashMap.CollectionView implements java.io.Serializable java.util.Set { + public static class ConcurrentHashMap.KeySetView extends java.util.concurrent.ConcurrentHashMap.CollectionView implements java.io.Serializable java.util.Set { method public boolean add(K); method public boolean addAll(java.util.Collection); method public boolean contains(java.lang.Object); @@ -63089,7 +63089,7 @@ package java.util.concurrent { method public java.util.Spliterator spliterator(); } - public class ConcurrentLinkedDeque extends java.util.AbstractCollection implements java.util.Deque java.io.Serializable { + public class ConcurrentLinkedDeque extends java.util.AbstractCollection implements java.util.Deque java.io.Serializable { ctor public ConcurrentLinkedDeque(); ctor public ConcurrentLinkedDeque(java.util.Collection); method public void addFirst(E); @@ -63119,7 +63119,7 @@ package java.util.concurrent { method public java.util.Spliterator spliterator(); } - public class ConcurrentLinkedQueue extends java.util.AbstractQueue implements java.util.Queue java.io.Serializable { + public class ConcurrentLinkedQueue extends java.util.AbstractQueue implements java.util.Queue java.io.Serializable { ctor public ConcurrentLinkedQueue(); ctor public ConcurrentLinkedQueue(java.util.Collection); method public java.util.Iterator iterator(); @@ -63130,14 +63130,14 @@ package java.util.concurrent { method public java.util.Spliterator spliterator(); } - public abstract interface ConcurrentMap implements java.util.Map { + public abstract interface ConcurrentMap implements java.util.Map { method public abstract V putIfAbsent(K, V); method public abstract boolean remove(java.lang.Object, java.lang.Object); method public abstract boolean replace(K, V, V); method public abstract V replace(K, V); } - public abstract interface ConcurrentNavigableMap implements java.util.concurrent.ConcurrentMap java.util.NavigableMap { + public abstract interface ConcurrentNavigableMap implements java.util.concurrent.ConcurrentMap java.util.NavigableMap { method public abstract java.util.NavigableSet descendingKeySet(); method public abstract java.util.concurrent.ConcurrentNavigableMap descendingMap(); method public abstract java.util.concurrent.ConcurrentNavigableMap headMap(K, boolean); @@ -63150,7 +63150,7 @@ package java.util.concurrent { method public abstract java.util.concurrent.ConcurrentNavigableMap tailMap(K); } - public class ConcurrentSkipListMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.concurrent.ConcurrentNavigableMap java.io.Serializable { + public class ConcurrentSkipListMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.concurrent.ConcurrentNavigableMap java.io.Serializable { ctor public ConcurrentSkipListMap(); ctor public ConcurrentSkipListMap(java.util.Comparator); ctor public ConcurrentSkipListMap(java.util.Map); @@ -63194,7 +63194,7 @@ package java.util.concurrent { method public java.util.concurrent.ConcurrentNavigableMap tailMap(K); } - public class ConcurrentSkipListSet extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable { + public class ConcurrentSkipListSet extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable { ctor public ConcurrentSkipListSet(); ctor public ConcurrentSkipListSet(java.util.Comparator); ctor public ConcurrentSkipListSet(java.util.Collection); @@ -63222,7 +63222,7 @@ package java.util.concurrent { method public java.util.NavigableSet tailSet(E); } - public class CopyOnWriteArrayList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { + public class CopyOnWriteArrayList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { ctor public CopyOnWriteArrayList(); ctor public CopyOnWriteArrayList(java.util.Collection); ctor public CopyOnWriteArrayList(E[]); @@ -63254,10 +63254,10 @@ package java.util.concurrent { method public int size(); method public java.util.List subList(int, int); method public java.lang.Object[] toArray(); - method public T[] toArray(T[]); + method public T[] toArray(T[]); } - public class CopyOnWriteArraySet extends java.util.AbstractSet implements java.io.Serializable { + public class CopyOnWriteArraySet extends java.util.AbstractSet implements java.io.Serializable { ctor public CopyOnWriteArraySet(); ctor public CopyOnWriteArraySet(java.util.Collection); method public void forEach(java.util.function.Consumer); @@ -63275,7 +63275,7 @@ package java.util.concurrent { method public long getCount(); } - public abstract class CountedCompleter extends java.util.concurrent.ForkJoinTask { + public abstract class CountedCompleter extends java.util.concurrent.ForkJoinTask { ctor protected CountedCompleter(java.util.concurrent.CountedCompleter, int); ctor protected CountedCompleter(java.util.concurrent.CountedCompleter); ctor protected CountedCompleter(); @@ -63312,7 +63312,7 @@ package java.util.concurrent { method public void reset(); } - public class DelayQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue { + public class DelayQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue { ctor public DelayQueue(); ctor public DelayQueue(java.util.Collection); method public int drainTo(java.util.Collection); @@ -63333,7 +63333,7 @@ package java.util.concurrent { method public abstract long getDelay(java.util.concurrent.TimeUnit); } - public class Exchanger { + public class Exchanger { ctor public Exchanger(); method public V exchange(V) throws java.lang.InterruptedException; method public V exchange(V, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException, java.util.concurrent.TimeoutException; @@ -63350,7 +63350,7 @@ package java.util.concurrent { method public abstract void execute(java.lang.Runnable); } - public class ExecutorCompletionService implements java.util.concurrent.CompletionService { + public class ExecutorCompletionService implements java.util.concurrent.CompletionService { ctor public ExecutorCompletionService(java.util.concurrent.Executor); ctor public ExecutorCompletionService(java.util.concurrent.Executor, java.util.concurrent.BlockingQueue>); method public java.util.concurrent.Future poll(); @@ -63362,21 +63362,21 @@ package java.util.concurrent { public abstract interface ExecutorService implements java.util.concurrent.Executor { method public abstract boolean awaitTermination(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; - method public abstract java.util.List> invokeAll(java.util.Collection>) throws java.lang.InterruptedException; - method public abstract java.util.List> invokeAll(java.util.Collection>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; - method public abstract T invokeAny(java.util.Collection>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; - method public abstract T invokeAny(java.util.Collection>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; + method public abstract java.util.List> invokeAll(java.util.Collection>) throws java.lang.InterruptedException; + method public abstract java.util.List> invokeAll(java.util.Collection>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; + method public abstract T invokeAny(java.util.Collection>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; + method public abstract T invokeAny(java.util.Collection>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; method public abstract boolean isShutdown(); method public abstract boolean isTerminated(); method public abstract void shutdown(); method public abstract java.util.List shutdownNow(); - method public abstract java.util.concurrent.Future submit(java.util.concurrent.Callable); - method public abstract java.util.concurrent.Future submit(java.lang.Runnable, T); + method public abstract java.util.concurrent.Future submit(java.util.concurrent.Callable); + method public abstract java.util.concurrent.Future submit(java.lang.Runnable, T); method public abstract java.util.concurrent.Future submit(java.lang.Runnable); } public class Executors { - method public static java.util.concurrent.Callable callable(java.lang.Runnable, T); + method public static java.util.concurrent.Callable callable(java.lang.Runnable, T); method public static java.util.concurrent.Callable callable(java.lang.Runnable); method public static java.util.concurrent.Callable callable(java.security.PrivilegedAction); method public static java.util.concurrent.Callable callable(java.security.PrivilegedExceptionAction); @@ -63393,8 +63393,8 @@ package java.util.concurrent { method public static java.util.concurrent.ScheduledExecutorService newSingleThreadScheduledExecutor(java.util.concurrent.ThreadFactory); method public static java.util.concurrent.ExecutorService newWorkStealingPool(int); method public static java.util.concurrent.ExecutorService newWorkStealingPool(); - method public static java.util.concurrent.Callable privilegedCallable(java.util.concurrent.Callable); - method public static java.util.concurrent.Callable privilegedCallableUsingCurrentClassLoader(java.util.concurrent.Callable); + method public static java.util.concurrent.Callable privilegedCallable(java.util.concurrent.Callable); + method public static java.util.concurrent.Callable privilegedCallableUsingCurrentClassLoader(java.util.concurrent.Callable); method public static java.util.concurrent.ThreadFactory privilegedThreadFactory(); method public static java.util.concurrent.ExecutorService unconfigurableExecutorService(java.util.concurrent.ExecutorService); method public static java.util.concurrent.ScheduledExecutorService unconfigurableScheduledExecutorService(java.util.concurrent.ScheduledExecutorService); @@ -63422,7 +63422,7 @@ package java.util.concurrent { method public long getStealCount(); method public java.lang.Thread.UncaughtExceptionHandler getUncaughtExceptionHandler(); method public boolean hasQueuedSubmissions(); - method public T invoke(java.util.concurrent.ForkJoinTask); + method public T invoke(java.util.concurrent.ForkJoinTask); method public boolean isQuiescent(); method public boolean isShutdown(); method public boolean isTerminated(); @@ -63431,7 +63431,7 @@ package java.util.concurrent { method protected java.util.concurrent.ForkJoinTask pollSubmission(); method public void shutdown(); method public java.util.List shutdownNow(); - method public java.util.concurrent.ForkJoinTask submit(java.util.concurrent.ForkJoinTask); + method public java.util.concurrent.ForkJoinTask submit(java.util.concurrent.ForkJoinTask); field public static final java.util.concurrent.ForkJoinPool.ForkJoinWorkerThreadFactory defaultForkJoinWorkerThreadFactory; } @@ -63444,11 +63444,11 @@ package java.util.concurrent { method public abstract boolean isReleasable(); } - public abstract class ForkJoinTask implements java.util.concurrent.Future java.io.Serializable { + public abstract class ForkJoinTask implements java.util.concurrent.Future java.io.Serializable { ctor public ForkJoinTask(); method public static java.util.concurrent.ForkJoinTask adapt(java.lang.Runnable); - method public static java.util.concurrent.ForkJoinTask adapt(java.lang.Runnable, T); - method public static java.util.concurrent.ForkJoinTask adapt(java.util.concurrent.Callable); + method public static java.util.concurrent.ForkJoinTask adapt(java.lang.Runnable, T); + method public static java.util.concurrent.ForkJoinTask adapt(java.util.concurrent.Callable); method public boolean cancel(boolean); method public final boolean compareAndSetForkJoinTaskTag(short, short); method public void complete(V); @@ -63468,7 +63468,7 @@ package java.util.concurrent { method public final V invoke(); method public static void invokeAll(java.util.concurrent.ForkJoinTask, java.util.concurrent.ForkJoinTask); method public static void invokeAll(java.util.concurrent.ForkJoinTask...); - method public static java.util.Collection invokeAll(java.util.Collection); + method public static > java.util.Collection invokeAll(java.util.Collection); method public final boolean isCancelled(); method public final boolean isCompletedAbnormally(); method public final boolean isCompletedNormally(); @@ -63494,7 +63494,7 @@ package java.util.concurrent { method protected void onTermination(java.lang.Throwable); } - public abstract interface Future { + public abstract interface Future { method public abstract boolean cancel(boolean); method public abstract V get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; method public abstract V get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; @@ -63502,7 +63502,7 @@ package java.util.concurrent { method public abstract boolean isDone(); } - public class FutureTask implements java.util.concurrent.RunnableFuture { + public class FutureTask implements java.util.concurrent.RunnableFuture { ctor public FutureTask(java.util.concurrent.Callable); ctor public FutureTask(java.lang.Runnable, V); method public boolean cancel(boolean); @@ -63517,7 +63517,7 @@ package java.util.concurrent { method protected void setException(java.lang.Throwable); } - public class LinkedBlockingDeque extends java.util.AbstractQueue implements java.util.concurrent.BlockingDeque java.io.Serializable { + public class LinkedBlockingDeque extends java.util.AbstractQueue implements java.util.concurrent.BlockingDeque java.io.Serializable { ctor public LinkedBlockingDeque(); ctor public LinkedBlockingDeque(int); ctor public LinkedBlockingDeque(java.util.Collection); @@ -63561,7 +63561,7 @@ package java.util.concurrent { method public E takeLast() throws java.lang.InterruptedException; } - public class LinkedBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { + public class LinkedBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { ctor public LinkedBlockingQueue(); ctor public LinkedBlockingQueue(int); ctor public LinkedBlockingQueue(java.util.Collection); @@ -63580,7 +63580,7 @@ package java.util.concurrent { method public E take() throws java.lang.InterruptedException; } - public class LinkedTransferQueue extends java.util.AbstractQueue implements java.io.Serializable java.util.concurrent.TransferQueue { + public class LinkedTransferQueue extends java.util.AbstractQueue implements java.io.Serializable java.util.concurrent.TransferQueue { ctor public LinkedTransferQueue(); ctor public LinkedTransferQueue(java.util.Collection); method public int drainTo(java.util.Collection); @@ -63627,7 +63627,7 @@ package java.util.concurrent { method public int register(); } - public class PriorityBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { + public class PriorityBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { ctor public PriorityBlockingQueue(); ctor public PriorityBlockingQueue(int); ctor public PriorityBlockingQueue(int, java.util.Comparator); @@ -63656,7 +63656,7 @@ package java.util.concurrent { method protected final void setRawResult(java.lang.Void); } - public abstract class RecursiveTask extends java.util.concurrent.ForkJoinTask { + public abstract class RecursiveTask extends java.util.concurrent.ForkJoinTask { ctor public RecursiveTask(); method protected abstract V compute(); method protected final boolean exec(); @@ -63675,22 +63675,22 @@ package java.util.concurrent { method public abstract void rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor); } - public abstract interface RunnableFuture implements java.util.concurrent.Future java.lang.Runnable { + public abstract interface RunnableFuture implements java.util.concurrent.Future java.lang.Runnable { method public abstract void run(); } - public abstract interface RunnableScheduledFuture implements java.util.concurrent.RunnableFuture java.util.concurrent.ScheduledFuture { + public abstract interface RunnableScheduledFuture implements java.util.concurrent.RunnableFuture java.util.concurrent.ScheduledFuture { method public abstract boolean isPeriodic(); } public abstract interface ScheduledExecutorService implements java.util.concurrent.ExecutorService { method public abstract java.util.concurrent.ScheduledFuture schedule(java.lang.Runnable, long, java.util.concurrent.TimeUnit); - method public abstract java.util.concurrent.ScheduledFuture schedule(java.util.concurrent.Callable, long, java.util.concurrent.TimeUnit); + method public abstract java.util.concurrent.ScheduledFuture schedule(java.util.concurrent.Callable, long, java.util.concurrent.TimeUnit); method public abstract java.util.concurrent.ScheduledFuture scheduleAtFixedRate(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit); method public abstract java.util.concurrent.ScheduledFuture scheduleWithFixedDelay(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit); } - public abstract interface ScheduledFuture implements java.util.concurrent.Delayed java.util.concurrent.Future { + public abstract interface ScheduledFuture implements java.util.concurrent.Delayed java.util.concurrent.Future { } public class ScheduledThreadPoolExecutor extends java.util.concurrent.ThreadPoolExecutor implements java.util.concurrent.ScheduledExecutorService { @@ -63698,13 +63698,13 @@ package java.util.concurrent { ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.ThreadFactory); ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.RejectedExecutionHandler); ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.ThreadFactory, java.util.concurrent.RejectedExecutionHandler); - method protected java.util.concurrent.RunnableScheduledFuture decorateTask(java.lang.Runnable, java.util.concurrent.RunnableScheduledFuture); - method protected java.util.concurrent.RunnableScheduledFuture decorateTask(java.util.concurrent.Callable, java.util.concurrent.RunnableScheduledFuture); + method protected java.util.concurrent.RunnableScheduledFuture decorateTask(java.lang.Runnable, java.util.concurrent.RunnableScheduledFuture); + method protected java.util.concurrent.RunnableScheduledFuture decorateTask(java.util.concurrent.Callable, java.util.concurrent.RunnableScheduledFuture); method public boolean getContinueExistingPeriodicTasksAfterShutdownPolicy(); method public boolean getExecuteExistingDelayedTasksAfterShutdownPolicy(); method public boolean getRemoveOnCancelPolicy(); method public java.util.concurrent.ScheduledFuture schedule(java.lang.Runnable, long, java.util.concurrent.TimeUnit); - method public java.util.concurrent.ScheduledFuture schedule(java.util.concurrent.Callable, long, java.util.concurrent.TimeUnit); + method public java.util.concurrent.ScheduledFuture schedule(java.util.concurrent.Callable, long, java.util.concurrent.TimeUnit); method public java.util.concurrent.ScheduledFuture scheduleAtFixedRate(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit); method public java.util.concurrent.ScheduledFuture scheduleWithFixedDelay(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit); method public void setContinueExistingPeriodicTasksAfterShutdownPolicy(boolean); @@ -63734,7 +63734,7 @@ package java.util.concurrent { method public boolean tryAcquire(int, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; } - public class SynchronousQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { + public class SynchronousQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { ctor public SynchronousQueue(); ctor public SynchronousQueue(boolean); method public int drainTo(java.util.Collection); @@ -63852,7 +63852,7 @@ package java.util.concurrent { ctor public TimeoutException(java.lang.String); } - public abstract interface TransferQueue implements java.util.concurrent.BlockingQueue { + public abstract interface TransferQueue implements java.util.concurrent.BlockingQueue { method public abstract int getWaitingConsumerCount(); method public abstract boolean hasWaitingConsumer(); method public abstract void transfer(E) throws java.lang.InterruptedException; @@ -63922,7 +63922,7 @@ package java.util.concurrent.atomic { method public final boolean weakCompareAndSet(int, int, int); } - public abstract class AtomicIntegerFieldUpdater { + public abstract class AtomicIntegerFieldUpdater { ctor protected AtomicIntegerFieldUpdater(); method public final int accumulateAndGet(T, int, java.util.function.IntBinaryOperator); method public int addAndGet(T, int); @@ -63937,7 +63937,7 @@ package java.util.concurrent.atomic { method public final int getAndUpdate(T, java.util.function.IntUnaryOperator); method public int incrementAndGet(T); method public abstract void lazySet(T, int); - method public static java.util.concurrent.atomic.AtomicIntegerFieldUpdater newUpdater(java.lang.Class, java.lang.String); + method public static java.util.concurrent.atomic.AtomicIntegerFieldUpdater newUpdater(java.lang.Class, java.lang.String); method public abstract void set(T, int); method public final int updateAndGet(T, java.util.function.IntUnaryOperator); method public abstract boolean weakCompareAndSet(T, int, int); @@ -63990,7 +63990,7 @@ package java.util.concurrent.atomic { method public final boolean weakCompareAndSet(int, long, long); } - public abstract class AtomicLongFieldUpdater { + public abstract class AtomicLongFieldUpdater { ctor protected AtomicLongFieldUpdater(); method public final long accumulateAndGet(T, long, java.util.function.LongBinaryOperator); method public long addAndGet(T, long); @@ -64005,13 +64005,13 @@ package java.util.concurrent.atomic { method public final long getAndUpdate(T, java.util.function.LongUnaryOperator); method public long incrementAndGet(T); method public abstract void lazySet(T, long); - method public static java.util.concurrent.atomic.AtomicLongFieldUpdater newUpdater(java.lang.Class, java.lang.String); + method public static java.util.concurrent.atomic.AtomicLongFieldUpdater newUpdater(java.lang.Class, java.lang.String); method public abstract void set(T, long); method public final long updateAndGet(T, java.util.function.LongUnaryOperator); method public abstract boolean weakCompareAndSet(T, long, long); } - public class AtomicMarkableReference { + public class AtomicMarkableReference { ctor public AtomicMarkableReference(V, boolean); method public boolean attemptMark(V, boolean); method public boolean compareAndSet(V, V, boolean, boolean); @@ -64022,7 +64022,7 @@ package java.util.concurrent.atomic { method public boolean weakCompareAndSet(V, V, boolean, boolean); } - public class AtomicReference implements java.io.Serializable { + public class AtomicReference implements java.io.Serializable { ctor public AtomicReference(V); ctor public AtomicReference(); method public final V accumulateAndGet(V, java.util.function.BinaryOperator); @@ -64037,7 +64037,7 @@ package java.util.concurrent.atomic { method public final boolean weakCompareAndSet(V, V); } - public class AtomicReferenceArray implements java.io.Serializable { + public class AtomicReferenceArray implements java.io.Serializable { ctor public AtomicReferenceArray(int); ctor public AtomicReferenceArray(E[]); method public final E accumulateAndGet(int, E, java.util.function.BinaryOperator); @@ -64053,7 +64053,7 @@ package java.util.concurrent.atomic { method public final boolean weakCompareAndSet(int, E, E); } - public abstract class AtomicReferenceFieldUpdater { + public abstract class AtomicReferenceFieldUpdater { ctor protected AtomicReferenceFieldUpdater(); method public final V accumulateAndGet(T, V, java.util.function.BinaryOperator); method public abstract boolean compareAndSet(T, V, V); @@ -64062,13 +64062,13 @@ package java.util.concurrent.atomic { method public V getAndSet(T, V); method public final V getAndUpdate(T, java.util.function.UnaryOperator); method public abstract void lazySet(T, V); - method public static java.util.concurrent.atomic.AtomicReferenceFieldUpdater newUpdater(java.lang.Class, java.lang.Class, java.lang.String); + method public static java.util.concurrent.atomic.AtomicReferenceFieldUpdater newUpdater(java.lang.Class, java.lang.Class, java.lang.String); method public abstract void set(T, V); method public final V updateAndGet(T, java.util.function.UnaryOperator); method public abstract boolean weakCompareAndSet(T, V, V); } - public class AtomicStampedReference { + public class AtomicStampedReference { ctor public AtomicStampedReference(V, int); method public boolean attemptStamp(V, int); method public boolean compareAndSet(V, V, int, int); @@ -64371,33 +64371,33 @@ package java.util.concurrent.locks { package java.util.function { - public abstract interface BiConsumer { + public abstract interface BiConsumer { method public abstract void accept(T, U); method public default java.util.function.BiConsumer andThen(java.util.function.BiConsumer); } - public abstract interface BiFunction { - method public default java.util.function.BiFunction andThen(java.util.function.Function); + public abstract interface BiFunction { + method public default java.util.function.BiFunction andThen(java.util.function.Function); method public abstract R apply(T, U); } - public abstract interface BiPredicate { + public abstract interface BiPredicate { method public default java.util.function.BiPredicate and(java.util.function.BiPredicate); method public default java.util.function.BiPredicate negate(); method public default java.util.function.BiPredicate or(java.util.function.BiPredicate); method public abstract boolean test(T, U); } - public abstract interface BinaryOperator implements java.util.function.BiFunction { - method public static java.util.function.BinaryOperator maxBy(java.util.Comparator); - method public static java.util.function.BinaryOperator minBy(java.util.Comparator); + public abstract interface BinaryOperator implements java.util.function.BiFunction { + method public static java.util.function.BinaryOperator maxBy(java.util.Comparator); + method public static java.util.function.BinaryOperator minBy(java.util.Comparator); } public abstract interface BooleanSupplier { method public abstract boolean getAsBoolean(); } - public abstract interface Consumer { + public abstract interface Consumer { method public abstract void accept(T); method public default java.util.function.Consumer andThen(java.util.function.Consumer); } @@ -64411,7 +64411,7 @@ package java.util.function { method public default java.util.function.DoubleConsumer andThen(java.util.function.DoubleConsumer); } - public abstract interface DoubleFunction { + public abstract interface DoubleFunction { method public abstract R apply(double); } @@ -64441,11 +64441,11 @@ package java.util.function { method public static java.util.function.DoubleUnaryOperator identity(); } - public abstract interface Function { - method public default java.util.function.Function andThen(java.util.function.Function); + public abstract interface Function { + method public default java.util.function.Function andThen(java.util.function.Function); method public abstract R apply(T); - method public default java.util.function.Function compose(java.util.function.Function); - method public static java.util.function.Function identity(); + method public default java.util.function.Function compose(java.util.function.Function); + method public static java.util.function.Function identity(); } public abstract interface IntBinaryOperator { @@ -64457,7 +64457,7 @@ package java.util.function { method public default java.util.function.IntConsumer andThen(java.util.function.IntConsumer); } - public abstract interface IntFunction { + public abstract interface IntFunction { method public abstract R apply(int); } @@ -64496,7 +64496,7 @@ package java.util.function { method public default java.util.function.LongConsumer andThen(java.util.function.LongConsumer); } - public abstract interface LongFunction { + public abstract interface LongFunction { method public abstract R apply(long); } @@ -64526,56 +64526,56 @@ package java.util.function { method public static java.util.function.LongUnaryOperator identity(); } - public abstract interface ObjDoubleConsumer { + public abstract interface ObjDoubleConsumer { method public abstract void accept(T, double); } - public abstract interface ObjIntConsumer { + public abstract interface ObjIntConsumer { method public abstract void accept(T, int); } - public abstract interface ObjLongConsumer { + public abstract interface ObjLongConsumer { method public abstract void accept(T, long); } - public abstract interface Predicate { + public abstract interface Predicate { method public default java.util.function.Predicate and(java.util.function.Predicate); - method public static java.util.function.Predicate isEqual(java.lang.Object); + method public static java.util.function.Predicate isEqual(java.lang.Object); method public default java.util.function.Predicate negate(); method public default java.util.function.Predicate or(java.util.function.Predicate); method public abstract boolean test(T); } - public abstract interface Supplier { + public abstract interface Supplier { method public abstract T get(); } - public abstract interface ToDoubleBiFunction { + public abstract interface ToDoubleBiFunction { method public abstract double applyAsDouble(T, U); } - public abstract interface ToDoubleFunction { + public abstract interface ToDoubleFunction { method public abstract double applyAsDouble(T); } - public abstract interface ToIntBiFunction { + public abstract interface ToIntBiFunction { method public abstract int applyAsInt(T, U); } - public abstract interface ToIntFunction { + public abstract interface ToIntFunction { method public abstract int applyAsInt(T); } - public abstract interface ToLongBiFunction { + public abstract interface ToLongBiFunction { method public abstract long applyAsLong(T, U); } - public abstract interface ToLongFunction { + public abstract interface ToLongFunction { method public abstract long applyAsLong(T); } - public abstract interface UnaryOperator implements java.util.function.Function { - method public static java.util.function.UnaryOperator identity(); + public abstract interface UnaryOperator implements java.util.function.Function { + method public static java.util.function.UnaryOperator identity(); } } @@ -65163,7 +65163,7 @@ package java.util.regex { package java.util.stream { - public abstract interface BaseStream implements java.lang.AutoCloseable { + public abstract interface BaseStream> implements java.lang.AutoCloseable { method public abstract void close(); method public abstract boolean isParallel(); method public abstract java.util.Iterator iterator(); @@ -65174,13 +65174,13 @@ package java.util.stream { method public abstract S unordered(); } - public abstract interface Collector { + public abstract interface Collector { method public abstract java.util.function.BiConsumer accumulator(); method public abstract java.util.Set characteristics(); method public abstract java.util.function.BinaryOperator combiner(); method public abstract java.util.function.Function finisher(); - method public static java.util.stream.Collector of(java.util.function.Supplier, java.util.function.BiConsumer, java.util.function.BinaryOperator, java.util.stream.Collector.Characteristics...); - method public static java.util.stream.Collector of(java.util.function.Supplier, java.util.function.BiConsumer, java.util.function.BinaryOperator, java.util.function.Function, java.util.stream.Collector.Characteristics...); + method public static java.util.stream.Collector of(java.util.function.Supplier, java.util.function.BiConsumer, java.util.function.BinaryOperator, java.util.stream.Collector.Characteristics...); + method public static java.util.stream.Collector of(java.util.function.Supplier, java.util.function.BiConsumer, java.util.function.BinaryOperator, java.util.function.Function, java.util.stream.Collector.Characteristics...); method public abstract java.util.function.Supplier supplier(); } @@ -65193,43 +65193,43 @@ package java.util.stream { } public final class Collectors { - method public static java.util.stream.Collector averagingDouble(java.util.function.ToDoubleFunction); - method public static java.util.stream.Collector averagingInt(java.util.function.ToIntFunction); - method public static java.util.stream.Collector averagingLong(java.util.function.ToLongFunction); - method public static java.util.stream.Collector collectingAndThen(java.util.stream.Collector, java.util.function.Function); - method public static java.util.stream.Collector counting(); - method public static java.util.stream.Collector>> groupingBy(java.util.function.Function); - method public static java.util.stream.Collector> groupingBy(java.util.function.Function, java.util.stream.Collector); - method public static java.util.stream.Collector groupingBy(java.util.function.Function, java.util.function.Supplier, java.util.stream.Collector); - method public static java.util.stream.Collector>> groupingByConcurrent(java.util.function.Function); - method public static java.util.stream.Collector> groupingByConcurrent(java.util.function.Function, java.util.stream.Collector); - method public static java.util.stream.Collector groupingByConcurrent(java.util.function.Function, java.util.function.Supplier, java.util.stream.Collector); + method public static java.util.stream.Collector averagingDouble(java.util.function.ToDoubleFunction); + method public static java.util.stream.Collector averagingInt(java.util.function.ToIntFunction); + method public static java.util.stream.Collector averagingLong(java.util.function.ToLongFunction); + method public static java.util.stream.Collector collectingAndThen(java.util.stream.Collector, java.util.function.Function); + method public static java.util.stream.Collector counting(); + method public static java.util.stream.Collector>> groupingBy(java.util.function.Function); + method public static java.util.stream.Collector> groupingBy(java.util.function.Function, java.util.stream.Collector); + method public static > java.util.stream.Collector groupingBy(java.util.function.Function, java.util.function.Supplier, java.util.stream.Collector); + method public static java.util.stream.Collector>> groupingByConcurrent(java.util.function.Function); + method public static java.util.stream.Collector> groupingByConcurrent(java.util.function.Function, java.util.stream.Collector); + method public static > java.util.stream.Collector groupingByConcurrent(java.util.function.Function, java.util.function.Supplier, java.util.stream.Collector); method public static java.util.stream.Collector joining(); method public static java.util.stream.Collector joining(java.lang.CharSequence); method public static java.util.stream.Collector joining(java.lang.CharSequence, java.lang.CharSequence, java.lang.CharSequence); - method public static java.util.stream.Collector mapping(java.util.function.Function, java.util.stream.Collector); - method public static java.util.stream.Collector> maxBy(java.util.Comparator); - method public static java.util.stream.Collector> minBy(java.util.Comparator); - method public static java.util.stream.Collector>> partitioningBy(java.util.function.Predicate); - method public static java.util.stream.Collector> partitioningBy(java.util.function.Predicate, java.util.stream.Collector); - method public static java.util.stream.Collector reducing(T, java.util.function.BinaryOperator); - method public static java.util.stream.Collector> reducing(java.util.function.BinaryOperator); - method public static java.util.stream.Collector reducing(U, java.util.function.Function, java.util.function.BinaryOperator); - method public static java.util.stream.Collector summarizingDouble(java.util.function.ToDoubleFunction); - method public static java.util.stream.Collector summarizingInt(java.util.function.ToIntFunction); - method public static java.util.stream.Collector summarizingLong(java.util.function.ToLongFunction); - method public static java.util.stream.Collector summingDouble(java.util.function.ToDoubleFunction); - method public static java.util.stream.Collector summingInt(java.util.function.ToIntFunction); - method public static java.util.stream.Collector summingLong(java.util.function.ToLongFunction); - method public static java.util.stream.Collector toCollection(java.util.function.Supplier); - method public static java.util.stream.Collector> toConcurrentMap(java.util.function.Function, java.util.function.Function); - method public static java.util.stream.Collector> toConcurrentMap(java.util.function.Function, java.util.function.Function, java.util.function.BinaryOperator); - method public static java.util.stream.Collector toConcurrentMap(java.util.function.Function, java.util.function.Function, java.util.function.BinaryOperator, java.util.function.Supplier); - method public static java.util.stream.Collector> toList(); - method public static java.util.stream.Collector> toMap(java.util.function.Function, java.util.function.Function); - method public static java.util.stream.Collector> toMap(java.util.function.Function, java.util.function.Function, java.util.function.BinaryOperator); - method public static java.util.stream.Collector toMap(java.util.function.Function, java.util.function.Function, java.util.function.BinaryOperator, java.util.function.Supplier); - method public static java.util.stream.Collector> toSet(); + method public static java.util.stream.Collector mapping(java.util.function.Function, java.util.stream.Collector); + method public static java.util.stream.Collector> maxBy(java.util.Comparator); + method public static java.util.stream.Collector> minBy(java.util.Comparator); + method public static java.util.stream.Collector>> partitioningBy(java.util.function.Predicate); + method public static java.util.stream.Collector> partitioningBy(java.util.function.Predicate, java.util.stream.Collector); + method public static java.util.stream.Collector reducing(T, java.util.function.BinaryOperator); + method public static java.util.stream.Collector> reducing(java.util.function.BinaryOperator); + method public static java.util.stream.Collector reducing(U, java.util.function.Function, java.util.function.BinaryOperator); + method public static java.util.stream.Collector summarizingDouble(java.util.function.ToDoubleFunction); + method public static java.util.stream.Collector summarizingInt(java.util.function.ToIntFunction); + method public static java.util.stream.Collector summarizingLong(java.util.function.ToLongFunction); + method public static java.util.stream.Collector summingDouble(java.util.function.ToDoubleFunction); + method public static java.util.stream.Collector summingInt(java.util.function.ToIntFunction); + method public static java.util.stream.Collector summingLong(java.util.function.ToLongFunction); + method public static > java.util.stream.Collector toCollection(java.util.function.Supplier); + method public static java.util.stream.Collector> toConcurrentMap(java.util.function.Function, java.util.function.Function); + method public static java.util.stream.Collector> toConcurrentMap(java.util.function.Function, java.util.function.Function, java.util.function.BinaryOperator); + method public static > java.util.stream.Collector toConcurrentMap(java.util.function.Function, java.util.function.Function, java.util.function.BinaryOperator, java.util.function.Supplier); + method public static java.util.stream.Collector> toList(); + method public static java.util.stream.Collector> toMap(java.util.function.Function, java.util.function.Function); + method public static java.util.stream.Collector> toMap(java.util.function.Function, java.util.function.Function, java.util.function.BinaryOperator); + method public static > java.util.stream.Collector toMap(java.util.function.Function, java.util.function.Function, java.util.function.BinaryOperator, java.util.function.Supplier); + method public static java.util.stream.Collector> toSet(); } public abstract interface DoubleStream implements java.util.stream.BaseStream { @@ -65238,7 +65238,7 @@ package java.util.stream { method public abstract java.util.OptionalDouble average(); method public abstract java.util.stream.Stream boxed(); method public static java.util.stream.DoubleStream.Builder builder(); - method public abstract R collect(java.util.function.Supplier, java.util.function.ObjDoubleConsumer, java.util.function.BiConsumer); + method public abstract R collect(java.util.function.Supplier, java.util.function.ObjDoubleConsumer, java.util.function.BiConsumer); method public static java.util.stream.DoubleStream concat(java.util.stream.DoubleStream, java.util.stream.DoubleStream); method public abstract long count(); method public abstract java.util.stream.DoubleStream distinct(); @@ -65256,7 +65256,7 @@ package java.util.stream { method public abstract java.util.stream.DoubleStream map(java.util.function.DoubleUnaryOperator); method public abstract java.util.stream.IntStream mapToInt(java.util.function.DoubleToIntFunction); method public abstract java.util.stream.LongStream mapToLong(java.util.function.DoubleToLongFunction); - method public abstract java.util.stream.Stream mapToObj(java.util.function.DoubleFunction); + method public abstract java.util.stream.Stream mapToObj(java.util.function.DoubleFunction); method public abstract java.util.OptionalDouble max(); method public abstract java.util.OptionalDouble min(); method public abstract boolean noneMatch(java.util.function.DoublePredicate); @@ -65289,7 +65289,7 @@ package java.util.stream { method public abstract java.util.OptionalDouble average(); method public abstract java.util.stream.Stream boxed(); method public static java.util.stream.IntStream.Builder builder(); - method public abstract R collect(java.util.function.Supplier, java.util.function.ObjIntConsumer, java.util.function.BiConsumer); + method public abstract R collect(java.util.function.Supplier, java.util.function.ObjIntConsumer, java.util.function.BiConsumer); method public static java.util.stream.IntStream concat(java.util.stream.IntStream, java.util.stream.IntStream); method public abstract long count(); method public abstract java.util.stream.IntStream distinct(); @@ -65307,7 +65307,7 @@ package java.util.stream { method public abstract java.util.stream.IntStream map(java.util.function.IntUnaryOperator); method public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.IntToDoubleFunction); method public abstract java.util.stream.LongStream mapToLong(java.util.function.IntToLongFunction); - method public abstract java.util.stream.Stream mapToObj(java.util.function.IntFunction); + method public abstract java.util.stream.Stream mapToObj(java.util.function.IntFunction); method public abstract java.util.OptionalInt max(); method public abstract java.util.OptionalInt min(); method public abstract boolean noneMatch(java.util.function.IntPredicate); @@ -65341,7 +65341,7 @@ package java.util.stream { method public abstract java.util.OptionalDouble average(); method public abstract java.util.stream.Stream boxed(); method public static java.util.stream.LongStream.Builder builder(); - method public abstract R collect(java.util.function.Supplier, java.util.function.ObjLongConsumer, java.util.function.BiConsumer); + method public abstract R collect(java.util.function.Supplier, java.util.function.ObjLongConsumer, java.util.function.BiConsumer); method public static java.util.stream.LongStream concat(java.util.stream.LongStream, java.util.stream.LongStream); method public abstract long count(); method public abstract java.util.stream.LongStream distinct(); @@ -65359,7 +65359,7 @@ package java.util.stream { method public abstract java.util.stream.LongStream map(java.util.function.LongUnaryOperator); method public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.LongToDoubleFunction); method public abstract java.util.stream.IntStream mapToInt(java.util.function.LongToIntFunction); - method public abstract java.util.stream.Stream mapToObj(java.util.function.LongFunction); + method public abstract java.util.stream.Stream mapToObj(java.util.function.LongFunction); method public abstract java.util.OptionalLong max(); method public abstract java.util.OptionalLong min(); method public abstract boolean noneMatch(java.util.function.LongPredicate); @@ -65386,49 +65386,49 @@ package java.util.stream { method public abstract java.util.stream.LongStream build(); } - public abstract interface Stream implements java.util.stream.BaseStream { + public abstract interface Stream implements java.util.stream.BaseStream { method public abstract boolean allMatch(java.util.function.Predicate); method public abstract boolean anyMatch(java.util.function.Predicate); - method public static java.util.stream.Stream.Builder builder(); - method public abstract R collect(java.util.function.Supplier, java.util.function.BiConsumer, java.util.function.BiConsumer); - method public abstract R collect(java.util.stream.Collector); - method public static java.util.stream.Stream concat(java.util.stream.Stream, java.util.stream.Stream); + method public static java.util.stream.Stream.Builder builder(); + method public abstract R collect(java.util.function.Supplier, java.util.function.BiConsumer, java.util.function.BiConsumer); + method public abstract R collect(java.util.stream.Collector); + method public static java.util.stream.Stream concat(java.util.stream.Stream, java.util.stream.Stream); method public abstract long count(); method public abstract java.util.stream.Stream distinct(); - method public static java.util.stream.Stream empty(); + method public static java.util.stream.Stream empty(); method public abstract java.util.stream.Stream filter(java.util.function.Predicate); method public abstract java.util.Optional findAny(); method public abstract java.util.Optional findFirst(); - method public abstract java.util.stream.Stream flatMap(java.util.function.Function>); + method public abstract java.util.stream.Stream flatMap(java.util.function.Function>); method public abstract java.util.stream.DoubleStream flatMapToDouble(java.util.function.Function); method public abstract java.util.stream.IntStream flatMapToInt(java.util.function.Function); method public abstract java.util.stream.LongStream flatMapToLong(java.util.function.Function); method public abstract void forEach(java.util.function.Consumer); method public abstract void forEachOrdered(java.util.function.Consumer); - method public static java.util.stream.Stream generate(java.util.function.Supplier); - method public static java.util.stream.Stream iterate(T, java.util.function.UnaryOperator); + method public static java.util.stream.Stream generate(java.util.function.Supplier); + method public static java.util.stream.Stream iterate(T, java.util.function.UnaryOperator); method public abstract java.util.stream.Stream limit(long); - method public abstract java.util.stream.Stream map(java.util.function.Function); + method public abstract java.util.stream.Stream map(java.util.function.Function); method public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.ToDoubleFunction); method public abstract java.util.stream.IntStream mapToInt(java.util.function.ToIntFunction); method public abstract java.util.stream.LongStream mapToLong(java.util.function.ToLongFunction); method public abstract java.util.Optional max(java.util.Comparator); method public abstract java.util.Optional min(java.util.Comparator); method public abstract boolean noneMatch(java.util.function.Predicate); - method public static java.util.stream.Stream of(T); - method public static java.util.stream.Stream of(T...); + method public static java.util.stream.Stream of(T); + method public static java.util.stream.Stream of(T...); method public abstract java.util.stream.Stream peek(java.util.function.Consumer); method public abstract T reduce(T, java.util.function.BinaryOperator); method public abstract java.util.Optional reduce(java.util.function.BinaryOperator); - method public abstract U reduce(U, java.util.function.BiFunction, java.util.function.BinaryOperator); + method public abstract U reduce(U, java.util.function.BiFunction, java.util.function.BinaryOperator); method public abstract java.util.stream.Stream skip(long); method public abstract java.util.stream.Stream sorted(); method public abstract java.util.stream.Stream sorted(java.util.Comparator); method public abstract java.lang.Object[] toArray(); - method public abstract A[] toArray(java.util.function.IntFunction); + method public abstract A[] toArray(java.util.function.IntFunction); } - public static abstract interface Stream.Builder implements java.util.function.Consumer { + public static abstract interface Stream.Builder implements java.util.function.Consumer { method public abstract void accept(T); method public default java.util.stream.Stream.Builder add(T); method public abstract java.util.stream.Stream build(); @@ -65441,8 +65441,8 @@ package java.util.stream { method public static java.util.stream.IntStream intStream(java.util.function.Supplier, int, boolean); method public static java.util.stream.LongStream longStream(java.util.Spliterator.OfLong, boolean); method public static java.util.stream.LongStream longStream(java.util.function.Supplier, int, boolean); - method public static java.util.stream.Stream stream(java.util.Spliterator, boolean); - method public static java.util.stream.Stream stream(java.util.function.Supplier>, int, boolean); + method public static java.util.stream.Stream stream(java.util.Spliterator, boolean); + method public static java.util.stream.Stream stream(java.util.function.Supplier>, int, boolean); } } @@ -67613,16 +67613,16 @@ package javax.security.auth { public final class Subject implements java.io.Serializable { ctor public Subject(); ctor public Subject(boolean, java.util.Set, java.util.Set, java.util.Set); - method public static T doAs(javax.security.auth.Subject, java.security.PrivilegedAction); - method public static T doAs(javax.security.auth.Subject, java.security.PrivilegedExceptionAction) throws java.security.PrivilegedActionException; - method public static T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedAction, java.security.AccessControlContext); - method public static T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedExceptionAction, java.security.AccessControlContext) throws java.security.PrivilegedActionException; + method public static T doAs(javax.security.auth.Subject, java.security.PrivilegedAction); + method public static T doAs(javax.security.auth.Subject, java.security.PrivilegedExceptionAction) throws java.security.PrivilegedActionException; + method public static T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedAction, java.security.AccessControlContext); + method public static T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedExceptionAction, java.security.AccessControlContext) throws java.security.PrivilegedActionException; method public java.util.Set getPrincipals(); - method public java.util.Set getPrincipals(java.lang.Class); + method public java.util.Set getPrincipals(java.lang.Class); method public java.util.Set getPrivateCredentials(); - method public java.util.Set getPrivateCredentials(java.lang.Class); + method public java.util.Set getPrivateCredentials(java.lang.Class); method public java.util.Set getPublicCredentials(); - method public java.util.Set getPublicCredentials(java.lang.Class); + method public java.util.Set getPublicCredentials(java.lang.Class); method public static javax.security.auth.Subject getSubject(java.security.AccessControlContext); method public boolean isReadOnly(); method public void setReadOnly(); diff --git a/api/test-current.txt b/api/test-current.txt index 3b5c2231ccf2ac281668bd86d75ba12024fcb36e..d74526b72150fbd8013a3c0e7006632486267319 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -2906,11 +2906,11 @@ package android.accounts { field public static final java.lang.String LOGIN_ACCOUNTS_CHANGED_ACTION = "android.accounts.LOGIN_ACCOUNTS_CHANGED"; } - public abstract interface AccountManagerCallback { + public abstract interface AccountManagerCallback { method public abstract void run(android.accounts.AccountManagerFuture); } - public abstract interface AccountManagerFuture { + public abstract interface AccountManagerFuture { method public abstract boolean cancel(boolean); method public abstract V getResult() throws android.accounts.AuthenticatorException, java.io.IOException, android.accounts.OperationCanceledException; method public abstract V getResult(long, java.util.concurrent.TimeUnit) throws android.accounts.AuthenticatorException, java.io.IOException, android.accounts.OperationCanceledException; @@ -3056,7 +3056,7 @@ package android.animation { method public java.lang.Object evaluate(float, java.lang.Object, java.lang.Object); } - public abstract class BidirectionalTypeConverter extends android.animation.TypeConverter { + public abstract class BidirectionalTypeConverter extends android.animation.TypeConverter { ctor public BidirectionalTypeConverter(java.lang.Class, java.lang.Class); method public abstract T convertBack(V); method public android.animation.BidirectionalTypeConverter invert(); @@ -3148,26 +3148,26 @@ package android.animation { method public java.lang.String getPropertyName(); method public java.lang.Object getTarget(); method public static android.animation.ObjectAnimator ofArgb(java.lang.Object, java.lang.String, int...); - method public static android.animation.ObjectAnimator ofArgb(T, android.util.Property, int...); + method public static android.animation.ObjectAnimator ofArgb(T, android.util.Property, int...); method public static android.animation.ObjectAnimator ofFloat(java.lang.Object, java.lang.String, float...); method public static android.animation.ObjectAnimator ofFloat(java.lang.Object, java.lang.String, java.lang.String, android.graphics.Path); - method public static android.animation.ObjectAnimator ofFloat(T, android.util.Property, float...); - method public static android.animation.ObjectAnimator ofFloat(T, android.util.Property, android.util.Property, android.graphics.Path); + method public static android.animation.ObjectAnimator ofFloat(T, android.util.Property, float...); + method public static android.animation.ObjectAnimator ofFloat(T, android.util.Property, android.util.Property, android.graphics.Path); method public static android.animation.ObjectAnimator ofInt(java.lang.Object, java.lang.String, int...); method public static android.animation.ObjectAnimator ofInt(java.lang.Object, java.lang.String, java.lang.String, android.graphics.Path); - method public static android.animation.ObjectAnimator ofInt(T, android.util.Property, int...); - method public static android.animation.ObjectAnimator ofInt(T, android.util.Property, android.util.Property, android.graphics.Path); + method public static android.animation.ObjectAnimator ofInt(T, android.util.Property, int...); + method public static android.animation.ObjectAnimator ofInt(T, android.util.Property, android.util.Property, android.graphics.Path); method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, float[][]); method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, android.graphics.Path); - method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, T...); + method public static android.animation.ObjectAnimator ofMultiFloat(java.lang.Object, java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, T...); method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, int[][]); method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, android.graphics.Path); - method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, T...); + method public static android.animation.ObjectAnimator ofMultiInt(java.lang.Object, java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, T...); method public static android.animation.ObjectAnimator ofObject(java.lang.Object, java.lang.String, android.animation.TypeEvaluator, java.lang.Object...); method public static android.animation.ObjectAnimator ofObject(java.lang.Object, java.lang.String, android.animation.TypeConverter, android.graphics.Path); - method public static android.animation.ObjectAnimator ofObject(T, android.util.Property, android.animation.TypeEvaluator, V...); - method public static android.animation.ObjectAnimator ofObject(T, android.util.Property, android.animation.TypeConverter, android.animation.TypeEvaluator, V...); - method public static android.animation.ObjectAnimator ofObject(T, android.util.Property, android.animation.TypeConverter, android.graphics.Path); + method public static android.animation.ObjectAnimator ofObject(T, android.util.Property, android.animation.TypeEvaluator, V...); + method public static android.animation.ObjectAnimator ofObject(T, android.util.Property, android.animation.TypeConverter, android.animation.TypeEvaluator, V...); + method public static android.animation.ObjectAnimator ofObject(T, android.util.Property, android.animation.TypeConverter, android.graphics.Path); method public static android.animation.ObjectAnimator ofPropertyValuesHolder(java.lang.Object, android.animation.PropertyValuesHolder...); method public void setAutoCancel(boolean); method public void setProperty(android.util.Property); @@ -3191,17 +3191,17 @@ package android.animation { method public static android.animation.PropertyValuesHolder ofKeyframe(android.util.Property, android.animation.Keyframe...); method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, float[][]); method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.graphics.Path); - method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, V...); - method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, android.animation.Keyframe...); + method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, V...); + method public static android.animation.PropertyValuesHolder ofMultiFloat(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, android.animation.Keyframe...); method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, int[][]); method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.graphics.Path); - method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, V...); - method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, android.animation.Keyframe...); + method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, V...); + method public static android.animation.PropertyValuesHolder ofMultiInt(java.lang.String, android.animation.TypeConverter, android.animation.TypeEvaluator, android.animation.Keyframe...); method public static android.animation.PropertyValuesHolder ofObject(java.lang.String, android.animation.TypeEvaluator, java.lang.Object...); method public static android.animation.PropertyValuesHolder ofObject(java.lang.String, android.animation.TypeConverter, android.graphics.Path); - method public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeEvaluator, V...); - method public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeConverter, android.animation.TypeEvaluator, T...); - method public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeConverter, android.graphics.Path); + method public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeEvaluator, V...); + method public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeConverter, android.animation.TypeEvaluator, T...); + method public static android.animation.PropertyValuesHolder ofObject(android.util.Property, android.animation.TypeConverter, android.graphics.Path); method public void setConverter(android.animation.TypeConverter); method public void setEvaluator(android.animation.TypeEvaluator); method public void setFloatValues(float...); @@ -3238,12 +3238,12 @@ package android.animation { method public abstract float getInterpolation(float); } - public abstract class TypeConverter { + public abstract class TypeConverter { ctor public TypeConverter(java.lang.Class, java.lang.Class); method public abstract V convert(T); } - public abstract interface TypeEvaluator { + public abstract interface TypeEvaluator { method public abstract T evaluate(float, T, T); } @@ -3255,6 +3255,7 @@ package android.animation { method public java.lang.Object getAnimatedValue(java.lang.String); method public long getCurrentPlayTime(); method public long getDuration(); + method public static float getDurationScale(); method public static long getFrameDelay(); method public int getRepeatCount(); method public int getRepeatMode(); @@ -3272,6 +3273,7 @@ package android.animation { method public void setCurrentFraction(float); method public void setCurrentPlayTime(long); method public android.animation.ValueAnimator setDuration(long); + method public static void setDurationScale(float); method public void setEvaluator(android.animation.TypeEvaluator); method public void setFloatValues(float...); method public static void setFrameDelay(long); @@ -4572,7 +4574,7 @@ package android.app { method public android.os.Parcelable saveAllState(); } - public abstract class FragmentHostCallback extends android.app.FragmentContainer { + public abstract class FragmentHostCallback extends android.app.FragmentContainer { ctor public FragmentHostCallback(android.content.Context, android.os.Handler, int); method public void onAttachFragment(android.app.Fragment); method public void onDump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]); @@ -4839,12 +4841,12 @@ package android.app { method public abstract void destroyLoader(int); method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]); method public static void enableDebugLogging(boolean); - method public abstract android.content.Loader getLoader(int); - method public abstract android.content.Loader initLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks); - method public abstract android.content.Loader restartLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks); + method public abstract android.content.Loader getLoader(int); + method public abstract android.content.Loader initLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks); + method public abstract android.content.Loader restartLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks); } - public static abstract interface LoaderManager.LoaderCallbacks { + public static abstract interface LoaderManager.LoaderCallbacks { method public abstract android.content.Loader onCreateLoader(int, android.os.Bundle); method public abstract void onLoadFinished(android.content.Loader, D); method public abstract void onLoaderReset(android.content.Loader); @@ -5629,6 +5631,7 @@ package android.app { public class TimePickerDialog extends android.app.AlertDialog implements android.content.DialogInterface.OnClickListener android.widget.TimePicker.OnTimeChangedListener { ctor public TimePickerDialog(android.content.Context, android.app.TimePickerDialog.OnTimeSetListener, int, int, boolean); ctor public TimePickerDialog(android.content.Context, int, android.app.TimePickerDialog.OnTimeSetListener, int, int, boolean); + method public android.widget.TimePicker getTimePicker(); method public void onClick(android.content.DialogInterface, int); method public void onTimeChanged(android.widget.TimePicker, int, int); method public void updateTime(int, int); @@ -7635,7 +7638,7 @@ package android.content { ctor public AsyncQueryHandler.WorkerHandler(android.os.Looper); } - public abstract class AsyncTaskLoader extends android.content.Loader { + public abstract class AsyncTaskLoader extends android.content.Loader { ctor public AsyncTaskLoader(android.content.Context); method public void cancelLoadInBackground(); method public boolean isLoadInBackgroundCanceled(); @@ -7817,7 +7820,7 @@ package android.content { method public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException; method public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException; method protected final android.os.ParcelFileDescriptor openFileHelper(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException; - method public android.os.ParcelFileDescriptor openPipeHelper(android.net.Uri, java.lang.String, android.os.Bundle, T, android.content.ContentProvider.PipeDataWriter) throws java.io.FileNotFoundException; + method public android.os.ParcelFileDescriptor openPipeHelper(android.net.Uri, java.lang.String, android.os.Bundle, T, android.content.ContentProvider.PipeDataWriter) throws java.io.FileNotFoundException; method public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle) throws java.io.FileNotFoundException; method public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal) throws java.io.FileNotFoundException; method public abstract android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String); @@ -7830,7 +7833,7 @@ package android.content { method public abstract int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]); } - public static abstract interface ContentProvider.PipeDataWriter { + public static abstract interface ContentProvider.PipeDataWriter { method public abstract void writeDataToPipe(android.os.ParcelFileDescriptor, android.net.Uri, java.lang.String, android.os.Bundle, T); } @@ -8102,7 +8105,7 @@ package android.content { method public final java.lang.String getString(int); method public final java.lang.String getString(int, java.lang.Object...); method public abstract java.lang.Object getSystemService(java.lang.String); - method public final T getSystemService(java.lang.Class); + method public final T getSystemService(java.lang.Class); method public abstract java.lang.String getSystemServiceName(java.lang.Class); method public final java.lang.CharSequence getText(int); method public abstract android.content.res.Resources.Theme getTheme(); @@ -8459,8 +8462,8 @@ package android.content { method public long getLongExtra(java.lang.String, long); method public java.lang.String getPackage(); method public android.os.Parcelable[] getParcelableArrayExtra(java.lang.String); - method public java.util.ArrayList getParcelableArrayListExtra(java.lang.String); - method public T getParcelableExtra(java.lang.String); + method public java.util.ArrayList getParcelableArrayListExtra(java.lang.String); + method public T getParcelableExtra(java.lang.String); method public java.lang.String getScheme(); method public android.content.Intent getSelector(); method public java.io.Serializable getSerializableExtra(java.lang.String); @@ -8935,7 +8938,7 @@ package android.content { ctor public IntentSender.SendIntentException(java.lang.Exception); } - public class Loader { + public class Loader { ctor public Loader(android.content.Context); method public void abandon(); method public boolean cancelLoad(); @@ -8972,11 +8975,11 @@ package android.content { ctor public Loader.ForceLoadContentObserver(); } - public static abstract interface Loader.OnLoadCanceledListener { + public static abstract interface Loader.OnLoadCanceledListener { method public abstract void onLoadCanceled(android.content.Loader); } - public static abstract interface Loader.OnLoadCompleteListener { + public static abstract interface Loader.OnLoadCompleteListener { method public abstract void onLoadComplete(android.content.Loader, D); } @@ -10853,7 +10856,7 @@ package android.database { method public boolean isNull(int); } - public abstract class Observable { + public abstract class Observable { ctor public Observable(); method public void registerObserver(T); method public void unregisterAll(); @@ -12743,7 +12746,7 @@ package android.graphics.drawable { public class AnimatedStateListDrawable extends android.graphics.drawable.StateListDrawable { ctor public AnimatedStateListDrawable(); method public void addState(int[], android.graphics.drawable.Drawable, int); - method public void addTransition(int, int, T, boolean); + method public void addTransition(int, int, T, boolean); } public class AnimatedVectorDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Animatable2 { @@ -13867,7 +13870,7 @@ package android.hardware.camera2 { } public final class CameraCharacteristics extends android.hardware.camera2.CameraMetadata { - method public T get(android.hardware.camera2.CameraCharacteristics.Key); + method public T get(android.hardware.camera2.CameraCharacteristics.Key); method public java.util.List> getAvailableCaptureRequestKeys(); method public java.util.List> getAvailableCaptureResultKeys(); field public static final android.hardware.camera2.CameraCharacteristics.Key COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES; @@ -13952,7 +13955,7 @@ package android.hardware.camera2 { field public static final android.hardware.camera2.CameraCharacteristics.Key TONEMAP_MAX_CURVE_POINTS; } - public static final class CameraCharacteristics.Key { + public static final class CameraCharacteristics.Key { method public final boolean equals(java.lang.Object); method public java.lang.String getName(); method public final int hashCode(); @@ -14017,7 +14020,7 @@ package android.hardware.camera2 { method public void onTorchModeUnavailable(java.lang.String); } - public abstract class CameraMetadata { + public abstract class CameraMetadata { method public java.util.List getKeys(); field public static final int COLOR_CORRECTION_ABERRATION_MODE_FAST = 1; // 0x1 field public static final int COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY = 2; // 0x2 @@ -14225,7 +14228,7 @@ package android.hardware.camera2 { public final class CaptureRequest extends android.hardware.camera2.CameraMetadata implements android.os.Parcelable { method public int describeContents(); - method public T get(android.hardware.camera2.CaptureRequest.Key); + method public T get(android.hardware.camera2.CaptureRequest.Key); method public java.lang.Object getTag(); method public boolean isReprocess(); method public void writeToParcel(android.os.Parcel, int); @@ -14288,20 +14291,20 @@ package android.hardware.camera2 { public static final class CaptureRequest.Builder { method public void addTarget(android.view.Surface); method public android.hardware.camera2.CaptureRequest build(); - method public T get(android.hardware.camera2.CaptureRequest.Key); + method public T get(android.hardware.camera2.CaptureRequest.Key); method public void removeTarget(android.view.Surface); - method public void set(android.hardware.camera2.CaptureRequest.Key, T); + method public void set(android.hardware.camera2.CaptureRequest.Key, T); method public void setTag(java.lang.Object); } - public static final class CaptureRequest.Key { + public static final class CaptureRequest.Key { method public final boolean equals(java.lang.Object); method public java.lang.String getName(); method public final int hashCode(); } public class CaptureResult extends android.hardware.camera2.CameraMetadata { - method public T get(android.hardware.camera2.CaptureResult.Key); + method public T get(android.hardware.camera2.CaptureResult.Key); method public long getFrameNumber(); method public android.hardware.camera2.CaptureRequest getRequest(); method public int getSequenceId(); @@ -14382,7 +14385,7 @@ package android.hardware.camera2 { field public static final android.hardware.camera2.CaptureResult.Key TONEMAP_PRESET_CURVE; } - public static final class CaptureResult.Key { + public static final class CaptureResult.Key { method public final boolean equals(java.lang.Object); method public java.lang.String getName(); method public final int hashCode(); @@ -14507,14 +14510,14 @@ package android.hardware.camera2.params { method public android.util.Size[] getInputSizes(int); method public final int[] getOutputFormats(); method public long getOutputMinFrameDuration(int, android.util.Size); - method public long getOutputMinFrameDuration(java.lang.Class, android.util.Size); - method public android.util.Size[] getOutputSizes(java.lang.Class); + method public long getOutputMinFrameDuration(java.lang.Class, android.util.Size); + method public android.util.Size[] getOutputSizes(java.lang.Class); method public android.util.Size[] getOutputSizes(int); method public long getOutputStallDuration(int, android.util.Size); - method public long getOutputStallDuration(java.lang.Class, android.util.Size); + method public long getOutputStallDuration(java.lang.Class, android.util.Size); method public final int[] getValidOutputFormatsForInput(int); method public boolean isOutputSupportedFor(int); - method public static boolean isOutputSupportedFor(java.lang.Class); + method public static boolean isOutputSupportedFor(java.lang.Class); method public boolean isOutputSupportedFor(android.view.Surface); } @@ -16215,7 +16218,7 @@ package android.icu.math { package android.icu.text { - public final class AlphabeticIndex implements java.lang.Iterable { + public final class AlphabeticIndex implements java.lang.Iterable { ctor public AlphabeticIndex(android.icu.util.ULocale); ctor public AlphabeticIndex(java.util.Locale); ctor public AlphabeticIndex(android.icu.text.RuleBasedCollator); @@ -16241,7 +16244,7 @@ package android.icu.text { method public android.icu.text.AlphabeticIndex setUnderflowLabel(java.lang.String); } - public static class AlphabeticIndex.Bucket implements java.lang.Iterable { + public static class AlphabeticIndex.Bucket implements java.lang.Iterable { method public java.lang.String getLabel(); method public android.icu.text.AlphabeticIndex.Bucket.LabelType getLabelType(); method public java.util.Iterator> iterator(); @@ -16257,14 +16260,14 @@ package android.icu.text { enum_constant public static final android.icu.text.AlphabeticIndex.Bucket.LabelType UNDERFLOW; } - public static final class AlphabeticIndex.ImmutableIndex implements java.lang.Iterable { + public static final class AlphabeticIndex.ImmutableIndex implements java.lang.Iterable { method public android.icu.text.AlphabeticIndex.Bucket getBucket(int); method public int getBucketCount(); method public int getBucketIndex(java.lang.CharSequence); method public java.util.Iterator> iterator(); } - public static class AlphabeticIndex.Record { + public static class AlphabeticIndex.Record { method public V getData(); method public java.lang.CharSequence getName(); } @@ -17777,8 +17780,8 @@ package android.icu.text { method public final android.icu.text.UnicodeSet addAll(java.lang.CharSequence); method public android.icu.text.UnicodeSet addAll(android.icu.text.UnicodeSet); method public android.icu.text.UnicodeSet addAll(java.lang.Iterable); - method public android.icu.text.UnicodeSet addAll(T...); - method public T addAllTo(T); + method public android.icu.text.UnicodeSet addAll(T...); + method public > T addAllTo(T); method public void addMatchSetTo(android.icu.text.UnicodeSet); method public android.icu.text.UnicodeSet applyIntPropertyValue(int, int); method public final android.icu.text.UnicodeSet applyPattern(java.lang.String); @@ -17806,15 +17809,15 @@ package android.icu.text { method public final boolean contains(java.lang.CharSequence); method public boolean containsAll(android.icu.text.UnicodeSet); method public boolean containsAll(java.lang.String); - method public boolean containsAll(java.lang.Iterable); + method public boolean containsAll(java.lang.Iterable); method public boolean containsNone(int, int); method public boolean containsNone(android.icu.text.UnicodeSet); method public boolean containsNone(java.lang.CharSequence); - method public boolean containsNone(java.lang.Iterable); + method public boolean containsNone(java.lang.Iterable); method public final boolean containsSome(int, int); method public final boolean containsSome(android.icu.text.UnicodeSet); method public final boolean containsSome(java.lang.CharSequence); - method public final boolean containsSome(java.lang.Iterable); + method public final boolean containsSome(java.lang.Iterable); method public android.icu.text.UnicodeSet freeze(); method public static android.icu.text.UnicodeSet from(java.lang.CharSequence); method public static android.icu.text.UnicodeSet fromAll(java.lang.CharSequence); @@ -17832,14 +17835,14 @@ package android.icu.text { method public final android.icu.text.UnicodeSet remove(java.lang.CharSequence); method public final android.icu.text.UnicodeSet removeAll(java.lang.CharSequence); method public android.icu.text.UnicodeSet removeAll(android.icu.text.UnicodeSet); - method public android.icu.text.UnicodeSet removeAll(java.lang.Iterable); + method public android.icu.text.UnicodeSet removeAll(java.lang.Iterable); method public final android.icu.text.UnicodeSet removeAllStrings(); method public android.icu.text.UnicodeSet retain(int, int); method public final android.icu.text.UnicodeSet retain(int); method public final android.icu.text.UnicodeSet retain(java.lang.CharSequence); method public final android.icu.text.UnicodeSet retainAll(java.lang.CharSequence); method public android.icu.text.UnicodeSet retainAll(android.icu.text.UnicodeSet); - method public android.icu.text.UnicodeSet retainAll(java.lang.Iterable); + method public android.icu.text.UnicodeSet retainAll(java.lang.Iterable); method public android.icu.text.UnicodeSet set(int, int); method public android.icu.text.UnicodeSet set(android.icu.text.UnicodeSet); method public int size(); @@ -18249,7 +18252,7 @@ package android.icu.util { method public long getToDate(); } - public abstract interface Freezable implements java.lang.Cloneable { + public abstract interface Freezable implements java.lang.Cloneable { method public abstract T cloneAsThawed(); method public abstract T freeze(); method public abstract boolean isFrozen(); @@ -18531,7 +18534,7 @@ package android.icu.util { field public static final android.icu.util.TimeUnit YEAR; } - public class Output { + public class Output { ctor public Output(); ctor public Output(T); field public T value; @@ -28239,7 +28242,7 @@ package android.opengl { package android.os { - public abstract class AsyncTask { + public abstract class AsyncTask { ctor public AsyncTask(); method public final boolean cancel(boolean); method protected abstract Result doInBackground(Params...); @@ -28466,16 +28469,16 @@ package android.os { method public float getFloat(java.lang.String, float); method public float[] getFloatArray(java.lang.String); method public java.util.ArrayList getIntegerArrayList(java.lang.String); - method public T getParcelable(java.lang.String); + method public T getParcelable(java.lang.String); method public android.os.Parcelable[] getParcelableArray(java.lang.String); - method public java.util.ArrayList getParcelableArrayList(java.lang.String); + method public java.util.ArrayList getParcelableArrayList(java.lang.String); method public java.io.Serializable getSerializable(java.lang.String); method public short getShort(java.lang.String); method public short getShort(java.lang.String, short); method public short[] getShortArray(java.lang.String); method public android.util.Size getSize(java.lang.String); method public android.util.SizeF getSizeF(java.lang.String); - method public android.util.SparseArray getSparseParcelableArray(java.lang.String); + method public android.util.SparseArray getSparseParcelableArray(java.lang.String); method public java.util.ArrayList getStringArrayList(java.lang.String); method public boolean hasFileDescriptors(); method public void putAll(android.os.Bundle); @@ -28980,8 +28983,8 @@ package android.os { method public final long[] createLongArray(); method public final java.lang.String[] createStringArray(); method public final java.util.ArrayList createStringArrayList(); - method public final T[] createTypedArray(android.os.Parcelable.Creator); - method public final java.util.ArrayList createTypedArrayList(android.os.Parcelable.Creator); + method public final T[] createTypedArray(android.os.Parcelable.Creator); + method public final java.util.ArrayList createTypedArrayList(android.os.Parcelable.Creator); method public final int dataAvail(); method public final int dataCapacity(); method public final int dataPosition(); @@ -29014,7 +29017,7 @@ package android.os { method public final long readLong(); method public final void readLongArray(long[]); method public final void readMap(java.util.Map, java.lang.ClassLoader); - method public final T readParcelable(java.lang.ClassLoader); + method public final T readParcelable(java.lang.ClassLoader); method public final android.os.Parcelable[] readParcelableArray(java.lang.ClassLoader); method public final android.os.PersistableBundle readPersistableBundle(); method public final android.os.PersistableBundle readPersistableBundle(java.lang.ClassLoader); @@ -29027,9 +29030,9 @@ package android.os { method public final void readStringArray(java.lang.String[]); method public final void readStringList(java.util.List); method public final android.os.IBinder readStrongBinder(); - method public final void readTypedArray(T[], android.os.Parcelable.Creator); - method public final void readTypedList(java.util.List, android.os.Parcelable.Creator); - method public final T readTypedObject(android.os.Parcelable.Creator); + method public final void readTypedArray(T[], android.os.Parcelable.Creator); + method public final void readTypedList(java.util.List, android.os.Parcelable.Creator); + method public final T readTypedObject(android.os.Parcelable.Creator); method public final java.lang.Object readValue(java.lang.ClassLoader); method public final void recycle(); method public final void setDataCapacity(int); @@ -29060,7 +29063,7 @@ package android.os { method public final void writeMap(java.util.Map); method public final void writeNoException(); method public final void writeParcelable(android.os.Parcelable, int); - method public final void writeParcelableArray(T[], int); + method public final void writeParcelableArray(T[], int); method public final void writePersistableBundle(android.os.PersistableBundle); method public final void writeSerializable(java.io.Serializable); method public final void writeSize(android.util.Size); @@ -29072,9 +29075,9 @@ package android.os { method public final void writeStringList(java.util.List); method public final void writeStrongBinder(android.os.IBinder); method public final void writeStrongInterface(android.os.IInterface); - method public final void writeTypedArray(T[], int); - method public final void writeTypedList(java.util.List); - method public final void writeTypedObject(T, int); + method public final void writeTypedArray(T[], int); + method public final void writeTypedList(java.util.List); + method public final void writeTypedObject(T, int); method public final void writeValue(java.lang.Object); field public static final android.os.Parcelable.Creator STRING_CREATOR; } @@ -29152,11 +29155,11 @@ package android.os { field public static final int PARCELABLE_WRITE_RETURN_VALUE = 1; // 0x1 } - public static abstract interface Parcelable.ClassLoaderCreator implements android.os.Parcelable.Creator { + public static abstract interface Parcelable.ClassLoaderCreator implements android.os.Parcelable.Creator { method public abstract T createFromParcel(android.os.Parcel, java.lang.ClassLoader); } - public static abstract interface Parcelable.Creator { + public static abstract interface Parcelable.Creator { method public abstract T createFromParcel(android.os.Parcel); method public abstract T[] newArray(int); } @@ -29271,7 +29274,7 @@ package android.os { method public abstract void onProgress(int); } - public class RemoteCallbackList { + public class RemoteCallbackList { ctor public RemoteCallbackList(); method public int beginBroadcast(); method public void finishBroadcast(); @@ -32557,7 +32560,7 @@ package android.provider { field public static final java.lang.String RADIO_CELL = "cell"; field public static final java.lang.String RADIO_NFC = "nfc"; field public static final java.lang.String RADIO_WIFI = "wifi"; - field public static final java.lang.String SHOW_PROCESSES = "show_processes"; + field public static final deprecated java.lang.String SHOW_PROCESSES = "show_processes"; field public static final java.lang.String STAY_ON_WHILE_PLUGGED_IN = "stay_on_while_plugged_in"; field public static final java.lang.String TRANSITION_ANIMATION_SCALE = "transition_animation_scale"; field public static final java.lang.String USB_MASS_STORAGE_ENABLED = "usb_mass_storage_enabled"; @@ -34599,7 +34602,7 @@ package android.service.carrier { field public static final java.lang.String SERVICE_INTERFACE = "android.service.carrier.CarrierMessagingService"; } - public static abstract interface CarrierMessagingService.ResultCallback { + public static abstract interface CarrierMessagingService.ResultCallback { method public abstract void onReceiveResult(T) throws android.os.RemoteException; } @@ -34750,7 +34753,7 @@ package android.service.media { field public static final java.lang.String EXTRA_SUGGESTED = "android.service.media.extra.SUGGESTED"; } - public class MediaBrowserService.Result { + public class MediaBrowserService.Result { method public void detach(); method public void sendResult(T); } @@ -37663,14 +37666,14 @@ package android.telephony.gsm { package android.test { - public abstract deprecated class ActivityInstrumentationTestCase extends android.test.ActivityTestCase { + public abstract deprecated class ActivityInstrumentationTestCase extends android.test.ActivityTestCase { ctor public ActivityInstrumentationTestCase(java.lang.String, java.lang.Class); ctor public ActivityInstrumentationTestCase(java.lang.String, java.lang.Class, boolean); method public T getActivity(); method public void testActivityTestCaseSetUpProperly() throws java.lang.Exception; } - public abstract deprecated class ActivityInstrumentationTestCase2 extends android.test.ActivityTestCase { + public abstract deprecated class ActivityInstrumentationTestCase2 extends android.test.ActivityTestCase { ctor public deprecated ActivityInstrumentationTestCase2(java.lang.String, java.lang.Class); ctor public ActivityInstrumentationTestCase2(java.lang.Class); method public T getActivity(); @@ -37685,7 +37688,7 @@ package android.test { method protected void setActivity(android.app.Activity); } - public abstract deprecated class ActivityUnitTestCase extends android.test.ActivityTestCase { + public abstract deprecated class ActivityUnitTestCase extends android.test.ActivityTestCase { ctor public ActivityUnitTestCase(java.lang.Class); method public T getActivity(); method public int getFinishedActivityRequest(); @@ -37731,7 +37734,7 @@ package android.test { method public void testStarted(java.lang.String); } - public abstract deprecated class ApplicationTestCase extends android.test.AndroidTestCase { + public abstract deprecated class ApplicationTestCase extends android.test.AndroidTestCase { ctor public ApplicationTestCase(java.lang.Class); method protected final void createApplication(); method public T getApplication(); @@ -37757,8 +37760,8 @@ package android.test { method public android.app.Instrumentation getInstrumentation(); method public deprecated void injectInsrumentation(android.app.Instrumentation); method public void injectInstrumentation(android.app.Instrumentation); - method public final T launchActivity(java.lang.String, java.lang.Class, android.os.Bundle); - method public final T launchActivityWithIntent(java.lang.String, java.lang.Class, android.content.Intent); + method public final T launchActivity(java.lang.String, java.lang.Class, android.os.Bundle); + method public final T launchActivityWithIntent(java.lang.String, java.lang.Class, android.content.Intent); method public void runTestOnUiThread(java.lang.Runnable) throws java.lang.Throwable; method public void sendKeys(java.lang.String); method public void sendKeys(int...); @@ -37798,7 +37801,7 @@ package android.test { public class LoaderTestCase extends android.test.AndroidTestCase { ctor public LoaderTestCase(); - method public T getLoaderResultSynchronously(android.content.Loader); + method public T getLoaderResultSynchronously(android.content.Loader); } public final deprecated class MoreAsserts { @@ -37853,20 +37856,20 @@ package android.test { method public abstract void startTiming(boolean); } - public abstract deprecated class ProviderTestCase extends android.test.InstrumentationTestCase { + public abstract deprecated class ProviderTestCase extends android.test.InstrumentationTestCase { ctor public ProviderTestCase(java.lang.Class, java.lang.String); method public android.test.mock.MockContentResolver getMockContentResolver(); method public android.test.IsolatedContext getMockContext(); method public T getProvider(); - method public static android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.Class, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; + method public static android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.Class, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; } - public abstract class ProviderTestCase2 extends android.test.AndroidTestCase { + public abstract class ProviderTestCase2 extends android.test.AndroidTestCase { ctor public ProviderTestCase2(java.lang.Class, java.lang.String); method public android.test.mock.MockContentResolver getMockContentResolver(); method public android.test.IsolatedContext getMockContext(); method public T getProvider(); - method public static android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.String, java.lang.Class, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; + method public static android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, java.lang.String, java.lang.Class, java.lang.String, java.lang.String, int, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; } public deprecated class RenamingDelegatingContext extends android.content.ContextWrapper { @@ -37874,11 +37877,11 @@ package android.test { ctor public RenamingDelegatingContext(android.content.Context, android.content.Context, java.lang.String); method public java.lang.String getDatabasePrefix(); method public void makeExistingFilesAndDbsAccessible(); - method public static T providerWithRenamedContext(java.lang.Class, android.content.Context, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; - method public static T providerWithRenamedContext(java.lang.Class, android.content.Context, java.lang.String, boolean) throws java.lang.IllegalAccessException, java.lang.InstantiationException; + method public static T providerWithRenamedContext(java.lang.Class, android.content.Context, java.lang.String) throws java.lang.IllegalAccessException, java.lang.InstantiationException; + method public static T providerWithRenamedContext(java.lang.Class, android.content.Context, java.lang.String, boolean) throws java.lang.IllegalAccessException, java.lang.InstantiationException; } - public abstract deprecated class ServiceTestCase extends android.test.AndroidTestCase { + public abstract deprecated class ServiceTestCase extends android.test.AndroidTestCase { ctor public ServiceTestCase(java.lang.Class); method protected android.os.IBinder bindService(android.content.Intent); method public android.app.Application getApplication(); @@ -37891,7 +37894,7 @@ package android.test { method public void testServiceTestCaseSetUpProperly() throws java.lang.Exception; } - public abstract deprecated class SingleLaunchActivityTestCase extends android.test.InstrumentationTestCase { + public abstract deprecated class SingleLaunchActivityTestCase extends android.test.InstrumentationTestCase { ctor public SingleLaunchActivityTestCase(java.lang.String, java.lang.Class); method public T getActivity(); method public void testActivityTestCaseSetUpProperly() throws java.lang.Exception; @@ -38248,7 +38251,7 @@ package android.test.suitebuilder { ctor public TestMethod(java.lang.String, java.lang.Class); ctor public TestMethod(junit.framework.TestCase); method public junit.framework.TestCase createTest() throws java.lang.IllegalAccessException, java.lang.InstantiationException, java.lang.reflect.InvocationTargetException; - method public T getAnnotation(java.lang.Class); + method public T getAnnotation(java.lang.Class); method public java.lang.Class getEnclosingClass(); method public java.lang.String getEnclosingClassname(); method public java.lang.String getName(); @@ -38691,7 +38694,7 @@ package android.text { method public int getSpanEnd(java.lang.Object); method public int getSpanFlags(java.lang.Object); method public int getSpanStart(java.lang.Object); - method public T[] getSpans(int, int, java.lang.Class); + method public T[] getSpans(int, int, java.lang.Class); method public deprecated int getTextRunCursor(int, int, int, int, int, android.graphics.Paint); method public int getTextWatcherDepth(); method public android.text.SpannableStringBuilder insert(int, java.lang.CharSequence, int, int); @@ -38713,7 +38716,7 @@ package android.text { method public int getSpanEnd(java.lang.Object); method public int getSpanFlags(java.lang.Object); method public int getSpanStart(java.lang.Object); - method public T[] getSpans(int, int, java.lang.Class); + method public T[] getSpans(int, int, java.lang.Class); method public final int length(); method public int nextSpanTransition(int, int, java.lang.Class); method public final java.lang.String toString(); @@ -38723,7 +38726,7 @@ package android.text { method public abstract int getSpanEnd(java.lang.Object); method public abstract int getSpanFlags(java.lang.Object); method public abstract int getSpanStart(java.lang.Object); - method public abstract T[] getSpans(int, int, java.lang.Class); + method public abstract T[] getSpans(int, int, java.lang.Class); method public abstract int nextSpanTransition(int, int, java.lang.Class); field public static final int SPAN_COMPOSING = 256; // 0x100 field public static final int SPAN_EXCLUSIVE_EXCLUSIVE = 33; // 0x21 @@ -39700,7 +39703,7 @@ package android.text.style { field public static final int WEEKDAY_WEDNESDAY = 4; // 0x4 } - public static class TtsSpan.Builder { + public static class TtsSpan.Builder> { ctor public TtsSpan.Builder(java.lang.String); method public android.text.style.TtsSpan build(); method public C setIntArgument(java.lang.String, int); @@ -39796,7 +39799,7 @@ package android.text.style { method public android.text.style.TtsSpan.OrdinalBuilder setNumber(java.lang.String); } - public static class TtsSpan.SemioticClassBuilder extends android.text.style.TtsSpan.Builder { + public static class TtsSpan.SemioticClassBuilder> extends android.text.style.TtsSpan.Builder { ctor public TtsSpan.SemioticClassBuilder(java.lang.String); method public C setAnimacy(java.lang.String); method public C setCase(java.lang.String); @@ -40203,7 +40206,7 @@ package android.util { ctor public AndroidRuntimeException(java.lang.Exception); } - public final class ArrayMap implements java.util.Map { + public final class ArrayMap implements java.util.Map { ctor public ArrayMap(); ctor public ArrayMap(int); ctor public ArrayMap(android.util.ArrayMap); @@ -40231,7 +40234,7 @@ package android.util { method public java.util.Collection values(); } - public final class ArraySet implements java.util.Collection java.util.Set { + public final class ArraySet implements java.util.Collection java.util.Set { ctor public ArraySet(); ctor public ArraySet(int); ctor public ArraySet(android.util.ArraySet); @@ -40252,7 +40255,7 @@ package android.util { method public boolean retainAll(java.util.Collection); method public int size(); method public java.lang.Object[] toArray(); - method public T[] toArray(T[]); + method public T[] toArray(T[]); method public E valueAt(int); } @@ -40397,13 +40400,13 @@ package android.util { public deprecated class FloatMath { } - public abstract class FloatProperty extends android.util.Property { + public abstract class FloatProperty extends android.util.Property { ctor public FloatProperty(java.lang.String); method public final void set(T, java.lang.Float); method public abstract void setValue(T, float); } - public abstract class IntProperty extends android.util.Property { + public abstract class IntProperty extends android.util.Property { ctor public IntProperty(java.lang.String); method public final void set(T, java.lang.Integer); method public abstract void setValue(T, int); @@ -40503,7 +40506,7 @@ package android.util { method public void println(java.lang.String); } - public class LongSparseArray implements java.lang.Cloneable { + public class LongSparseArray implements java.lang.Cloneable { ctor public LongSparseArray(); ctor public LongSparseArray(int); method public void append(long, E); @@ -40523,7 +40526,7 @@ package android.util { method public E valueAt(int); } - public class LruCache { + public class LruCache { ctor public LruCache(int); method protected V create(K); method public final synchronized int createCount(); @@ -40611,9 +40614,9 @@ package android.util { ctor public NoSuchPropertyException(java.lang.String); } - public class Pair { + public class Pair { ctor public Pair(F, S); - method public static android.util.Pair create(A, B); + method public static android.util.Pair create(A, B); field public final F first; field public final S second; } @@ -40646,22 +40649,22 @@ package android.util { method public abstract void println(java.lang.String); } - public abstract class Property { + public abstract class Property { ctor public Property(java.lang.Class, java.lang.String); method public abstract V get(T); method public java.lang.String getName(); method public java.lang.Class getType(); method public boolean isReadOnly(); - method public static android.util.Property of(java.lang.Class, java.lang.Class, java.lang.String); + method public static android.util.Property of(java.lang.Class, java.lang.Class, java.lang.String); method public void set(T, V); } - public final class Range { + public final class Range> { ctor public Range(T, T); method public T clamp(T); method public boolean contains(T); method public boolean contains(android.util.Range); - method public static android.util.Range create(T, T); + method public static > android.util.Range create(T, T); method public android.util.Range extend(android.util.Range); method public android.util.Range extend(T, T); method public android.util.Range extend(T); @@ -40705,7 +40708,7 @@ package android.util { method public static android.util.SizeF parseSizeF(java.lang.String) throws java.lang.NumberFormatException; } - public class SparseArray implements java.lang.Cloneable { + public class SparseArray implements java.lang.Cloneable { ctor public SparseArray(); ctor public SparseArray(int); method public void append(int, E); @@ -45434,7 +45437,7 @@ package android.webkit { method public static java.lang.String stripAnchor(java.lang.String); } - public abstract interface ValueCallback { + public abstract interface ValueCallback { method public abstract void onReceiveValue(T); } @@ -46168,7 +46171,7 @@ package android.widget { field public static final int NO_SELECTION = -2147483648; // 0x80000000 } - public abstract class AdapterView extends android.view.ViewGroup { + public abstract class AdapterView extends android.view.ViewGroup { ctor public AdapterView(android.content.Context); ctor public AdapterView(android.content.Context, android.util.AttributeSet); ctor public AdapterView(android.content.Context, android.util.AttributeSet, int); @@ -46291,7 +46294,7 @@ package android.widget { ctor public AnalogClock(android.content.Context, android.util.AttributeSet, int, int); } - public class ArrayAdapter extends android.widget.BaseAdapter implements android.widget.Filterable android.widget.ThemedSpinnerAdapter { + public class ArrayAdapter extends android.widget.BaseAdapter implements android.widget.Filterable android.widget.ThemedSpinnerAdapter { ctor public ArrayAdapter(android.content.Context, int); ctor public ArrayAdapter(android.content.Context, int, int); ctor public ArrayAdapter(android.content.Context, int, T[]); @@ -46352,7 +46355,7 @@ package android.widget { method protected void performFiltering(java.lang.CharSequence, int); method public void performValidation(); method protected void replaceText(java.lang.CharSequence); - method public void setAdapter(T); + method public void setAdapter(T); method public void setCompletionHint(java.lang.CharSequence); method public void setDropDownAnchor(int); method public void setDropDownBackgroundDrawable(android.graphics.drawable.Drawable); @@ -46603,6 +46606,7 @@ package android.widget { method public int getFirstDayOfWeek(); method public long getMaxDate(); method public long getMinDate(); + method public int getMode(); method public int getMonth(); method public deprecated boolean getSpinnersShown(); method public int getYear(); @@ -46613,6 +46617,8 @@ package android.widget { method public void setMinDate(long); method public deprecated void setSpinnersShown(boolean); method public void updateDate(int, int, int); + field public static final int MODE_CALENDAR = 2; // 0x2 + field public static final int MODE_SPINNER = 1; // 0x1 } public static abstract interface DatePicker.OnDateChangedListener { @@ -48377,6 +48383,7 @@ package android.widget { method public deprecated java.lang.Integer getCurrentMinute(); method public int getHour(); method public int getMinute(); + method public int getMode(); method public boolean is24HourView(); method public deprecated void setCurrentHour(java.lang.Integer); method public deprecated void setCurrentMinute(java.lang.Integer); @@ -48384,6 +48391,8 @@ package android.widget { method public void setIs24HourView(java.lang.Boolean); method public void setMinute(int); method public void setOnTimeChangedListener(android.widget.TimePicker.OnTimeChangedListener); + field public static final int MODE_CLOCK = 2; // 0x2 + field public static final int MODE_SPINNER = 1; // 0x1 } public static abstract interface TimePicker.OnTimeChangedListener { @@ -48638,7 +48647,7 @@ package android.widget { package com.android.internal.util { - public abstract interface Predicate { + public abstract interface Predicate { method public abstract boolean apply(T); } @@ -50685,13 +50694,13 @@ package java.lang { enum_constant public static final java.lang.Character.UnicodeScript YI; } - public final class Class implements java.lang.reflect.AnnotatedElement java.lang.reflect.GenericDeclaration java.io.Serializable java.lang.reflect.Type { - method public java.lang.Class asSubclass(java.lang.Class); + public final class Class implements java.lang.reflect.AnnotatedElement java.lang.reflect.GenericDeclaration java.io.Serializable java.lang.reflect.Type { + method public java.lang.Class asSubclass(java.lang.Class); method public T cast(java.lang.Object); method public boolean desiredAssertionStatus(); method public static java.lang.Class forName(java.lang.String) throws java.lang.ClassNotFoundException; method public static java.lang.Class forName(java.lang.String, boolean, java.lang.ClassLoader) throws java.lang.ClassNotFoundException; - method public A getAnnotation(java.lang.Class); + method public A getAnnotation(java.lang.Class); method public java.lang.annotation.Annotation[] getAnnotations(); method public java.lang.String getCanonicalName(); method public java.lang.ClassLoader getClassLoader(); @@ -50808,7 +50817,7 @@ package java.lang { public abstract interface Cloneable { } - public abstract interface Comparable { + public abstract interface Comparable { method public abstract int compareTo(T); } @@ -50862,7 +50871,7 @@ package java.lang { field public static final java.lang.Class TYPE; } - public abstract class Enum implements java.lang.Comparable java.io.Serializable { + public abstract class Enum> implements java.lang.Comparable java.io.Serializable { ctor protected Enum(java.lang.String, int); method protected final java.lang.Object clone() throws java.lang.CloneNotSupportedException; method public final int compareTo(E); @@ -50872,7 +50881,7 @@ package java.lang { method public final int hashCode(); method public final java.lang.String name(); method public final int ordinal(); - method public static T valueOf(java.lang.Class, java.lang.String); + method public static > T valueOf(java.lang.Class, java.lang.String); } public class EnumConstantNotPresentException extends java.lang.RuntimeException { @@ -50991,7 +51000,7 @@ package java.lang { ctor public IndexOutOfBoundsException(java.lang.String); } - public class InheritableThreadLocal extends java.lang.ThreadLocal { + public class InheritableThreadLocal extends java.lang.ThreadLocal { ctor public InheritableThreadLocal(); method protected T childValue(T); } @@ -51062,7 +51071,7 @@ package java.lang { ctor public InterruptedException(java.lang.String); } - public abstract interface Iterable { + public abstract interface Iterable { method public default void forEach(java.util.function.Consumer); method public abstract java.util.Iterator iterator(); method public default java.util.Spliterator spliterator(); @@ -51270,12 +51279,12 @@ package java.lang { } public class Package implements java.lang.reflect.AnnotatedElement { - method public A getAnnotation(java.lang.Class); + method public A getAnnotation(java.lang.Class); method public java.lang.annotation.Annotation[] getAnnotations(); - method public A[] getAnnotationsByType(java.lang.Class); - method public A getDeclaredAnnotation(java.lang.Class); + method public A[] getAnnotationsByType(java.lang.Class); + method public A getDeclaredAnnotation(java.lang.Class); method public java.lang.annotation.Annotation[] getDeclaredAnnotations(); - method public A[] getDeclaredAnnotationsByType(java.lang.Class); + method public A[] getDeclaredAnnotationsByType(java.lang.Class); method public java.lang.String getImplementationTitle(); method public java.lang.String getImplementationVendor(); method public java.lang.String getImplementationVersion(); @@ -51835,7 +51844,7 @@ package java.lang { method public void uncaughtException(java.lang.Thread, java.lang.Throwable); } - public class ThreadLocal { + public class ThreadLocal { ctor public ThreadLocal(); method public T get(); method protected T initialValue(); @@ -51975,30 +51984,30 @@ package java.lang.annotation { package java.lang.ref { - public class PhantomReference extends java.lang.ref.Reference { + public class PhantomReference extends java.lang.ref.Reference { ctor public PhantomReference(T, java.lang.ref.ReferenceQueue); } - public abstract class Reference { + public abstract class Reference { method public void clear(); method public boolean enqueue(); method public T get(); method public boolean isEnqueued(); } - public class ReferenceQueue { + public class ReferenceQueue { ctor public ReferenceQueue(); method public java.lang.ref.Reference poll(); method public java.lang.ref.Reference remove(long) throws java.lang.IllegalArgumentException, java.lang.InterruptedException; method public java.lang.ref.Reference remove() throws java.lang.InterruptedException; } - public class SoftReference extends java.lang.ref.Reference { + public class SoftReference extends java.lang.ref.Reference { ctor public SoftReference(T); ctor public SoftReference(T, java.lang.ref.ReferenceQueue); } - public class WeakReference extends java.lang.ref.Reference { + public class WeakReference extends java.lang.ref.Reference { ctor public WeakReference(T); ctor public WeakReference(T, java.lang.ref.ReferenceQueue); } @@ -52009,7 +52018,7 @@ package java.lang.reflect { public class AccessibleObject implements java.lang.reflect.AnnotatedElement { ctor protected AccessibleObject(); - method public T getAnnotation(java.lang.Class); + method public T getAnnotation(java.lang.Class); method public java.lang.annotation.Annotation[] getAnnotations(); method public java.lang.annotation.Annotation[] getDeclaredAnnotations(); method public boolean isAccessible(); @@ -52018,12 +52027,12 @@ package java.lang.reflect { } public abstract interface AnnotatedElement { - method public abstract T getAnnotation(java.lang.Class); + method public abstract T getAnnotation(java.lang.Class); method public abstract java.lang.annotation.Annotation[] getAnnotations(); - method public default T[] getAnnotationsByType(java.lang.Class); - method public default java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class); + method public default T[] getAnnotationsByType(java.lang.Class); + method public default java.lang.annotation.Annotation getDeclaredAnnotation(java.lang.Class); method public abstract java.lang.annotation.Annotation[] getDeclaredAnnotations(); - method public default T[] getDeclaredAnnotationsByType(java.lang.Class); + method public default T[] getDeclaredAnnotationsByType(java.lang.Class); method public default boolean isAnnotationPresent(java.lang.Class); } @@ -52051,8 +52060,8 @@ package java.lang.reflect { method public static void setShort(java.lang.Object, int, short) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException; } - public final class Constructor extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member { - method public A getAnnotation(java.lang.Class); + public final class Constructor extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member { + method public A getAnnotation(java.lang.Class); method public java.lang.Class getDeclaringClass(); method public java.lang.Class[] getExceptionTypes(); method public java.lang.reflect.Type[] getGenericExceptionTypes(); @@ -52071,7 +52080,7 @@ package java.lang.reflect { public final class Field extends java.lang.reflect.AccessibleObject implements java.lang.reflect.Member { method public java.lang.Object get(java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException; - method public A getAnnotation(java.lang.Class); + method public A getAnnotation(java.lang.Class); method public boolean getBoolean(java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException; method public byte getByte(java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException; method public char getChar(java.lang.Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException; @@ -52137,7 +52146,7 @@ package java.lang.reflect { } public final class Method extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member { - method public A getAnnotation(java.lang.Class); + method public A getAnnotation(java.lang.Class); method public java.lang.Class getDeclaringClass(); method public java.lang.Object getDefaultValue(); method public java.lang.Class[] getExceptionTypes(); @@ -52215,7 +52224,7 @@ package java.lang.reflect { public abstract interface Type { } - public abstract interface TypeVariable implements java.lang.reflect.Type { + public abstract interface TypeVariable implements java.lang.reflect.Type { method public abstract java.lang.reflect.Type[] getBounds(); method public abstract D getGenericDeclaration(); method public abstract java.lang.String getName(); @@ -53004,7 +53013,7 @@ package java.net { method public abstract java.net.SocketImpl createSocketImpl(); } - public abstract interface SocketOption { + public abstract interface SocketOption { method public abstract java.lang.String name(); method public abstract java.lang.Class type(); } @@ -53588,7 +53597,7 @@ package java.nio.channels { method public final long read(java.nio.ByteBuffer[]) throws java.io.IOException; method public abstract java.net.SocketAddress receive(java.nio.ByteBuffer) throws java.io.IOException; method public abstract int send(java.nio.ByteBuffer, java.net.SocketAddress) throws java.io.IOException; - method public abstract java.nio.channels.DatagramChannel setOption(java.net.SocketOption, T) throws java.io.IOException; + method public abstract java.nio.channels.DatagramChannel setOption(java.net.SocketOption, T) throws java.io.IOException; method public abstract java.net.DatagramSocket socket(); method public final int validOps(); method public abstract int write(java.nio.ByteBuffer) throws java.io.IOException; @@ -53664,8 +53673,8 @@ package java.nio.channels { public abstract interface NetworkChannel implements java.nio.channels.Channel { method public abstract java.nio.channels.NetworkChannel bind(java.net.SocketAddress) throws java.io.IOException; method public abstract java.net.SocketAddress getLocalAddress() throws java.io.IOException; - method public abstract T getOption(java.net.SocketOption) throws java.io.IOException; - method public abstract java.nio.channels.NetworkChannel setOption(java.net.SocketOption, T) throws java.io.IOException; + method public abstract T getOption(java.net.SocketOption) throws java.io.IOException; + method public abstract java.nio.channels.NetworkChannel setOption(java.net.SocketOption, T) throws java.io.IOException; method public abstract java.util.Set> supportedOptions(); } @@ -53782,7 +53791,7 @@ package java.nio.channels { method public final java.nio.channels.ServerSocketChannel bind(java.net.SocketAddress) throws java.io.IOException; method public abstract java.nio.channels.ServerSocketChannel bind(java.net.SocketAddress, int) throws java.io.IOException; method public static java.nio.channels.ServerSocketChannel open() throws java.io.IOException; - method public abstract java.nio.channels.ServerSocketChannel setOption(java.net.SocketOption, T) throws java.io.IOException; + method public abstract java.nio.channels.ServerSocketChannel setOption(java.net.SocketOption, T) throws java.io.IOException; method public abstract java.net.ServerSocket socket(); method public final int validOps(); } @@ -53800,7 +53809,7 @@ package java.nio.channels { method public abstract int read(java.nio.ByteBuffer) throws java.io.IOException; method public abstract long read(java.nio.ByteBuffer[], int, int) throws java.io.IOException; method public final long read(java.nio.ByteBuffer[]) throws java.io.IOException; - method public abstract java.nio.channels.SocketChannel setOption(java.net.SocketOption, T) throws java.io.IOException; + method public abstract java.nio.channels.SocketChannel setOption(java.net.SocketOption, T) throws java.io.IOException; method public abstract java.nio.channels.SocketChannel shutdownInput() throws java.io.IOException; method public abstract java.nio.channels.SocketChannel shutdownOutput() throws java.io.IOException; method public abstract java.net.Socket socket(); @@ -54047,12 +54056,12 @@ package java.security { public final class AccessController { method public static void checkPermission(java.security.Permission) throws java.security.AccessControlException; - method public static T doPrivileged(java.security.PrivilegedAction); - method public static T doPrivileged(java.security.PrivilegedAction, java.security.AccessControlContext); - method public static T doPrivileged(java.security.PrivilegedExceptionAction) throws java.security.PrivilegedActionException; - method public static T doPrivileged(java.security.PrivilegedExceptionAction, java.security.AccessControlContext) throws java.security.PrivilegedActionException; - method public static T doPrivilegedWithCombiner(java.security.PrivilegedAction); - method public static T doPrivilegedWithCombiner(java.security.PrivilegedExceptionAction) throws java.security.PrivilegedActionException; + method public static T doPrivileged(java.security.PrivilegedAction); + method public static T doPrivileged(java.security.PrivilegedAction, java.security.AccessControlContext); + method public static T doPrivileged(java.security.PrivilegedExceptionAction) throws java.security.PrivilegedActionException; + method public static T doPrivileged(java.security.PrivilegedExceptionAction, java.security.AccessControlContext) throws java.security.PrivilegedActionException; + method public static T doPrivilegedWithCombiner(java.security.PrivilegedAction); + method public static T doPrivilegedWithCombiner(java.security.PrivilegedExceptionAction) throws java.security.PrivilegedActionException; method public static java.security.AccessControlContext getContext(); } @@ -54091,7 +54100,7 @@ package java.security { method public static java.security.AlgorithmParameters getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException; method public static java.security.AlgorithmParameters getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException; method public static java.security.AlgorithmParameters getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException; - method public final T getParameterSpec(java.lang.Class) throws java.security.spec.InvalidParameterSpecException; + method public final T getParameterSpec(java.lang.Class) throws java.security.spec.InvalidParameterSpecException; method public final java.security.Provider getProvider(); method public final void init(java.security.spec.AlgorithmParameterSpec) throws java.security.spec.InvalidParameterSpecException; method public final void init(byte[]) throws java.io.IOException; @@ -54103,7 +54112,7 @@ package java.security { ctor public AlgorithmParametersSpi(); method protected abstract byte[] engineGetEncoded() throws java.io.IOException; method protected abstract byte[] engineGetEncoded(java.lang.String) throws java.io.IOException; - method protected abstract T engineGetParameterSpec(java.lang.Class) throws java.security.spec.InvalidParameterSpecException; + method protected abstract T engineGetParameterSpec(java.lang.Class) throws java.security.spec.InvalidParameterSpecException; method protected abstract void engineInit(java.security.spec.AlgorithmParameterSpec) throws java.security.spec.InvalidParameterSpecException; method protected abstract void engineInit(byte[]) throws java.io.IOException; method protected abstract void engineInit(byte[], java.lang.String) throws java.io.IOException; @@ -54288,7 +54297,7 @@ package java.security { method public static java.security.KeyFactory getInstance(java.lang.String) throws java.security.NoSuchAlgorithmException; method public static java.security.KeyFactory getInstance(java.lang.String, java.lang.String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException; method public static java.security.KeyFactory getInstance(java.lang.String, java.security.Provider) throws java.security.NoSuchAlgorithmException; - method public final T getKeySpec(java.security.Key, java.lang.Class) throws java.security.spec.InvalidKeySpecException; + method public final T getKeySpec(java.security.Key, java.lang.Class) throws java.security.spec.InvalidKeySpecException; method public final java.security.Provider getProvider(); method public final java.security.Key translateKey(java.security.Key) throws java.security.InvalidKeyException; } @@ -54297,7 +54306,7 @@ package java.security { ctor public KeyFactorySpi(); method protected abstract java.security.PrivateKey engineGeneratePrivate(java.security.spec.KeySpec) throws java.security.spec.InvalidKeySpecException; method protected abstract java.security.PublicKey engineGeneratePublic(java.security.spec.KeySpec) throws java.security.spec.InvalidKeySpecException; - method protected abstract T engineGetKeySpec(java.security.Key, java.lang.Class) throws java.security.spec.InvalidKeySpecException; + method protected abstract T engineGetKeySpec(java.security.Key, java.lang.Class) throws java.security.spec.InvalidKeySpecException; method protected abstract java.security.Key engineTranslateKey(java.security.Key) throws java.security.InvalidKeyException; } @@ -54566,7 +54575,7 @@ package java.security { field public static final long serialVersionUID = 6034044314589513430L; // 0x53bd3b559a12c6d6L } - public abstract interface PrivilegedAction { + public abstract interface PrivilegedAction { method public abstract T run(); } @@ -54575,7 +54584,7 @@ package java.security { method public java.lang.Exception getException(); } - public abstract interface PrivilegedExceptionAction { + public abstract interface PrivilegedExceptionAction { method public abstract T run() throws java.lang.Exception; } @@ -56757,11 +56766,11 @@ package java.sql { method public abstract void free() throws java.sql.SQLException; method public abstract java.io.InputStream getBinaryStream() throws java.sql.SQLException; method public abstract java.io.Reader getCharacterStream() throws java.sql.SQLException; - method public abstract T getSource(java.lang.Class) throws java.sql.SQLException; + method public abstract T getSource(java.lang.Class) throws java.sql.SQLException; method public abstract java.lang.String getString() throws java.sql.SQLException; method public abstract java.io.OutputStream setBinaryStream() throws java.sql.SQLException; method public abstract java.io.Writer setCharacterStream() throws java.sql.SQLException; - method public abstract T setResult(java.lang.Class) throws java.sql.SQLException; + method public abstract T setResult(java.lang.Class) throws java.sql.SQLException; method public abstract void setString(java.lang.String) throws java.sql.SQLException; } @@ -56885,7 +56894,7 @@ package java.sql { public abstract interface Wrapper { method public abstract boolean isWrapperFor(java.lang.Class) throws java.sql.SQLException; - method public abstract T unwrap(java.lang.Class) throws java.sql.SQLException; + method public abstract T unwrap(java.lang.Class) throws java.sql.SQLException; } } @@ -57418,7 +57427,7 @@ package java.text { package java.util { - public abstract class AbstractCollection implements java.util.Collection { + public abstract class AbstractCollection implements java.util.Collection { ctor protected AbstractCollection(); method public boolean add(E); method public boolean addAll(java.util.Collection); @@ -57432,10 +57441,10 @@ package java.util { method public boolean retainAll(java.util.Collection); method public abstract int size(); method public java.lang.Object[] toArray(); - method public T[] toArray(T[]); + method public T[] toArray(T[]); } - public abstract class AbstractList extends java.util.AbstractCollection implements java.util.List { + public abstract class AbstractList extends java.util.AbstractCollection implements java.util.List { ctor protected AbstractList(); method public void add(int, E); method public boolean addAll(int, java.util.Collection); @@ -57452,7 +57461,7 @@ package java.util { field protected transient int modCount; } - public abstract class AbstractMap implements java.util.Map { + public abstract class AbstractMap implements java.util.Map { ctor protected AbstractMap(); method public void clear(); method public boolean containsKey(java.lang.Object); @@ -57468,7 +57477,7 @@ package java.util { method public java.util.Collection values(); } - public static class AbstractMap.SimpleEntry implements java.util.Map.Entry java.io.Serializable { + public static class AbstractMap.SimpleEntry implements java.util.Map.Entry java.io.Serializable { ctor public AbstractMap.SimpleEntry(K, V); ctor public AbstractMap.SimpleEntry(java.util.Map.Entry); method public K getKey(); @@ -57476,7 +57485,7 @@ package java.util { method public V setValue(V); } - public static class AbstractMap.SimpleImmutableEntry implements java.util.Map.Entry java.io.Serializable { + public static class AbstractMap.SimpleImmutableEntry implements java.util.Map.Entry java.io.Serializable { ctor public AbstractMap.SimpleImmutableEntry(K, V); ctor public AbstractMap.SimpleImmutableEntry(java.util.Map.Entry); method public K getKey(); @@ -57484,23 +57493,23 @@ package java.util { method public V setValue(V); } - public abstract class AbstractQueue extends java.util.AbstractCollection implements java.util.Queue { + public abstract class AbstractQueue extends java.util.AbstractCollection implements java.util.Queue { ctor protected AbstractQueue(); method public E element(); method public E remove(); } - public abstract class AbstractSequentialList extends java.util.AbstractList { + public abstract class AbstractSequentialList extends java.util.AbstractList { ctor protected AbstractSequentialList(); method public E get(int); method public abstract java.util.ListIterator listIterator(int); } - public abstract class AbstractSet extends java.util.AbstractCollection implements java.util.Set { + public abstract class AbstractSet extends java.util.AbstractCollection implements java.util.Set { ctor protected AbstractSet(); } - public class ArrayDeque extends java.util.AbstractCollection implements java.lang.Cloneable java.util.Deque java.io.Serializable { + public class ArrayDeque extends java.util.AbstractCollection implements java.lang.Cloneable java.util.Deque java.io.Serializable { ctor public ArrayDeque(); ctor public ArrayDeque(int); ctor public ArrayDeque(java.util.Collection); @@ -57532,7 +57541,7 @@ package java.util { method public java.util.Spliterator spliterator(); } - public class ArrayList extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { + public class ArrayList extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { ctor public ArrayList(int); ctor public ArrayList(); ctor public ArrayList(java.util.Collection); @@ -57549,7 +57558,7 @@ package java.util { } public class Arrays { - method public static java.util.List asList(T...); + method public static java.util.List asList(T...); method public static int binarySearch(long[], long); method public static int binarySearch(long[], int, int, long); method public static int binarySearch(int[], int); @@ -57566,10 +57575,10 @@ package java.util { method public static int binarySearch(float[], int, int, float); method public static int binarySearch(java.lang.Object[], java.lang.Object); method public static int binarySearch(java.lang.Object[], int, int, java.lang.Object); - method public static int binarySearch(T[], T, java.util.Comparator); - method public static int binarySearch(T[], int, int, T, java.util.Comparator); - method public static T[] copyOf(T[], int); - method public static T[] copyOf(U[], int, java.lang.Class); + method public static int binarySearch(T[], T, java.util.Comparator); + method public static int binarySearch(T[], int, int, T, java.util.Comparator); + method public static T[] copyOf(T[], int); + method public static T[] copyOf(U[], int, java.lang.Class); method public static byte[] copyOf(byte[], int); method public static short[] copyOf(short[], int); method public static int[] copyOf(int[], int); @@ -57578,8 +57587,8 @@ package java.util { method public static float[] copyOf(float[], int); method public static double[] copyOf(double[], int); method public static boolean[] copyOf(boolean[], int); - method public static T[] copyOfRange(T[], int, int); - method public static T[] copyOfRange(U[], int, int, java.lang.Class); + method public static T[] copyOfRange(T[], int, int); + method public static T[] copyOfRange(U[], int, int, java.lang.Class); method public static byte[] copyOfRange(byte[], int, int); method public static short[] copyOfRange(short[], int, int); method public static int[] copyOfRange(int[], int, int); @@ -57627,15 +57636,15 @@ package java.util { method public static int hashCode(float[]); method public static int hashCode(double[]); method public static int hashCode(java.lang.Object[]); - method public static void parallelPrefix(T[], java.util.function.BinaryOperator); - method public static void parallelPrefix(T[], int, int, java.util.function.BinaryOperator); + method public static void parallelPrefix(T[], java.util.function.BinaryOperator); + method public static void parallelPrefix(T[], int, int, java.util.function.BinaryOperator); method public static void parallelPrefix(long[], java.util.function.LongBinaryOperator); method public static void parallelPrefix(long[], int, int, java.util.function.LongBinaryOperator); method public static void parallelPrefix(double[], java.util.function.DoubleBinaryOperator); method public static void parallelPrefix(double[], int, int, java.util.function.DoubleBinaryOperator); method public static void parallelPrefix(int[], java.util.function.IntBinaryOperator); method public static void parallelPrefix(int[], int, int, java.util.function.IntBinaryOperator); - method public static void parallelSetAll(T[], java.util.function.IntFunction); + method public static void parallelSetAll(T[], java.util.function.IntFunction); method public static void parallelSetAll(int[], java.util.function.IntUnaryOperator); method public static void parallelSetAll(long[], java.util.function.IntToLongFunction); method public static void parallelSetAll(double[], java.util.function.IntToDoubleFunction); @@ -57653,11 +57662,11 @@ package java.util { method public static void parallelSort(float[], int, int); method public static void parallelSort(double[]); method public static void parallelSort(double[], int, int); - method public static void parallelSort(T[]); - method public static void parallelSort(T[], int, int); - method public static void parallelSort(T[], java.util.Comparator); - method public static void parallelSort(T[], int, int, java.util.Comparator); - method public static void setAll(T[], java.util.function.IntFunction); + method public static > void parallelSort(T[]); + method public static > void parallelSort(T[], int, int); + method public static void parallelSort(T[], java.util.Comparator); + method public static void parallelSort(T[], int, int, java.util.Comparator); + method public static void setAll(T[], java.util.function.IntFunction); method public static void setAll(int[], java.util.function.IntUnaryOperator); method public static void setAll(long[], java.util.function.IntToLongFunction); method public static void setAll(double[], java.util.function.IntToDoubleFunction); @@ -57677,18 +57686,18 @@ package java.util { method public static void sort(double[], int, int); method public static void sort(java.lang.Object[]); method public static void sort(java.lang.Object[], int, int); - method public static void sort(T[], java.util.Comparator); - method public static void sort(T[], int, int, java.util.Comparator); - method public static java.util.Spliterator spliterator(T[]); - method public static java.util.Spliterator spliterator(T[], int, int); + method public static void sort(T[], java.util.Comparator); + method public static void sort(T[], int, int, java.util.Comparator); + method public static java.util.Spliterator spliterator(T[]); + method public static java.util.Spliterator spliterator(T[], int, int); method public static java.util.Spliterator.OfInt spliterator(int[]); method public static java.util.Spliterator.OfInt spliterator(int[], int, int); method public static java.util.Spliterator.OfLong spliterator(long[]); method public static java.util.Spliterator.OfLong spliterator(long[], int, int); method public static java.util.Spliterator.OfDouble spliterator(double[]); method public static java.util.Spliterator.OfDouble spliterator(double[], int, int); - method public static java.util.stream.Stream stream(T[]); - method public static java.util.stream.Stream stream(T[], int, int); + method public static java.util.stream.Stream stream(T[]); + method public static java.util.stream.Stream stream(T[], int, int); method public static java.util.stream.IntStream stream(int[]); method public static java.util.stream.IntStream stream(int[], int, int); method public static java.util.stream.LongStream stream(long[]); @@ -57845,7 +57854,7 @@ package java.util { field protected long time; } - public abstract interface Collection implements java.lang.Iterable { + public abstract interface Collection implements java.lang.Iterable { method public abstract boolean add(E); method public abstract boolean addAll(java.util.Collection); method public abstract void clear(); @@ -57863,86 +57872,86 @@ package java.util { method public abstract int size(); method public default java.util.stream.Stream stream(); method public abstract java.lang.Object[] toArray(); - method public abstract T[] toArray(T[]); + method public abstract T[] toArray(T[]); } public class Collections { - method public static boolean addAll(java.util.Collection, T...); - method public static java.util.Queue asLifoQueue(java.util.Deque); - method public static int binarySearch(java.util.List>, T); - method public static int binarySearch(java.util.List, T, java.util.Comparator); - method public static java.util.Collection checkedCollection(java.util.Collection, java.lang.Class); - method public static java.util.List checkedList(java.util.List, java.lang.Class); - method public static java.util.Map checkedMap(java.util.Map, java.lang.Class, java.lang.Class); - method public static java.util.Set checkedSet(java.util.Set, java.lang.Class); - method public static java.util.SortedMap checkedSortedMap(java.util.SortedMap, java.lang.Class, java.lang.Class); - method public static java.util.SortedSet checkedSortedSet(java.util.SortedSet, java.lang.Class); - method public static void copy(java.util.List, java.util.List); + method public static boolean addAll(java.util.Collection, T...); + method public static java.util.Queue asLifoQueue(java.util.Deque); + method public static int binarySearch(java.util.List>, T); + method public static int binarySearch(java.util.List, T, java.util.Comparator); + method public static java.util.Collection checkedCollection(java.util.Collection, java.lang.Class); + method public static java.util.List checkedList(java.util.List, java.lang.Class); + method public static java.util.Map checkedMap(java.util.Map, java.lang.Class, java.lang.Class); + method public static java.util.Set checkedSet(java.util.Set, java.lang.Class); + method public static java.util.SortedMap checkedSortedMap(java.util.SortedMap, java.lang.Class, java.lang.Class); + method public static java.util.SortedSet checkedSortedSet(java.util.SortedSet, java.lang.Class); + method public static void copy(java.util.List, java.util.List); method public static boolean disjoint(java.util.Collection, java.util.Collection); - method public static java.util.Enumeration emptyEnumeration(); - method public static java.util.Iterator emptyIterator(); - method public static final java.util.List emptyList(); - method public static java.util.ListIterator emptyListIterator(); - method public static final java.util.Map emptyMap(); - method public static final java.util.Set emptySet(); - method public static java.util.Enumeration enumeration(java.util.Collection); - method public static void fill(java.util.List, T); + method public static java.util.Enumeration emptyEnumeration(); + method public static java.util.Iterator emptyIterator(); + method public static final java.util.List emptyList(); + method public static java.util.ListIterator emptyListIterator(); + method public static final java.util.Map emptyMap(); + method public static final java.util.Set emptySet(); + method public static java.util.Enumeration enumeration(java.util.Collection); + method public static void fill(java.util.List, T); method public static int frequency(java.util.Collection, java.lang.Object); method public static int indexOfSubList(java.util.List, java.util.List); method public static int lastIndexOfSubList(java.util.List, java.util.List); - method public static java.util.ArrayList list(java.util.Enumeration); - method public static T max(java.util.Collection); - method public static T max(java.util.Collection, java.util.Comparator); - method public static T min(java.util.Collection); - method public static T min(java.util.Collection, java.util.Comparator); - method public static java.util.List nCopies(int, T); - method public static java.util.Set newSetFromMap(java.util.Map); - method public static boolean replaceAll(java.util.List, T, T); + method public static java.util.ArrayList list(java.util.Enumeration); + method public static > T max(java.util.Collection); + method public static T max(java.util.Collection, java.util.Comparator); + method public static > T min(java.util.Collection); + method public static T min(java.util.Collection, java.util.Comparator); + method public static java.util.List nCopies(int, T); + method public static java.util.Set newSetFromMap(java.util.Map); + method public static boolean replaceAll(java.util.List, T, T); method public static void reverse(java.util.List); - method public static java.util.Comparator reverseOrder(); - method public static java.util.Comparator reverseOrder(java.util.Comparator); + method public static java.util.Comparator reverseOrder(); + method public static java.util.Comparator reverseOrder(java.util.Comparator); method public static void rotate(java.util.List, int); method public static void shuffle(java.util.List); method public static void shuffle(java.util.List, java.util.Random); - method public static java.util.Set singleton(E); - method public static java.util.List singletonList(E); - method public static java.util.Map singletonMap(K, V); - method public static void sort(java.util.List); - method public static void sort(java.util.List, java.util.Comparator); + method public static java.util.Set singleton(E); + method public static java.util.List singletonList(E); + method public static java.util.Map singletonMap(K, V); + method public static > void sort(java.util.List); + method public static void sort(java.util.List, java.util.Comparator); method public static void swap(java.util.List, int, int); - method public static java.util.Collection synchronizedCollection(java.util.Collection); - method public static java.util.List synchronizedList(java.util.List); - method public static java.util.Map synchronizedMap(java.util.Map); - method public static java.util.Set synchronizedSet(java.util.Set); - method public static java.util.SortedMap synchronizedSortedMap(java.util.SortedMap); - method public static java.util.SortedSet synchronizedSortedSet(java.util.SortedSet); - method public static java.util.Collection unmodifiableCollection(java.util.Collection); - method public static java.util.List unmodifiableList(java.util.List); - method public static java.util.Map unmodifiableMap(java.util.Map); - method public static java.util.Set unmodifiableSet(java.util.Set); - method public static java.util.SortedMap unmodifiableSortedMap(java.util.SortedMap); - method public static java.util.SortedSet unmodifiableSortedSet(java.util.SortedSet); + method public static java.util.Collection synchronizedCollection(java.util.Collection); + method public static java.util.List synchronizedList(java.util.List); + method public static java.util.Map synchronizedMap(java.util.Map); + method public static java.util.Set synchronizedSet(java.util.Set); + method public static java.util.SortedMap synchronizedSortedMap(java.util.SortedMap); + method public static java.util.SortedSet synchronizedSortedSet(java.util.SortedSet); + method public static java.util.Collection unmodifiableCollection(java.util.Collection); + method public static java.util.List unmodifiableList(java.util.List); + method public static java.util.Map unmodifiableMap(java.util.Map); + method public static java.util.Set unmodifiableSet(java.util.Set); + method public static java.util.SortedMap unmodifiableSortedMap(java.util.SortedMap); + method public static java.util.SortedSet unmodifiableSortedSet(java.util.SortedSet); field public static final java.util.List EMPTY_LIST; field public static final java.util.Map EMPTY_MAP; field public static final java.util.Set EMPTY_SET; } - public abstract interface Comparator { + public abstract interface Comparator { method public abstract int compare(T, T); - method public static java.util.Comparator comparing(java.util.function.Function, java.util.Comparator); - method public static java.util.Comparator comparing(java.util.function.Function); - method public static java.util.Comparator comparingDouble(java.util.function.ToDoubleFunction); - method public static java.util.Comparator comparingInt(java.util.function.ToIntFunction); - method public static java.util.Comparator comparingLong(java.util.function.ToLongFunction); + method public static java.util.Comparator comparing(java.util.function.Function, java.util.Comparator); + method public static > java.util.Comparator comparing(java.util.function.Function); + method public static java.util.Comparator comparingDouble(java.util.function.ToDoubleFunction); + method public static java.util.Comparator comparingInt(java.util.function.ToIntFunction); + method public static java.util.Comparator comparingLong(java.util.function.ToLongFunction); method public abstract boolean equals(java.lang.Object); - method public static java.util.Comparator naturalOrder(); - method public static java.util.Comparator nullsFirst(java.util.Comparator); - method public static java.util.Comparator nullsLast(java.util.Comparator); - method public static java.util.Comparator reverseOrder(); + method public static > java.util.Comparator naturalOrder(); + method public static java.util.Comparator nullsFirst(java.util.Comparator); + method public static java.util.Comparator nullsLast(java.util.Comparator); + method public static > java.util.Comparator reverseOrder(); method public default java.util.Comparator reversed(); method public default java.util.Comparator thenComparing(java.util.Comparator); - method public default java.util.Comparator thenComparing(java.util.function.Function, java.util.Comparator); - method public default java.util.Comparator thenComparing(java.util.function.Function); + method public default java.util.Comparator thenComparing(java.util.function.Function, java.util.Comparator); + method public default > java.util.Comparator thenComparing(java.util.function.Function); method public default java.util.Comparator thenComparingDouble(java.util.function.ToDoubleFunction); method public default java.util.Comparator thenComparingInt(java.util.function.ToIntFunction); method public default java.util.Comparator thenComparingLong(java.util.function.ToLongFunction); @@ -58001,7 +58010,7 @@ package java.util { method public deprecated java.lang.String toLocaleString(); } - public abstract interface Deque implements java.util.Queue { + public abstract interface Deque implements java.util.Queue { method public abstract boolean add(E); method public abstract void addFirst(E); method public abstract void addLast(E); @@ -58031,7 +58040,7 @@ package java.util { method public abstract int size(); } - public abstract class Dictionary { + public abstract class Dictionary { ctor public Dictionary(); method public abstract java.util.Enumeration elements(); method public abstract V get(java.lang.Object); @@ -58062,7 +58071,7 @@ package java.util { ctor public EmptyStackException(); } - public class EnumMap extends java.util.AbstractMap implements java.lang.Cloneable java.io.Serializable { + public class EnumMap, V> extends java.util.AbstractMap implements java.lang.Cloneable java.io.Serializable { ctor public EnumMap(java.lang.Class); ctor public EnumMap(java.util.EnumMap); ctor public EnumMap(java.util.Map); @@ -58070,23 +58079,23 @@ package java.util { method public java.util.Set> entrySet(); } - public abstract class EnumSet extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable { - method public static java.util.EnumSet allOf(java.lang.Class); + public abstract class EnumSet> extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable { + method public static > java.util.EnumSet allOf(java.lang.Class); method public java.util.EnumSet clone(); - method public static java.util.EnumSet complementOf(java.util.EnumSet); - method public static java.util.EnumSet copyOf(java.util.EnumSet); - method public static java.util.EnumSet copyOf(java.util.Collection); - method public static java.util.EnumSet noneOf(java.lang.Class); - method public static java.util.EnumSet of(E); - method public static java.util.EnumSet of(E, E); - method public static java.util.EnumSet of(E, E, E); - method public static java.util.EnumSet of(E, E, E, E); - method public static java.util.EnumSet of(E, E, E, E, E); - method public static java.util.EnumSet of(E, E...); - method public static java.util.EnumSet range(E, E); - } - - public abstract interface Enumeration { + method public static > java.util.EnumSet complementOf(java.util.EnumSet); + method public static > java.util.EnumSet copyOf(java.util.EnumSet); + method public static > java.util.EnumSet copyOf(java.util.Collection); + method public static > java.util.EnumSet noneOf(java.lang.Class); + method public static > java.util.EnumSet of(E); + method public static > java.util.EnumSet of(E, E); + method public static > java.util.EnumSet of(E, E, E); + method public static > java.util.EnumSet of(E, E, E, E); + method public static > java.util.EnumSet of(E, E, E, E, E); + method public static > java.util.EnumSet of(E, E...); + method public static > java.util.EnumSet range(E, E); + } + + public abstract interface Enumeration { method public abstract boolean hasMoreElements(); method public abstract E nextElement(); } @@ -58094,7 +58103,7 @@ package java.util { public abstract interface EventListener { } - public abstract class EventListenerProxy implements java.util.EventListener { + public abstract class EventListenerProxy implements java.util.EventListener { ctor public EventListenerProxy(T); method public T getListener(); } @@ -58180,7 +58189,7 @@ package java.util { field public static final int BC = 0; // 0x0 } - public class HashMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable { + public class HashMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable { ctor public HashMap(int, float); ctor public HashMap(int); ctor public HashMap(); @@ -58192,7 +58201,7 @@ package java.util { method public void replaceAll(java.util.function.BiFunction); } - public class HashSet extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable java.util.Set { + public class HashSet extends java.util.AbstractSet implements java.lang.Cloneable java.io.Serializable java.util.Set { ctor public HashSet(); ctor public HashSet(java.util.Collection); ctor public HashSet(int, float); @@ -58203,7 +58212,7 @@ package java.util { method public java.util.Spliterator spliterator(); } - public class Hashtable extends java.util.Dictionary implements java.lang.Cloneable java.util.Map java.io.Serializable { + public class Hashtable extends java.util.Dictionary implements java.lang.Cloneable java.util.Map java.io.Serializable { ctor public Hashtable(int, float); ctor public Hashtable(int); ctor public Hashtable(); @@ -58238,7 +58247,7 @@ package java.util { method public java.util.Collection values(); } - public class IdentityHashMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable { + public class IdentityHashMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.Map java.io.Serializable { ctor public IdentityHashMap(); ctor public IdentityHashMap(int); ctor public IdentityHashMap(java.util.Map); @@ -58305,14 +58314,14 @@ package java.util { ctor public InvalidPropertiesFormatException(java.lang.String); } - public abstract interface Iterator { + public abstract interface Iterator { method public default void forEachRemaining(java.util.function.Consumer); method public abstract boolean hasNext(); method public abstract E next(); method public default void remove(); } - public class LinkedHashMap extends java.util.HashMap implements java.util.Map { + public class LinkedHashMap extends java.util.HashMap implements java.util.Map { ctor public LinkedHashMap(int, float); ctor public LinkedHashMap(int); ctor public LinkedHashMap(); @@ -58321,14 +58330,14 @@ package java.util { method protected boolean removeEldestEntry(java.util.Map.Entry); } - public class LinkedHashSet extends java.util.HashSet implements java.lang.Cloneable java.io.Serializable java.util.Set { + public class LinkedHashSet extends java.util.HashSet implements java.lang.Cloneable java.io.Serializable java.util.Set { ctor public LinkedHashSet(int, float); ctor public LinkedHashSet(int); ctor public LinkedHashSet(); ctor public LinkedHashSet(java.util.Collection); } - public class LinkedList extends java.util.AbstractSequentialList implements java.lang.Cloneable java.util.Deque java.util.List java.io.Serializable { + public class LinkedList extends java.util.AbstractSequentialList implements java.lang.Cloneable java.util.Deque java.util.List java.io.Serializable { ctor public LinkedList(); ctor public LinkedList(java.util.Collection); method public void addFirst(E); @@ -58359,7 +58368,7 @@ package java.util { method public java.util.Spliterator spliterator(); } - public abstract interface List implements java.util.Collection { + public abstract interface List implements java.util.Collection { method public abstract boolean add(E); method public abstract void add(int, E); method public abstract boolean addAll(java.util.Collection); @@ -58386,10 +58395,10 @@ package java.util { method public default void sort(java.util.Comparator); method public abstract java.util.List subList(int, int); method public abstract java.lang.Object[] toArray(); - method public abstract T[] toArray(T[]); + method public abstract T[] toArray(T[]); } - public abstract interface ListIterator implements java.util.Iterator { + public abstract interface ListIterator implements java.util.Iterator { method public abstract void add(E); method public abstract boolean hasNext(); method public abstract boolean hasPrevious(); @@ -58506,7 +58515,7 @@ package java.util { method public final long getSum(); } - public abstract interface Map { + public abstract interface Map { method public abstract void clear(); method public default V compute(K, java.util.function.BiFunction); method public default V computeIfAbsent(K, java.util.function.Function); @@ -58534,11 +58543,11 @@ package java.util { method public abstract java.util.Collection values(); } - public static abstract interface Map.Entry { - method public static java.util.Comparator> comparingByKey(); - method public static java.util.Comparator> comparingByKey(java.util.Comparator); - method public static java.util.Comparator> comparingByValue(); - method public static java.util.Comparator> comparingByValue(java.util.Comparator); + public static abstract interface Map.Entry { + method public static , V> java.util.Comparator> comparingByKey(); + method public static java.util.Comparator> comparingByKey(java.util.Comparator); + method public static > java.util.Comparator> comparingByValue(); + method public static java.util.Comparator> comparingByValue(java.util.Comparator); method public abstract boolean equals(java.lang.Object); method public abstract K getKey(); method public abstract V getValue(); @@ -58562,7 +58571,7 @@ package java.util { method public java.lang.String getKey(); } - public abstract interface NavigableMap implements java.util.SortedMap { + public abstract interface NavigableMap implements java.util.SortedMap { method public abstract java.util.Map.Entry ceilingEntry(K); method public abstract K ceilingKey(K); method public abstract java.util.NavigableSet descendingKeySet(); @@ -58586,7 +58595,7 @@ package java.util { method public abstract java.util.SortedMap tailMap(K); } - public abstract interface NavigableSet implements java.util.SortedSet { + public abstract interface NavigableSet implements java.util.SortedSet { method public abstract E ceiling(E); method public abstract java.util.Iterator descendingIterator(); method public abstract java.util.NavigableSet descendingSet(); @@ -58610,16 +58619,16 @@ package java.util { } public final class Objects { - method public static int compare(T, T, java.util.Comparator); + method public static int compare(T, T, java.util.Comparator); method public static boolean deepEquals(java.lang.Object, java.lang.Object); method public static boolean equals(java.lang.Object, java.lang.Object); method public static int hash(java.lang.Object...); method public static int hashCode(java.lang.Object); method public static boolean isNull(java.lang.Object); method public static boolean nonNull(java.lang.Object); - method public static T requireNonNull(T); - method public static T requireNonNull(T, java.lang.String); - method public static T requireNonNull(T, java.util.function.Supplier); + method public static T requireNonNull(T); + method public static T requireNonNull(T, java.lang.String); + method public static T requireNonNull(T, java.util.function.Supplier); method public static java.lang.String toString(java.lang.Object); method public static java.lang.String toString(java.lang.Object, java.lang.String); } @@ -58641,19 +58650,19 @@ package java.util { method public abstract void update(java.util.Observable, java.lang.Object); } - public final class Optional { - method public static java.util.Optional empty(); + public final class Optional { + method public static java.util.Optional empty(); method public java.util.Optional filter(java.util.function.Predicate); - method public java.util.Optional flatMap(java.util.function.Function>); + method public java.util.Optional flatMap(java.util.function.Function>); method public T get(); method public void ifPresent(java.util.function.Consumer); method public boolean isPresent(); - method public java.util.Optional map(java.util.function.Function); - method public static java.util.Optional of(T); - method public static java.util.Optional ofNullable(T); + method public java.util.Optional map(java.util.function.Function); + method public static java.util.Optional of(T); + method public static java.util.Optional ofNullable(T); method public T orElse(T); method public T orElseGet(java.util.function.Supplier); - method public T orElseThrow(java.util.function.Supplier) throws java.lang.Throwable; + method public T orElseThrow(java.util.function.Supplier) throws java.lang.Throwable; } public final class OptionalDouble { @@ -58664,7 +58673,7 @@ package java.util { method public static java.util.OptionalDouble of(double); method public double orElse(double); method public double orElseGet(java.util.function.DoubleSupplier); - method public double orElseThrow(java.util.function.Supplier) throws java.lang.Throwable; + method public double orElseThrow(java.util.function.Supplier) throws java.lang.Throwable; } public final class OptionalInt { @@ -58675,7 +58684,7 @@ package java.util { method public static java.util.OptionalInt of(int); method public int orElse(int); method public int orElseGet(java.util.function.IntSupplier); - method public int orElseThrow(java.util.function.Supplier) throws java.lang.Throwable; + method public int orElseThrow(java.util.function.Supplier) throws java.lang.Throwable; } public final class OptionalLong { @@ -58686,10 +58695,10 @@ package java.util { method public static java.util.OptionalLong of(long); method public long orElse(long); method public long orElseGet(java.util.function.LongSupplier); - method public long orElseThrow(java.util.function.Supplier) throws java.lang.Throwable; + method public long orElseThrow(java.util.function.Supplier) throws java.lang.Throwable; } - public abstract interface PrimitiveIterator implements java.util.Iterator { + public abstract interface PrimitiveIterator implements java.util.Iterator { method public abstract void forEachRemaining(T_CONS); } @@ -58714,7 +58723,7 @@ package java.util { method public abstract long nextLong(); } - public class PriorityQueue extends java.util.AbstractQueue implements java.io.Serializable { + public class PriorityQueue extends java.util.AbstractQueue implements java.io.Serializable { ctor public PriorityQueue(); ctor public PriorityQueue(int); ctor public PriorityQueue(java.util.Comparator); @@ -58763,7 +58772,7 @@ package java.util { method public java.lang.Object handleGetObject(java.lang.String); } - public abstract interface Queue implements java.util.Collection { + public abstract interface Queue implements java.util.Collection { method public abstract boolean add(E); method public abstract E element(); method public abstract boolean offer(E); @@ -58913,15 +58922,15 @@ package java.util { ctor public ServiceConfigurationError(java.lang.String, java.lang.Throwable); } - public final class ServiceLoader implements java.lang.Iterable { + public final class ServiceLoader implements java.lang.Iterable { method public java.util.Iterator iterator(); - method public static java.util.ServiceLoader load(java.lang.Class, java.lang.ClassLoader); - method public static java.util.ServiceLoader load(java.lang.Class); - method public static java.util.ServiceLoader loadInstalled(java.lang.Class); + method public static java.util.ServiceLoader load(java.lang.Class, java.lang.ClassLoader); + method public static java.util.ServiceLoader load(java.lang.Class); + method public static java.util.ServiceLoader loadInstalled(java.lang.Class); method public void reload(); } - public abstract interface Set implements java.util.Collection { + public abstract interface Set implements java.util.Collection { method public abstract boolean add(E); method public abstract boolean addAll(java.util.Collection); method public abstract void clear(); @@ -58936,7 +58945,7 @@ package java.util { method public abstract boolean retainAll(java.util.Collection); method public abstract int size(); method public abstract java.lang.Object[] toArray(); - method public abstract T[] toArray(T[]); + method public abstract T[] toArray(T[]); } public class SimpleTimeZone extends java.util.TimeZone { @@ -58962,7 +58971,7 @@ package java.util { field public static final int WALL_TIME = 0; // 0x0 } - public abstract interface SortedMap implements java.util.Map { + public abstract interface SortedMap implements java.util.Map { method public abstract java.util.Comparator comparator(); method public abstract java.util.Set> entrySet(); method public abstract K firstKey(); @@ -58974,7 +58983,7 @@ package java.util { method public abstract java.util.Collection values(); } - public abstract interface SortedSet implements java.util.Set { + public abstract interface SortedSet implements java.util.Set { method public abstract java.util.Comparator comparator(); method public abstract E first(); method public abstract java.util.SortedSet headSet(E); @@ -58983,7 +58992,7 @@ package java.util { method public abstract java.util.SortedSet tailSet(E); } - public abstract interface Spliterator { + public abstract interface Spliterator { method public abstract int characteristics(); method public abstract long estimateSize(); method public default void forEachRemaining(java.util.function.Consumer); @@ -59026,7 +59035,7 @@ package java.util { method public abstract java.util.Spliterator.OfLong trySplit(); } - public static abstract interface Spliterator.OfPrimitive implements java.util.Spliterator { + public static abstract interface Spliterator.OfPrimitive> implements java.util.Spliterator { method public default void forEachRemaining(T_CONS); method public abstract boolean tryAdvance(T_CONS); method public abstract T_SPLITR trySplit(); @@ -59036,25 +59045,25 @@ package java.util { method public static java.util.Spliterator.OfDouble emptyDoubleSpliterator(); method public static java.util.Spliterator.OfInt emptyIntSpliterator(); method public static java.util.Spliterator.OfLong emptyLongSpliterator(); - method public static java.util.Spliterator emptySpliterator(); - method public static java.util.Iterator iterator(java.util.Spliterator); + method public static java.util.Spliterator emptySpliterator(); + method public static java.util.Iterator iterator(java.util.Spliterator); method public static java.util.PrimitiveIterator.OfInt iterator(java.util.Spliterator.OfInt); method public static java.util.PrimitiveIterator.OfLong iterator(java.util.Spliterator.OfLong); method public static java.util.PrimitiveIterator.OfDouble iterator(java.util.Spliterator.OfDouble); - method public static java.util.Spliterator spliterator(java.lang.Object[], int); - method public static java.util.Spliterator spliterator(java.lang.Object[], int, int, int); + method public static java.util.Spliterator spliterator(java.lang.Object[], int); + method public static java.util.Spliterator spliterator(java.lang.Object[], int, int, int); method public static java.util.Spliterator.OfInt spliterator(int[], int); method public static java.util.Spliterator.OfInt spliterator(int[], int, int, int); method public static java.util.Spliterator.OfLong spliterator(long[], int); method public static java.util.Spliterator.OfLong spliterator(long[], int, int, int); method public static java.util.Spliterator.OfDouble spliterator(double[], int); method public static java.util.Spliterator.OfDouble spliterator(double[], int, int, int); - method public static java.util.Spliterator spliterator(java.util.Collection, int); - method public static java.util.Spliterator spliterator(java.util.Iterator, long, int); + method public static java.util.Spliterator spliterator(java.util.Collection, int); + method public static java.util.Spliterator spliterator(java.util.Iterator, long, int); method public static java.util.Spliterator.OfInt spliterator(java.util.PrimitiveIterator.OfInt, long, int); method public static java.util.Spliterator.OfLong spliterator(java.util.PrimitiveIterator.OfLong, long, int); method public static java.util.Spliterator.OfDouble spliterator(java.util.PrimitiveIterator.OfDouble, long, int); - method public static java.util.Spliterator spliteratorUnknownSize(java.util.Iterator, int); + method public static java.util.Spliterator spliteratorUnknownSize(java.util.Iterator, int); method public static java.util.Spliterator.OfInt spliteratorUnknownSize(java.util.PrimitiveIterator.OfInt, int); method public static java.util.Spliterator.OfLong spliteratorUnknownSize(java.util.PrimitiveIterator.OfLong, int); method public static java.util.Spliterator.OfDouble spliteratorUnknownSize(java.util.PrimitiveIterator.OfDouble, int); @@ -59081,7 +59090,7 @@ package java.util { method public java.util.Spliterator.OfLong trySplit(); } - public static abstract class Spliterators.AbstractSpliterator implements java.util.Spliterator { + public static abstract class Spliterators.AbstractSpliterator implements java.util.Spliterator { ctor protected Spliterators.AbstractSpliterator(long, int); method public int characteristics(); method public long estimateSize(); @@ -59116,7 +59125,7 @@ package java.util { method public java.util.SplittableRandom split(); } - public class Stack extends java.util.Vector { + public class Stack extends java.util.Vector { ctor public Stack(); method public boolean empty(); method public synchronized E peek(); @@ -59200,7 +59209,7 @@ package java.util { ctor public TooManyListenersException(java.lang.String); } - public class TreeMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.NavigableMap java.io.Serializable { + public class TreeMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.NavigableMap java.io.Serializable { ctor public TreeMap(); ctor public TreeMap(java.util.Comparator); ctor public TreeMap(java.util.Map); @@ -59237,7 +59246,7 @@ package java.util { method public java.util.SortedMap tailMap(K); } - public class TreeSet extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable { + public class TreeSet extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable { ctor public TreeSet(); ctor public TreeSet(java.util.Comparator); ctor public TreeSet(java.util.Collection); @@ -59290,7 +59299,7 @@ package java.util { method public java.lang.String getFlags(); } - public class Vector extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { + public class Vector extends java.util.AbstractList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { ctor public Vector(int, int); ctor public Vector(int); ctor public Vector(); @@ -59325,7 +59334,7 @@ package java.util { field protected java.lang.Object[] elementData; } - public class WeakHashMap extends java.util.AbstractMap implements java.util.Map { + public class WeakHashMap extends java.util.AbstractMap implements java.util.Map { ctor public WeakHashMap(int, float); ctor public WeakHashMap(int); ctor public WeakHashMap(); @@ -59341,18 +59350,18 @@ package java.util.concurrent { public abstract class AbstractExecutorService implements java.util.concurrent.ExecutorService { ctor public AbstractExecutorService(); - method public java.util.List> invokeAll(java.util.Collection>) throws java.lang.InterruptedException; - method public java.util.List> invokeAll(java.util.Collection>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; - method public T invokeAny(java.util.Collection>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; - method public T invokeAny(java.util.Collection>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; - method protected java.util.concurrent.RunnableFuture newTaskFor(java.lang.Runnable, T); - method protected java.util.concurrent.RunnableFuture newTaskFor(java.util.concurrent.Callable); + method public java.util.List> invokeAll(java.util.Collection>) throws java.lang.InterruptedException; + method public java.util.List> invokeAll(java.util.Collection>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; + method public T invokeAny(java.util.Collection>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; + method public T invokeAny(java.util.Collection>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; + method protected java.util.concurrent.RunnableFuture newTaskFor(java.lang.Runnable, T); + method protected java.util.concurrent.RunnableFuture newTaskFor(java.util.concurrent.Callable); method public java.util.concurrent.Future submit(java.lang.Runnable); - method public java.util.concurrent.Future submit(java.lang.Runnable, T); - method public java.util.concurrent.Future submit(java.util.concurrent.Callable); + method public java.util.concurrent.Future submit(java.lang.Runnable, T); + method public java.util.concurrent.Future submit(java.util.concurrent.Callable); } - public class ArrayBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { + public class ArrayBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { ctor public ArrayBlockingQueue(int); ctor public ArrayBlockingQueue(int, boolean); ctor public ArrayBlockingQueue(int, boolean, java.util.Collection); @@ -59371,7 +59380,7 @@ package java.util.concurrent { method public E take() throws java.lang.InterruptedException; } - public abstract interface BlockingDeque implements java.util.concurrent.BlockingQueue java.util.Deque { + public abstract interface BlockingDeque implements java.util.concurrent.BlockingQueue java.util.Deque { method public abstract boolean add(E); method public abstract void addFirst(E); method public abstract void addLast(E); @@ -59403,7 +59412,7 @@ package java.util.concurrent { method public abstract E takeLast() throws java.lang.InterruptedException; } - public abstract interface BlockingQueue implements java.util.Queue { + public abstract interface BlockingQueue implements java.util.Queue { method public abstract boolean add(E); method public abstract boolean contains(java.lang.Object); method public abstract int drainTo(java.util.Collection); @@ -59422,7 +59431,7 @@ package java.util.concurrent { ctor public BrokenBarrierException(java.lang.String); } - public abstract interface Callable { + public abstract interface Callable { method public abstract V call() throws java.lang.Exception; } @@ -59431,28 +59440,28 @@ package java.util.concurrent { ctor public CancellationException(java.lang.String); } - public class CompletableFuture implements java.util.concurrent.CompletionStage java.util.concurrent.Future { + public class CompletableFuture implements java.util.concurrent.CompletionStage java.util.concurrent.Future { ctor public CompletableFuture(); method public java.util.concurrent.CompletableFuture acceptEither(java.util.concurrent.CompletionStage, java.util.function.Consumer); method public java.util.concurrent.CompletableFuture acceptEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Consumer); method public java.util.concurrent.CompletableFuture acceptEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Consumer, java.util.concurrent.Executor); method public static java.util.concurrent.CompletableFuture allOf(java.util.concurrent.CompletableFuture...); method public static java.util.concurrent.CompletableFuture anyOf(java.util.concurrent.CompletableFuture...); - method public java.util.concurrent.CompletableFuture applyToEither(java.util.concurrent.CompletionStage, java.util.function.Function); - method public java.util.concurrent.CompletableFuture applyToEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Function); - method public java.util.concurrent.CompletableFuture applyToEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Function, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture applyToEither(java.util.concurrent.CompletionStage, java.util.function.Function); + method public java.util.concurrent.CompletableFuture applyToEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Function); + method public java.util.concurrent.CompletableFuture applyToEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Function, java.util.concurrent.Executor); method public boolean cancel(boolean); method public boolean complete(T); method public boolean completeExceptionally(java.lang.Throwable); - method public static java.util.concurrent.CompletableFuture completedFuture(U); + method public static java.util.concurrent.CompletableFuture completedFuture(U); method public java.util.concurrent.CompletableFuture exceptionally(java.util.function.Function); method public T get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; method public T get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; method public T getNow(T); method public int getNumberOfDependents(); - method public java.util.concurrent.CompletableFuture handle(java.util.function.BiFunction); - method public java.util.concurrent.CompletableFuture handleAsync(java.util.function.BiFunction); - method public java.util.concurrent.CompletableFuture handleAsync(java.util.function.BiFunction, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture handle(java.util.function.BiFunction); + method public java.util.concurrent.CompletableFuture handleAsync(java.util.function.BiFunction); + method public java.util.concurrent.CompletableFuture handleAsync(java.util.function.BiFunction, java.util.concurrent.Executor); method public boolean isCancelled(); method public boolean isCompletedExceptionally(); method public boolean isDone(); @@ -59467,23 +59476,23 @@ package java.util.concurrent { method public java.util.concurrent.CompletableFuture runAfterEitherAsync(java.util.concurrent.CompletionStage, java.lang.Runnable, java.util.concurrent.Executor); method public static java.util.concurrent.CompletableFuture runAsync(java.lang.Runnable); method public static java.util.concurrent.CompletableFuture runAsync(java.lang.Runnable, java.util.concurrent.Executor); - method public static java.util.concurrent.CompletableFuture supplyAsync(java.util.function.Supplier); - method public static java.util.concurrent.CompletableFuture supplyAsync(java.util.function.Supplier, java.util.concurrent.Executor); + method public static java.util.concurrent.CompletableFuture supplyAsync(java.util.function.Supplier); + method public static java.util.concurrent.CompletableFuture supplyAsync(java.util.function.Supplier, java.util.concurrent.Executor); method public java.util.concurrent.CompletableFuture thenAccept(java.util.function.Consumer); method public java.util.concurrent.CompletableFuture thenAcceptAsync(java.util.function.Consumer); method public java.util.concurrent.CompletableFuture thenAcceptAsync(java.util.function.Consumer, java.util.concurrent.Executor); - method public java.util.concurrent.CompletableFuture thenAcceptBoth(java.util.concurrent.CompletionStage, java.util.function.BiConsumer); - method public java.util.concurrent.CompletableFuture thenAcceptBothAsync(java.util.concurrent.CompletionStage, java.util.function.BiConsumer); - method public java.util.concurrent.CompletableFuture thenAcceptBothAsync(java.util.concurrent.CompletionStage, java.util.function.BiConsumer, java.util.concurrent.Executor); - method public java.util.concurrent.CompletableFuture thenApply(java.util.function.Function); - method public java.util.concurrent.CompletableFuture thenApplyAsync(java.util.function.Function); - method public java.util.concurrent.CompletableFuture thenApplyAsync(java.util.function.Function, java.util.concurrent.Executor); - method public java.util.concurrent.CompletableFuture thenCombine(java.util.concurrent.CompletionStage, java.util.function.BiFunction); - method public java.util.concurrent.CompletableFuture thenCombineAsync(java.util.concurrent.CompletionStage, java.util.function.BiFunction); - method public java.util.concurrent.CompletableFuture thenCombineAsync(java.util.concurrent.CompletionStage, java.util.function.BiFunction, java.util.concurrent.Executor); - method public java.util.concurrent.CompletableFuture thenCompose(java.util.function.Function>); - method public java.util.concurrent.CompletableFuture thenComposeAsync(java.util.function.Function>); - method public java.util.concurrent.CompletableFuture thenComposeAsync(java.util.function.Function>, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture thenAcceptBoth(java.util.concurrent.CompletionStage, java.util.function.BiConsumer); + method public java.util.concurrent.CompletableFuture thenAcceptBothAsync(java.util.concurrent.CompletionStage, java.util.function.BiConsumer); + method public java.util.concurrent.CompletableFuture thenAcceptBothAsync(java.util.concurrent.CompletionStage, java.util.function.BiConsumer, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture thenApply(java.util.function.Function); + method public java.util.concurrent.CompletableFuture thenApplyAsync(java.util.function.Function); + method public java.util.concurrent.CompletableFuture thenApplyAsync(java.util.function.Function, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture thenCombine(java.util.concurrent.CompletionStage, java.util.function.BiFunction); + method public java.util.concurrent.CompletableFuture thenCombineAsync(java.util.concurrent.CompletionStage, java.util.function.BiFunction); + method public java.util.concurrent.CompletableFuture thenCombineAsync(java.util.concurrent.CompletionStage, java.util.function.BiFunction, java.util.concurrent.Executor); + method public java.util.concurrent.CompletableFuture thenCompose(java.util.function.Function>); + method public java.util.concurrent.CompletableFuture thenComposeAsync(java.util.function.Function>); + method public java.util.concurrent.CompletableFuture thenComposeAsync(java.util.function.Function>, java.util.concurrent.Executor); method public java.util.concurrent.CompletableFuture thenRun(java.lang.Runnable); method public java.util.concurrent.CompletableFuture thenRunAsync(java.lang.Runnable); method public java.util.concurrent.CompletableFuture thenRunAsync(java.lang.Runnable, java.util.concurrent.Executor); @@ -59503,7 +59512,7 @@ package java.util.concurrent { ctor public CompletionException(java.lang.Throwable); } - public abstract interface CompletionService { + public abstract interface CompletionService { method public abstract java.util.concurrent.Future poll(); method public abstract java.util.concurrent.Future poll(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; method public abstract java.util.concurrent.Future submit(java.util.concurrent.Callable); @@ -59511,17 +59520,17 @@ package java.util.concurrent { method public abstract java.util.concurrent.Future take() throws java.lang.InterruptedException; } - public abstract interface CompletionStage { + public abstract interface CompletionStage { method public abstract java.util.concurrent.CompletionStage acceptEither(java.util.concurrent.CompletionStage, java.util.function.Consumer); method public abstract java.util.concurrent.CompletionStage acceptEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Consumer); method public abstract java.util.concurrent.CompletionStage acceptEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Consumer, java.util.concurrent.Executor); - method public abstract java.util.concurrent.CompletionStage applyToEither(java.util.concurrent.CompletionStage, java.util.function.Function); - method public abstract java.util.concurrent.CompletionStage applyToEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Function); - method public abstract java.util.concurrent.CompletionStage applyToEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Function, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage applyToEither(java.util.concurrent.CompletionStage, java.util.function.Function); + method public abstract java.util.concurrent.CompletionStage applyToEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Function); + method public abstract java.util.concurrent.CompletionStage applyToEitherAsync(java.util.concurrent.CompletionStage, java.util.function.Function, java.util.concurrent.Executor); method public abstract java.util.concurrent.CompletionStage exceptionally(java.util.function.Function); - method public abstract java.util.concurrent.CompletionStage handle(java.util.function.BiFunction); - method public abstract java.util.concurrent.CompletionStage handleAsync(java.util.function.BiFunction); - method public abstract java.util.concurrent.CompletionStage handleAsync(java.util.function.BiFunction, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage handle(java.util.function.BiFunction); + method public abstract java.util.concurrent.CompletionStage handleAsync(java.util.function.BiFunction); + method public abstract java.util.concurrent.CompletionStage handleAsync(java.util.function.BiFunction, java.util.concurrent.Executor); method public abstract java.util.concurrent.CompletionStage runAfterBoth(java.util.concurrent.CompletionStage, java.lang.Runnable); method public abstract java.util.concurrent.CompletionStage runAfterBothAsync(java.util.concurrent.CompletionStage, java.lang.Runnable); method public abstract java.util.concurrent.CompletionStage runAfterBothAsync(java.util.concurrent.CompletionStage, java.lang.Runnable, java.util.concurrent.Executor); @@ -59531,18 +59540,18 @@ package java.util.concurrent { method public abstract java.util.concurrent.CompletionStage thenAccept(java.util.function.Consumer); method public abstract java.util.concurrent.CompletionStage thenAcceptAsync(java.util.function.Consumer); method public abstract java.util.concurrent.CompletionStage thenAcceptAsync(java.util.function.Consumer, java.util.concurrent.Executor); - method public abstract java.util.concurrent.CompletionStage thenAcceptBoth(java.util.concurrent.CompletionStage, java.util.function.BiConsumer); - method public abstract java.util.concurrent.CompletionStage thenAcceptBothAsync(java.util.concurrent.CompletionStage, java.util.function.BiConsumer); - method public abstract java.util.concurrent.CompletionStage thenAcceptBothAsync(java.util.concurrent.CompletionStage, java.util.function.BiConsumer, java.util.concurrent.Executor); - method public abstract java.util.concurrent.CompletionStage thenApply(java.util.function.Function); - method public abstract java.util.concurrent.CompletionStage thenApplyAsync(java.util.function.Function); - method public abstract java.util.concurrent.CompletionStage thenApplyAsync(java.util.function.Function, java.util.concurrent.Executor); - method public abstract java.util.concurrent.CompletionStage thenCombine(java.util.concurrent.CompletionStage, java.util.function.BiFunction); - method public abstract java.util.concurrent.CompletionStage thenCombineAsync(java.util.concurrent.CompletionStage, java.util.function.BiFunction); - method public abstract java.util.concurrent.CompletionStage thenCombineAsync(java.util.concurrent.CompletionStage, java.util.function.BiFunction, java.util.concurrent.Executor); - method public abstract java.util.concurrent.CompletionStage thenCompose(java.util.function.Function>); - method public abstract java.util.concurrent.CompletionStage thenComposeAsync(java.util.function.Function>); - method public abstract java.util.concurrent.CompletionStage thenComposeAsync(java.util.function.Function>, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage thenAcceptBoth(java.util.concurrent.CompletionStage, java.util.function.BiConsumer); + method public abstract java.util.concurrent.CompletionStage thenAcceptBothAsync(java.util.concurrent.CompletionStage, java.util.function.BiConsumer); + method public abstract java.util.concurrent.CompletionStage thenAcceptBothAsync(java.util.concurrent.CompletionStage, java.util.function.BiConsumer, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage thenApply(java.util.function.Function); + method public abstract java.util.concurrent.CompletionStage thenApplyAsync(java.util.function.Function); + method public abstract java.util.concurrent.CompletionStage thenApplyAsync(java.util.function.Function, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage thenCombine(java.util.concurrent.CompletionStage, java.util.function.BiFunction); + method public abstract java.util.concurrent.CompletionStage thenCombineAsync(java.util.concurrent.CompletionStage, java.util.function.BiFunction); + method public abstract java.util.concurrent.CompletionStage thenCombineAsync(java.util.concurrent.CompletionStage, java.util.function.BiFunction, java.util.concurrent.Executor); + method public abstract java.util.concurrent.CompletionStage thenCompose(java.util.function.Function>); + method public abstract java.util.concurrent.CompletionStage thenComposeAsync(java.util.function.Function>); + method public abstract java.util.concurrent.CompletionStage thenComposeAsync(java.util.function.Function>, java.util.concurrent.Executor); method public abstract java.util.concurrent.CompletionStage thenRun(java.lang.Runnable); method public abstract java.util.concurrent.CompletionStage thenRunAsync(java.lang.Runnable); method public abstract java.util.concurrent.CompletionStage thenRunAsync(java.lang.Runnable, java.util.concurrent.Executor); @@ -59552,7 +59561,7 @@ package java.util.concurrent { method public abstract java.util.concurrent.CompletionStage whenCompleteAsync(java.util.function.BiConsumer, java.util.concurrent.Executor); } - public class ConcurrentHashMap extends java.util.AbstractMap implements java.util.concurrent.ConcurrentMap java.io.Serializable { + public class ConcurrentHashMap extends java.util.AbstractMap implements java.util.concurrent.ConcurrentMap java.io.Serializable { ctor public ConcurrentHashMap(); ctor public ConcurrentHashMap(int); ctor public ConcurrentHashMap(java.util.Map); @@ -59566,29 +59575,29 @@ package java.util.concurrent { method public java.util.Set> entrySet(); method public void forEach(java.util.function.BiConsumer); method public void forEach(long, java.util.function.BiConsumer); - method public void forEach(long, java.util.function.BiFunction, java.util.function.Consumer); + method public void forEach(long, java.util.function.BiFunction, java.util.function.Consumer); method public void forEachEntry(long, java.util.function.Consumer>); - method public void forEachEntry(long, java.util.function.Function, ? extends U>, java.util.function.Consumer); + method public void forEachEntry(long, java.util.function.Function, ? extends U>, java.util.function.Consumer); method public void forEachKey(long, java.util.function.Consumer); - method public void forEachKey(long, java.util.function.Function, java.util.function.Consumer); + method public void forEachKey(long, java.util.function.Function, java.util.function.Consumer); method public void forEachValue(long, java.util.function.Consumer); - method public void forEachValue(long, java.util.function.Function, java.util.function.Consumer); + method public void forEachValue(long, java.util.function.Function, java.util.function.Consumer); method public V getOrDefault(java.lang.Object, V); method public java.util.concurrent.ConcurrentHashMap.KeySetView keySet(V); method public java.util.Enumeration keys(); method public long mappingCount(); method public V merge(K, V, java.util.function.BiFunction); - method public static java.util.concurrent.ConcurrentHashMap.KeySetView newKeySet(); - method public static java.util.concurrent.ConcurrentHashMap.KeySetView newKeySet(int); + method public static java.util.concurrent.ConcurrentHashMap.KeySetView newKeySet(); + method public static java.util.concurrent.ConcurrentHashMap.KeySetView newKeySet(int); method public V putIfAbsent(K, V); - method public U reduce(long, java.util.function.BiFunction, java.util.function.BiFunction); + method public U reduce(long, java.util.function.BiFunction, java.util.function.BiFunction); method public java.util.Map.Entry reduceEntries(long, java.util.function.BiFunction, java.util.Map.Entry, ? extends java.util.Map.Entry>); - method public U reduceEntries(long, java.util.function.Function, ? extends U>, java.util.function.BiFunction); + method public U reduceEntries(long, java.util.function.Function, ? extends U>, java.util.function.BiFunction); method public double reduceEntriesToDouble(long, java.util.function.ToDoubleFunction>, double, java.util.function.DoubleBinaryOperator); method public int reduceEntriesToInt(long, java.util.function.ToIntFunction>, int, java.util.function.IntBinaryOperator); method public long reduceEntriesToLong(long, java.util.function.ToLongFunction>, long, java.util.function.LongBinaryOperator); method public K reduceKeys(long, java.util.function.BiFunction); - method public U reduceKeys(long, java.util.function.Function, java.util.function.BiFunction); + method public U reduceKeys(long, java.util.function.Function, java.util.function.BiFunction); method public double reduceKeysToDouble(long, java.util.function.ToDoubleFunction, double, java.util.function.DoubleBinaryOperator); method public int reduceKeysToInt(long, java.util.function.ToIntFunction, int, java.util.function.IntBinaryOperator); method public long reduceKeysToLong(long, java.util.function.ToLongFunction, long, java.util.function.LongBinaryOperator); @@ -59596,7 +59605,7 @@ package java.util.concurrent { method public int reduceToInt(long, java.util.function.ToIntBiFunction, int, java.util.function.IntBinaryOperator); method public long reduceToLong(long, java.util.function.ToLongBiFunction, long, java.util.function.LongBinaryOperator); method public V reduceValues(long, java.util.function.BiFunction); - method public U reduceValues(long, java.util.function.Function, java.util.function.BiFunction); + method public U reduceValues(long, java.util.function.Function, java.util.function.BiFunction); method public double reduceValuesToDouble(long, java.util.function.ToDoubleFunction, double, java.util.function.DoubleBinaryOperator); method public int reduceValuesToInt(long, java.util.function.ToIntFunction, int, java.util.function.IntBinaryOperator); method public long reduceValuesToLong(long, java.util.function.ToLongFunction, long, java.util.function.LongBinaryOperator); @@ -59604,13 +59613,13 @@ package java.util.concurrent { method public boolean replace(K, V, V); method public V replace(K, V); method public void replaceAll(java.util.function.BiFunction); - method public U search(long, java.util.function.BiFunction); - method public U searchEntries(long, java.util.function.Function, ? extends U>); - method public U searchKeys(long, java.util.function.Function); - method public U searchValues(long, java.util.function.Function); + method public U search(long, java.util.function.BiFunction); + method public U searchEntries(long, java.util.function.Function, ? extends U>); + method public U searchKeys(long, java.util.function.Function); + method public U searchValues(long, java.util.function.Function); } - static abstract class ConcurrentHashMap.CollectionView implements java.util.Collection java.io.Serializable { + static abstract class ConcurrentHashMap.CollectionView implements java.util.Collection java.io.Serializable { method public final void clear(); method public abstract boolean contains(java.lang.Object); method public final boolean containsAll(java.util.Collection); @@ -59622,11 +59631,11 @@ package java.util.concurrent { method public final boolean retainAll(java.util.Collection); method public final int size(); method public final java.lang.Object[] toArray(); - method public final T[] toArray(T[]); + method public final T[] toArray(T[]); method public final java.lang.String toString(); } - public static class ConcurrentHashMap.KeySetView extends java.util.concurrent.ConcurrentHashMap.CollectionView implements java.io.Serializable java.util.Set { + public static class ConcurrentHashMap.KeySetView extends java.util.concurrent.ConcurrentHashMap.CollectionView implements java.io.Serializable java.util.Set { method public boolean add(K); method public boolean addAll(java.util.Collection); method public boolean contains(java.lang.Object); @@ -59637,7 +59646,7 @@ package java.util.concurrent { method public java.util.Spliterator spliterator(); } - public class ConcurrentLinkedDeque extends java.util.AbstractCollection implements java.util.Deque java.io.Serializable { + public class ConcurrentLinkedDeque extends java.util.AbstractCollection implements java.util.Deque java.io.Serializable { ctor public ConcurrentLinkedDeque(); ctor public ConcurrentLinkedDeque(java.util.Collection); method public void addFirst(E); @@ -59667,7 +59676,7 @@ package java.util.concurrent { method public java.util.Spliterator spliterator(); } - public class ConcurrentLinkedQueue extends java.util.AbstractQueue implements java.util.Queue java.io.Serializable { + public class ConcurrentLinkedQueue extends java.util.AbstractQueue implements java.util.Queue java.io.Serializable { ctor public ConcurrentLinkedQueue(); ctor public ConcurrentLinkedQueue(java.util.Collection); method public java.util.Iterator iterator(); @@ -59678,14 +59687,14 @@ package java.util.concurrent { method public java.util.Spliterator spliterator(); } - public abstract interface ConcurrentMap implements java.util.Map { + public abstract interface ConcurrentMap implements java.util.Map { method public abstract V putIfAbsent(K, V); method public abstract boolean remove(java.lang.Object, java.lang.Object); method public abstract boolean replace(K, V, V); method public abstract V replace(K, V); } - public abstract interface ConcurrentNavigableMap implements java.util.concurrent.ConcurrentMap java.util.NavigableMap { + public abstract interface ConcurrentNavigableMap implements java.util.concurrent.ConcurrentMap java.util.NavigableMap { method public abstract java.util.NavigableSet descendingKeySet(); method public abstract java.util.concurrent.ConcurrentNavigableMap descendingMap(); method public abstract java.util.concurrent.ConcurrentNavigableMap headMap(K, boolean); @@ -59698,7 +59707,7 @@ package java.util.concurrent { method public abstract java.util.concurrent.ConcurrentNavigableMap tailMap(K); } - public class ConcurrentSkipListMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.concurrent.ConcurrentNavigableMap java.io.Serializable { + public class ConcurrentSkipListMap extends java.util.AbstractMap implements java.lang.Cloneable java.util.concurrent.ConcurrentNavigableMap java.io.Serializable { ctor public ConcurrentSkipListMap(); ctor public ConcurrentSkipListMap(java.util.Comparator); ctor public ConcurrentSkipListMap(java.util.Map); @@ -59742,7 +59751,7 @@ package java.util.concurrent { method public java.util.concurrent.ConcurrentNavigableMap tailMap(K); } - public class ConcurrentSkipListSet extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable { + public class ConcurrentSkipListSet extends java.util.AbstractSet implements java.lang.Cloneable java.util.NavigableSet java.io.Serializable { ctor public ConcurrentSkipListSet(); ctor public ConcurrentSkipListSet(java.util.Comparator); ctor public ConcurrentSkipListSet(java.util.Collection); @@ -59770,7 +59779,7 @@ package java.util.concurrent { method public java.util.NavigableSet tailSet(E); } - public class CopyOnWriteArrayList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { + public class CopyOnWriteArrayList implements java.lang.Cloneable java.util.List java.util.RandomAccess java.io.Serializable { ctor public CopyOnWriteArrayList(); ctor public CopyOnWriteArrayList(java.util.Collection); ctor public CopyOnWriteArrayList(E[]); @@ -59802,10 +59811,10 @@ package java.util.concurrent { method public int size(); method public java.util.List subList(int, int); method public java.lang.Object[] toArray(); - method public T[] toArray(T[]); + method public T[] toArray(T[]); } - public class CopyOnWriteArraySet extends java.util.AbstractSet implements java.io.Serializable { + public class CopyOnWriteArraySet extends java.util.AbstractSet implements java.io.Serializable { ctor public CopyOnWriteArraySet(); ctor public CopyOnWriteArraySet(java.util.Collection); method public void forEach(java.util.function.Consumer); @@ -59823,7 +59832,7 @@ package java.util.concurrent { method public long getCount(); } - public abstract class CountedCompleter extends java.util.concurrent.ForkJoinTask { + public abstract class CountedCompleter extends java.util.concurrent.ForkJoinTask { ctor protected CountedCompleter(java.util.concurrent.CountedCompleter, int); ctor protected CountedCompleter(java.util.concurrent.CountedCompleter); ctor protected CountedCompleter(); @@ -59860,7 +59869,7 @@ package java.util.concurrent { method public void reset(); } - public class DelayQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue { + public class DelayQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue { ctor public DelayQueue(); ctor public DelayQueue(java.util.Collection); method public int drainTo(java.util.Collection); @@ -59881,7 +59890,7 @@ package java.util.concurrent { method public abstract long getDelay(java.util.concurrent.TimeUnit); } - public class Exchanger { + public class Exchanger { ctor public Exchanger(); method public V exchange(V) throws java.lang.InterruptedException; method public V exchange(V, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException, java.util.concurrent.TimeoutException; @@ -59898,7 +59907,7 @@ package java.util.concurrent { method public abstract void execute(java.lang.Runnable); } - public class ExecutorCompletionService implements java.util.concurrent.CompletionService { + public class ExecutorCompletionService implements java.util.concurrent.CompletionService { ctor public ExecutorCompletionService(java.util.concurrent.Executor); ctor public ExecutorCompletionService(java.util.concurrent.Executor, java.util.concurrent.BlockingQueue>); method public java.util.concurrent.Future poll(); @@ -59910,21 +59919,21 @@ package java.util.concurrent { public abstract interface ExecutorService implements java.util.concurrent.Executor { method public abstract boolean awaitTermination(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; - method public abstract java.util.List> invokeAll(java.util.Collection>) throws java.lang.InterruptedException; - method public abstract java.util.List> invokeAll(java.util.Collection>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; - method public abstract T invokeAny(java.util.Collection>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; - method public abstract T invokeAny(java.util.Collection>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; + method public abstract java.util.List> invokeAll(java.util.Collection>) throws java.lang.InterruptedException; + method public abstract java.util.List> invokeAll(java.util.Collection>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; + method public abstract T invokeAny(java.util.Collection>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; + method public abstract T invokeAny(java.util.Collection>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; method public abstract boolean isShutdown(); method public abstract boolean isTerminated(); method public abstract void shutdown(); method public abstract java.util.List shutdownNow(); - method public abstract java.util.concurrent.Future submit(java.util.concurrent.Callable); - method public abstract java.util.concurrent.Future submit(java.lang.Runnable, T); + method public abstract java.util.concurrent.Future submit(java.util.concurrent.Callable); + method public abstract java.util.concurrent.Future submit(java.lang.Runnable, T); method public abstract java.util.concurrent.Future submit(java.lang.Runnable); } public class Executors { - method public static java.util.concurrent.Callable callable(java.lang.Runnable, T); + method public static java.util.concurrent.Callable callable(java.lang.Runnable, T); method public static java.util.concurrent.Callable callable(java.lang.Runnable); method public static java.util.concurrent.Callable callable(java.security.PrivilegedAction); method public static java.util.concurrent.Callable callable(java.security.PrivilegedExceptionAction); @@ -59941,8 +59950,8 @@ package java.util.concurrent { method public static java.util.concurrent.ScheduledExecutorService newSingleThreadScheduledExecutor(java.util.concurrent.ThreadFactory); method public static java.util.concurrent.ExecutorService newWorkStealingPool(int); method public static java.util.concurrent.ExecutorService newWorkStealingPool(); - method public static java.util.concurrent.Callable privilegedCallable(java.util.concurrent.Callable); - method public static java.util.concurrent.Callable privilegedCallableUsingCurrentClassLoader(java.util.concurrent.Callable); + method public static java.util.concurrent.Callable privilegedCallable(java.util.concurrent.Callable); + method public static java.util.concurrent.Callable privilegedCallableUsingCurrentClassLoader(java.util.concurrent.Callable); method public static java.util.concurrent.ThreadFactory privilegedThreadFactory(); method public static java.util.concurrent.ExecutorService unconfigurableExecutorService(java.util.concurrent.ExecutorService); method public static java.util.concurrent.ScheduledExecutorService unconfigurableScheduledExecutorService(java.util.concurrent.ScheduledExecutorService); @@ -59970,7 +59979,7 @@ package java.util.concurrent { method public long getStealCount(); method public java.lang.Thread.UncaughtExceptionHandler getUncaughtExceptionHandler(); method public boolean hasQueuedSubmissions(); - method public T invoke(java.util.concurrent.ForkJoinTask); + method public T invoke(java.util.concurrent.ForkJoinTask); method public boolean isQuiescent(); method public boolean isShutdown(); method public boolean isTerminated(); @@ -59979,7 +59988,7 @@ package java.util.concurrent { method protected java.util.concurrent.ForkJoinTask pollSubmission(); method public void shutdown(); method public java.util.List shutdownNow(); - method public java.util.concurrent.ForkJoinTask submit(java.util.concurrent.ForkJoinTask); + method public java.util.concurrent.ForkJoinTask submit(java.util.concurrent.ForkJoinTask); field public static final java.util.concurrent.ForkJoinPool.ForkJoinWorkerThreadFactory defaultForkJoinWorkerThreadFactory; } @@ -59992,11 +60001,11 @@ package java.util.concurrent { method public abstract boolean isReleasable(); } - public abstract class ForkJoinTask implements java.util.concurrent.Future java.io.Serializable { + public abstract class ForkJoinTask implements java.util.concurrent.Future java.io.Serializable { ctor public ForkJoinTask(); method public static java.util.concurrent.ForkJoinTask adapt(java.lang.Runnable); - method public static java.util.concurrent.ForkJoinTask adapt(java.lang.Runnable, T); - method public static java.util.concurrent.ForkJoinTask adapt(java.util.concurrent.Callable); + method public static java.util.concurrent.ForkJoinTask adapt(java.lang.Runnable, T); + method public static java.util.concurrent.ForkJoinTask adapt(java.util.concurrent.Callable); method public boolean cancel(boolean); method public final boolean compareAndSetForkJoinTaskTag(short, short); method public void complete(V); @@ -60016,7 +60025,7 @@ package java.util.concurrent { method public final V invoke(); method public static void invokeAll(java.util.concurrent.ForkJoinTask, java.util.concurrent.ForkJoinTask); method public static void invokeAll(java.util.concurrent.ForkJoinTask...); - method public static java.util.Collection invokeAll(java.util.Collection); + method public static > java.util.Collection invokeAll(java.util.Collection); method public final boolean isCancelled(); method public final boolean isCompletedAbnormally(); method public final boolean isCompletedNormally(); @@ -60042,7 +60051,7 @@ package java.util.concurrent { method protected void onTermination(java.lang.Throwable); } - public abstract interface Future { + public abstract interface Future { method public abstract boolean cancel(boolean); method public abstract V get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException; method public abstract V get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException; @@ -60050,7 +60059,7 @@ package java.util.concurrent { method public abstract boolean isDone(); } - public class FutureTask implements java.util.concurrent.RunnableFuture { + public class FutureTask implements java.util.concurrent.RunnableFuture { ctor public FutureTask(java.util.concurrent.Callable); ctor public FutureTask(java.lang.Runnable, V); method public boolean cancel(boolean); @@ -60065,7 +60074,7 @@ package java.util.concurrent { method protected void setException(java.lang.Throwable); } - public class LinkedBlockingDeque extends java.util.AbstractQueue implements java.util.concurrent.BlockingDeque java.io.Serializable { + public class LinkedBlockingDeque extends java.util.AbstractQueue implements java.util.concurrent.BlockingDeque java.io.Serializable { ctor public LinkedBlockingDeque(); ctor public LinkedBlockingDeque(int); ctor public LinkedBlockingDeque(java.util.Collection); @@ -60109,7 +60118,7 @@ package java.util.concurrent { method public E takeLast() throws java.lang.InterruptedException; } - public class LinkedBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { + public class LinkedBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { ctor public LinkedBlockingQueue(); ctor public LinkedBlockingQueue(int); ctor public LinkedBlockingQueue(java.util.Collection); @@ -60128,7 +60137,7 @@ package java.util.concurrent { method public E take() throws java.lang.InterruptedException; } - public class LinkedTransferQueue extends java.util.AbstractQueue implements java.io.Serializable java.util.concurrent.TransferQueue { + public class LinkedTransferQueue extends java.util.AbstractQueue implements java.io.Serializable java.util.concurrent.TransferQueue { ctor public LinkedTransferQueue(); ctor public LinkedTransferQueue(java.util.Collection); method public int drainTo(java.util.Collection); @@ -60175,7 +60184,7 @@ package java.util.concurrent { method public int register(); } - public class PriorityBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { + public class PriorityBlockingQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { ctor public PriorityBlockingQueue(); ctor public PriorityBlockingQueue(int); ctor public PriorityBlockingQueue(int, java.util.Comparator); @@ -60204,7 +60213,7 @@ package java.util.concurrent { method protected final void setRawResult(java.lang.Void); } - public abstract class RecursiveTask extends java.util.concurrent.ForkJoinTask { + public abstract class RecursiveTask extends java.util.concurrent.ForkJoinTask { ctor public RecursiveTask(); method protected abstract V compute(); method protected final boolean exec(); @@ -60223,22 +60232,22 @@ package java.util.concurrent { method public abstract void rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor); } - public abstract interface RunnableFuture implements java.util.concurrent.Future java.lang.Runnable { + public abstract interface RunnableFuture implements java.util.concurrent.Future java.lang.Runnable { method public abstract void run(); } - public abstract interface RunnableScheduledFuture implements java.util.concurrent.RunnableFuture java.util.concurrent.ScheduledFuture { + public abstract interface RunnableScheduledFuture implements java.util.concurrent.RunnableFuture java.util.concurrent.ScheduledFuture { method public abstract boolean isPeriodic(); } public abstract interface ScheduledExecutorService implements java.util.concurrent.ExecutorService { method public abstract java.util.concurrent.ScheduledFuture schedule(java.lang.Runnable, long, java.util.concurrent.TimeUnit); - method public abstract java.util.concurrent.ScheduledFuture schedule(java.util.concurrent.Callable, long, java.util.concurrent.TimeUnit); + method public abstract java.util.concurrent.ScheduledFuture schedule(java.util.concurrent.Callable, long, java.util.concurrent.TimeUnit); method public abstract java.util.concurrent.ScheduledFuture scheduleAtFixedRate(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit); method public abstract java.util.concurrent.ScheduledFuture scheduleWithFixedDelay(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit); } - public abstract interface ScheduledFuture implements java.util.concurrent.Delayed java.util.concurrent.Future { + public abstract interface ScheduledFuture implements java.util.concurrent.Delayed java.util.concurrent.Future { } public class ScheduledThreadPoolExecutor extends java.util.concurrent.ThreadPoolExecutor implements java.util.concurrent.ScheduledExecutorService { @@ -60246,13 +60255,13 @@ package java.util.concurrent { ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.ThreadFactory); ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.RejectedExecutionHandler); ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.ThreadFactory, java.util.concurrent.RejectedExecutionHandler); - method protected java.util.concurrent.RunnableScheduledFuture decorateTask(java.lang.Runnable, java.util.concurrent.RunnableScheduledFuture); - method protected java.util.concurrent.RunnableScheduledFuture decorateTask(java.util.concurrent.Callable, java.util.concurrent.RunnableScheduledFuture); + method protected java.util.concurrent.RunnableScheduledFuture decorateTask(java.lang.Runnable, java.util.concurrent.RunnableScheduledFuture); + method protected java.util.concurrent.RunnableScheduledFuture decorateTask(java.util.concurrent.Callable, java.util.concurrent.RunnableScheduledFuture); method public boolean getContinueExistingPeriodicTasksAfterShutdownPolicy(); method public boolean getExecuteExistingDelayedTasksAfterShutdownPolicy(); method public boolean getRemoveOnCancelPolicy(); method public java.util.concurrent.ScheduledFuture schedule(java.lang.Runnable, long, java.util.concurrent.TimeUnit); - method public java.util.concurrent.ScheduledFuture schedule(java.util.concurrent.Callable, long, java.util.concurrent.TimeUnit); + method public java.util.concurrent.ScheduledFuture schedule(java.util.concurrent.Callable, long, java.util.concurrent.TimeUnit); method public java.util.concurrent.ScheduledFuture scheduleAtFixedRate(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit); method public java.util.concurrent.ScheduledFuture scheduleWithFixedDelay(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit); method public void setContinueExistingPeriodicTasksAfterShutdownPolicy(boolean); @@ -60282,7 +60291,7 @@ package java.util.concurrent { method public boolean tryAcquire(int, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException; } - public class SynchronousQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { + public class SynchronousQueue extends java.util.AbstractQueue implements java.util.concurrent.BlockingQueue java.io.Serializable { ctor public SynchronousQueue(); ctor public SynchronousQueue(boolean); method public int drainTo(java.util.Collection); @@ -60400,7 +60409,7 @@ package java.util.concurrent { ctor public TimeoutException(java.lang.String); } - public abstract interface TransferQueue implements java.util.concurrent.BlockingQueue { + public abstract interface TransferQueue implements java.util.concurrent.BlockingQueue { method public abstract int getWaitingConsumerCount(); method public abstract boolean hasWaitingConsumer(); method public abstract void transfer(E) throws java.lang.InterruptedException; @@ -60470,7 +60479,7 @@ package java.util.concurrent.atomic { method public final boolean weakCompareAndSet(int, int, int); } - public abstract class AtomicIntegerFieldUpdater { + public abstract class AtomicIntegerFieldUpdater { ctor protected AtomicIntegerFieldUpdater(); method public final int accumulateAndGet(T, int, java.util.function.IntBinaryOperator); method public int addAndGet(T, int); @@ -60485,7 +60494,7 @@ package java.util.concurrent.atomic { method public final int getAndUpdate(T, java.util.function.IntUnaryOperator); method public int incrementAndGet(T); method public abstract void lazySet(T, int); - method public static java.util.concurrent.atomic.AtomicIntegerFieldUpdater newUpdater(java.lang.Class, java.lang.String); + method public static java.util.concurrent.atomic.AtomicIntegerFieldUpdater newUpdater(java.lang.Class, java.lang.String); method public abstract void set(T, int); method public final int updateAndGet(T, java.util.function.IntUnaryOperator); method public abstract boolean weakCompareAndSet(T, int, int); @@ -60538,7 +60547,7 @@ package java.util.concurrent.atomic { method public final boolean weakCompareAndSet(int, long, long); } - public abstract class AtomicLongFieldUpdater { + public abstract class AtomicLongFieldUpdater { ctor protected AtomicLongFieldUpdater(); method public final long accumulateAndGet(T, long, java.util.function.LongBinaryOperator); method public long addAndGet(T, long); @@ -60553,13 +60562,13 @@ package java.util.concurrent.atomic { method public final long getAndUpdate(T, java.util.function.LongUnaryOperator); method public long incrementAndGet(T); method public abstract void lazySet(T, long); - method public static java.util.concurrent.atomic.AtomicLongFieldUpdater newUpdater(java.lang.Class, java.lang.String); + method public static java.util.concurrent.atomic.AtomicLongFieldUpdater newUpdater(java.lang.Class, java.lang.String); method public abstract void set(T, long); method public final long updateAndGet(T, java.util.function.LongUnaryOperator); method public abstract boolean weakCompareAndSet(T, long, long); } - public class AtomicMarkableReference { + public class AtomicMarkableReference { ctor public AtomicMarkableReference(V, boolean); method public boolean attemptMark(V, boolean); method public boolean compareAndSet(V, V, boolean, boolean); @@ -60570,7 +60579,7 @@ package java.util.concurrent.atomic { method public boolean weakCompareAndSet(V, V, boolean, boolean); } - public class AtomicReference implements java.io.Serializable { + public class AtomicReference implements java.io.Serializable { ctor public AtomicReference(V); ctor public AtomicReference(); method public final V accumulateAndGet(V, java.util.function.BinaryOperator); @@ -60585,7 +60594,7 @@ package java.util.concurrent.atomic { method public final boolean weakCompareAndSet(V, V); } - public class AtomicReferenceArray implements java.io.Serializable { + public class AtomicReferenceArray implements java.io.Serializable { ctor public AtomicReferenceArray(int); ctor public AtomicReferenceArray(E[]); method public final E accumulateAndGet(int, E, java.util.function.BinaryOperator); @@ -60601,7 +60610,7 @@ package java.util.concurrent.atomic { method public final boolean weakCompareAndSet(int, E, E); } - public abstract class AtomicReferenceFieldUpdater { + public abstract class AtomicReferenceFieldUpdater { ctor protected AtomicReferenceFieldUpdater(); method public final V accumulateAndGet(T, V, java.util.function.BinaryOperator); method public abstract boolean compareAndSet(T, V, V); @@ -60610,13 +60619,13 @@ package java.util.concurrent.atomic { method public V getAndSet(T, V); method public final V getAndUpdate(T, java.util.function.UnaryOperator); method public abstract void lazySet(T, V); - method public static java.util.concurrent.atomic.AtomicReferenceFieldUpdater newUpdater(java.lang.Class, java.lang.Class, java.lang.String); + method public static java.util.concurrent.atomic.AtomicReferenceFieldUpdater newUpdater(java.lang.Class, java.lang.Class, java.lang.String); method public abstract void set(T, V); method public final V updateAndGet(T, java.util.function.UnaryOperator); method public abstract boolean weakCompareAndSet(T, V, V); } - public class AtomicStampedReference { + public class AtomicStampedReference { ctor public AtomicStampedReference(V, int); method public boolean attemptStamp(V, int); method public boolean compareAndSet(V, V, int, int); @@ -60919,33 +60928,33 @@ package java.util.concurrent.locks { package java.util.function { - public abstract interface BiConsumer { + public abstract interface BiConsumer { method public abstract void accept(T, U); method public default java.util.function.BiConsumer andThen(java.util.function.BiConsumer); } - public abstract interface BiFunction { - method public default java.util.function.BiFunction andThen(java.util.function.Function); + public abstract interface BiFunction { + method public default java.util.function.BiFunction andThen(java.util.function.Function); method public abstract R apply(T, U); } - public abstract interface BiPredicate { + public abstract interface BiPredicate { method public default java.util.function.BiPredicate and(java.util.function.BiPredicate); method public default java.util.function.BiPredicate negate(); method public default java.util.function.BiPredicate or(java.util.function.BiPredicate); method public abstract boolean test(T, U); } - public abstract interface BinaryOperator implements java.util.function.BiFunction { - method public static java.util.function.BinaryOperator maxBy(java.util.Comparator); - method public static java.util.function.BinaryOperator minBy(java.util.Comparator); + public abstract interface BinaryOperator implements java.util.function.BiFunction { + method public static java.util.function.BinaryOperator maxBy(java.util.Comparator); + method public static java.util.function.BinaryOperator minBy(java.util.Comparator); } public abstract interface BooleanSupplier { method public abstract boolean getAsBoolean(); } - public abstract interface Consumer { + public abstract interface Consumer { method public abstract void accept(T); method public default java.util.function.Consumer andThen(java.util.function.Consumer); } @@ -60959,7 +60968,7 @@ package java.util.function { method public default java.util.function.DoubleConsumer andThen(java.util.function.DoubleConsumer); } - public abstract interface DoubleFunction { + public abstract interface DoubleFunction { method public abstract R apply(double); } @@ -60989,11 +60998,11 @@ package java.util.function { method public static java.util.function.DoubleUnaryOperator identity(); } - public abstract interface Function { - method public default java.util.function.Function andThen(java.util.function.Function); + public abstract interface Function { + method public default java.util.function.Function andThen(java.util.function.Function); method public abstract R apply(T); - method public default java.util.function.Function compose(java.util.function.Function); - method public static java.util.function.Function identity(); + method public default java.util.function.Function compose(java.util.function.Function); + method public static java.util.function.Function identity(); } public abstract interface IntBinaryOperator { @@ -61005,7 +61014,7 @@ package java.util.function { method public default java.util.function.IntConsumer andThen(java.util.function.IntConsumer); } - public abstract interface IntFunction { + public abstract interface IntFunction { method public abstract R apply(int); } @@ -61044,7 +61053,7 @@ package java.util.function { method public default java.util.function.LongConsumer andThen(java.util.function.LongConsumer); } - public abstract interface LongFunction { + public abstract interface LongFunction { method public abstract R apply(long); } @@ -61074,56 +61083,56 @@ package java.util.function { method public static java.util.function.LongUnaryOperator identity(); } - public abstract interface ObjDoubleConsumer { + public abstract interface ObjDoubleConsumer { method public abstract void accept(T, double); } - public abstract interface ObjIntConsumer { + public abstract interface ObjIntConsumer { method public abstract void accept(T, int); } - public abstract interface ObjLongConsumer { + public abstract interface ObjLongConsumer { method public abstract void accept(T, long); } - public abstract interface Predicate { + public abstract interface Predicate { method public default java.util.function.Predicate and(java.util.function.Predicate); - method public static java.util.function.Predicate isEqual(java.lang.Object); + method public static java.util.function.Predicate isEqual(java.lang.Object); method public default java.util.function.Predicate negate(); method public default java.util.function.Predicate or(java.util.function.Predicate); method public abstract boolean test(T); } - public abstract interface Supplier { + public abstract interface Supplier { method public abstract T get(); } - public abstract interface ToDoubleBiFunction { + public abstract interface ToDoubleBiFunction { method public abstract double applyAsDouble(T, U); } - public abstract interface ToDoubleFunction { + public abstract interface ToDoubleFunction { method public abstract double applyAsDouble(T); } - public abstract interface ToIntBiFunction { + public abstract interface ToIntBiFunction { method public abstract int applyAsInt(T, U); } - public abstract interface ToIntFunction { + public abstract interface ToIntFunction { method public abstract int applyAsInt(T); } - public abstract interface ToLongBiFunction { + public abstract interface ToLongBiFunction { method public abstract long applyAsLong(T, U); } - public abstract interface ToLongFunction { + public abstract interface ToLongFunction { method public abstract long applyAsLong(T); } - public abstract interface UnaryOperator implements java.util.function.Function { - method public static java.util.function.UnaryOperator identity(); + public abstract interface UnaryOperator implements java.util.function.Function { + method public static java.util.function.UnaryOperator identity(); } } @@ -61711,7 +61720,7 @@ package java.util.regex { package java.util.stream { - public abstract interface BaseStream implements java.lang.AutoCloseable { + public abstract interface BaseStream> implements java.lang.AutoCloseable { method public abstract void close(); method public abstract boolean isParallel(); method public abstract java.util.Iterator iterator(); @@ -61722,13 +61731,13 @@ package java.util.stream { method public abstract S unordered(); } - public abstract interface Collector { + public abstract interface Collector { method public abstract java.util.function.BiConsumer accumulator(); method public abstract java.util.Set characteristics(); method public abstract java.util.function.BinaryOperator combiner(); method public abstract java.util.function.Function finisher(); - method public static java.util.stream.Collector of(java.util.function.Supplier, java.util.function.BiConsumer, java.util.function.BinaryOperator, java.util.stream.Collector.Characteristics...); - method public static java.util.stream.Collector of(java.util.function.Supplier, java.util.function.BiConsumer, java.util.function.BinaryOperator, java.util.function.Function, java.util.stream.Collector.Characteristics...); + method public static java.util.stream.Collector of(java.util.function.Supplier, java.util.function.BiConsumer, java.util.function.BinaryOperator, java.util.stream.Collector.Characteristics...); + method public static java.util.stream.Collector of(java.util.function.Supplier, java.util.function.BiConsumer, java.util.function.BinaryOperator, java.util.function.Function, java.util.stream.Collector.Characteristics...); method public abstract java.util.function.Supplier supplier(); } @@ -61741,43 +61750,43 @@ package java.util.stream { } public final class Collectors { - method public static java.util.stream.Collector averagingDouble(java.util.function.ToDoubleFunction); - method public static java.util.stream.Collector averagingInt(java.util.function.ToIntFunction); - method public static java.util.stream.Collector averagingLong(java.util.function.ToLongFunction); - method public static java.util.stream.Collector collectingAndThen(java.util.stream.Collector, java.util.function.Function); - method public static java.util.stream.Collector counting(); - method public static java.util.stream.Collector>> groupingBy(java.util.function.Function); - method public static java.util.stream.Collector> groupingBy(java.util.function.Function, java.util.stream.Collector); - method public static java.util.stream.Collector groupingBy(java.util.function.Function, java.util.function.Supplier, java.util.stream.Collector); - method public static java.util.stream.Collector>> groupingByConcurrent(java.util.function.Function); - method public static java.util.stream.Collector> groupingByConcurrent(java.util.function.Function, java.util.stream.Collector); - method public static java.util.stream.Collector groupingByConcurrent(java.util.function.Function, java.util.function.Supplier, java.util.stream.Collector); + method public static java.util.stream.Collector averagingDouble(java.util.function.ToDoubleFunction); + method public static java.util.stream.Collector averagingInt(java.util.function.ToIntFunction); + method public static java.util.stream.Collector averagingLong(java.util.function.ToLongFunction); + method public static java.util.stream.Collector collectingAndThen(java.util.stream.Collector, java.util.function.Function); + method public static java.util.stream.Collector counting(); + method public static java.util.stream.Collector>> groupingBy(java.util.function.Function); + method public static java.util.stream.Collector> groupingBy(java.util.function.Function, java.util.stream.Collector); + method public static > java.util.stream.Collector groupingBy(java.util.function.Function, java.util.function.Supplier, java.util.stream.Collector); + method public static java.util.stream.Collector>> groupingByConcurrent(java.util.function.Function); + method public static java.util.stream.Collector> groupingByConcurrent(java.util.function.Function, java.util.stream.Collector); + method public static > java.util.stream.Collector groupingByConcurrent(java.util.function.Function, java.util.function.Supplier, java.util.stream.Collector); method public static java.util.stream.Collector joining(); method public static java.util.stream.Collector joining(java.lang.CharSequence); method public static java.util.stream.Collector joining(java.lang.CharSequence, java.lang.CharSequence, java.lang.CharSequence); - method public static java.util.stream.Collector mapping(java.util.function.Function, java.util.stream.Collector); - method public static java.util.stream.Collector> maxBy(java.util.Comparator); - method public static java.util.stream.Collector> minBy(java.util.Comparator); - method public static java.util.stream.Collector>> partitioningBy(java.util.function.Predicate); - method public static java.util.stream.Collector> partitioningBy(java.util.function.Predicate, java.util.stream.Collector); - method public static java.util.stream.Collector reducing(T, java.util.function.BinaryOperator); - method public static java.util.stream.Collector> reducing(java.util.function.BinaryOperator); - method public static java.util.stream.Collector reducing(U, java.util.function.Function, java.util.function.BinaryOperator); - method public static java.util.stream.Collector summarizingDouble(java.util.function.ToDoubleFunction); - method public static java.util.stream.Collector summarizingInt(java.util.function.ToIntFunction); - method public static java.util.stream.Collector summarizingLong(java.util.function.ToLongFunction); - method public static java.util.stream.Collector summingDouble(java.util.function.ToDoubleFunction); - method public static java.util.stream.Collector summingInt(java.util.function.ToIntFunction); - method public static java.util.stream.Collector summingLong(java.util.function.ToLongFunction); - method public static java.util.stream.Collector toCollection(java.util.function.Supplier); - method public static java.util.stream.Collector> toConcurrentMap(java.util.function.Function, java.util.function.Function); - method public static java.util.stream.Collector> toConcurrentMap(java.util.function.Function, java.util.function.Function, java.util.function.BinaryOperator); - method public static java.util.stream.Collector toConcurrentMap(java.util.function.Function, java.util.function.Function, java.util.function.BinaryOperator, java.util.function.Supplier); - method public static java.util.stream.Collector> toList(); - method public static java.util.stream.Collector> toMap(java.util.function.Function, java.util.function.Function); - method public static java.util.stream.Collector> toMap(java.util.function.Function, java.util.function.Function, java.util.function.BinaryOperator); - method public static java.util.stream.Collector toMap(java.util.function.Function, java.util.function.Function, java.util.function.BinaryOperator, java.util.function.Supplier); - method public static java.util.stream.Collector> toSet(); + method public static java.util.stream.Collector mapping(java.util.function.Function, java.util.stream.Collector); + method public static java.util.stream.Collector> maxBy(java.util.Comparator); + method public static java.util.stream.Collector> minBy(java.util.Comparator); + method public static java.util.stream.Collector>> partitioningBy(java.util.function.Predicate); + method public static java.util.stream.Collector> partitioningBy(java.util.function.Predicate, java.util.stream.Collector); + method public static java.util.stream.Collector reducing(T, java.util.function.BinaryOperator); + method public static java.util.stream.Collector> reducing(java.util.function.BinaryOperator); + method public static java.util.stream.Collector reducing(U, java.util.function.Function, java.util.function.BinaryOperator); + method public static java.util.stream.Collector summarizingDouble(java.util.function.ToDoubleFunction); + method public static java.util.stream.Collector summarizingInt(java.util.function.ToIntFunction); + method public static java.util.stream.Collector summarizingLong(java.util.function.ToLongFunction); + method public static java.util.stream.Collector summingDouble(java.util.function.ToDoubleFunction); + method public static java.util.stream.Collector summingInt(java.util.function.ToIntFunction); + method public static java.util.stream.Collector summingLong(java.util.function.ToLongFunction); + method public static > java.util.stream.Collector toCollection(java.util.function.Supplier); + method public static java.util.stream.Collector> toConcurrentMap(java.util.function.Function, java.util.function.Function); + method public static java.util.stream.Collector> toConcurrentMap(java.util.function.Function, java.util.function.Function, java.util.function.BinaryOperator); + method public static > java.util.stream.Collector toConcurrentMap(java.util.function.Function, java.util.function.Function, java.util.function.BinaryOperator, java.util.function.Supplier); + method public static java.util.stream.Collector> toList(); + method public static java.util.stream.Collector> toMap(java.util.function.Function, java.util.function.Function); + method public static java.util.stream.Collector> toMap(java.util.function.Function, java.util.function.Function, java.util.function.BinaryOperator); + method public static > java.util.stream.Collector toMap(java.util.function.Function, java.util.function.Function, java.util.function.BinaryOperator, java.util.function.Supplier); + method public static java.util.stream.Collector> toSet(); } public abstract interface DoubleStream implements java.util.stream.BaseStream { @@ -61786,7 +61795,7 @@ package java.util.stream { method public abstract java.util.OptionalDouble average(); method public abstract java.util.stream.Stream boxed(); method public static java.util.stream.DoubleStream.Builder builder(); - method public abstract R collect(java.util.function.Supplier, java.util.function.ObjDoubleConsumer, java.util.function.BiConsumer); + method public abstract R collect(java.util.function.Supplier, java.util.function.ObjDoubleConsumer, java.util.function.BiConsumer); method public static java.util.stream.DoubleStream concat(java.util.stream.DoubleStream, java.util.stream.DoubleStream); method public abstract long count(); method public abstract java.util.stream.DoubleStream distinct(); @@ -61804,7 +61813,7 @@ package java.util.stream { method public abstract java.util.stream.DoubleStream map(java.util.function.DoubleUnaryOperator); method public abstract java.util.stream.IntStream mapToInt(java.util.function.DoubleToIntFunction); method public abstract java.util.stream.LongStream mapToLong(java.util.function.DoubleToLongFunction); - method public abstract java.util.stream.Stream mapToObj(java.util.function.DoubleFunction); + method public abstract java.util.stream.Stream mapToObj(java.util.function.DoubleFunction); method public abstract java.util.OptionalDouble max(); method public abstract java.util.OptionalDouble min(); method public abstract boolean noneMatch(java.util.function.DoublePredicate); @@ -61837,7 +61846,7 @@ package java.util.stream { method public abstract java.util.OptionalDouble average(); method public abstract java.util.stream.Stream boxed(); method public static java.util.stream.IntStream.Builder builder(); - method public abstract R collect(java.util.function.Supplier, java.util.function.ObjIntConsumer, java.util.function.BiConsumer); + method public abstract R collect(java.util.function.Supplier, java.util.function.ObjIntConsumer, java.util.function.BiConsumer); method public static java.util.stream.IntStream concat(java.util.stream.IntStream, java.util.stream.IntStream); method public abstract long count(); method public abstract java.util.stream.IntStream distinct(); @@ -61855,7 +61864,7 @@ package java.util.stream { method public abstract java.util.stream.IntStream map(java.util.function.IntUnaryOperator); method public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.IntToDoubleFunction); method public abstract java.util.stream.LongStream mapToLong(java.util.function.IntToLongFunction); - method public abstract java.util.stream.Stream mapToObj(java.util.function.IntFunction); + method public abstract java.util.stream.Stream mapToObj(java.util.function.IntFunction); method public abstract java.util.OptionalInt max(); method public abstract java.util.OptionalInt min(); method public abstract boolean noneMatch(java.util.function.IntPredicate); @@ -61889,7 +61898,7 @@ package java.util.stream { method public abstract java.util.OptionalDouble average(); method public abstract java.util.stream.Stream boxed(); method public static java.util.stream.LongStream.Builder builder(); - method public abstract R collect(java.util.function.Supplier, java.util.function.ObjLongConsumer, java.util.function.BiConsumer); + method public abstract R collect(java.util.function.Supplier, java.util.function.ObjLongConsumer, java.util.function.BiConsumer); method public static java.util.stream.LongStream concat(java.util.stream.LongStream, java.util.stream.LongStream); method public abstract long count(); method public abstract java.util.stream.LongStream distinct(); @@ -61907,7 +61916,7 @@ package java.util.stream { method public abstract java.util.stream.LongStream map(java.util.function.LongUnaryOperator); method public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.LongToDoubleFunction); method public abstract java.util.stream.IntStream mapToInt(java.util.function.LongToIntFunction); - method public abstract java.util.stream.Stream mapToObj(java.util.function.LongFunction); + method public abstract java.util.stream.Stream mapToObj(java.util.function.LongFunction); method public abstract java.util.OptionalLong max(); method public abstract java.util.OptionalLong min(); method public abstract boolean noneMatch(java.util.function.LongPredicate); @@ -61934,49 +61943,49 @@ package java.util.stream { method public abstract java.util.stream.LongStream build(); } - public abstract interface Stream implements java.util.stream.BaseStream { + public abstract interface Stream implements java.util.stream.BaseStream { method public abstract boolean allMatch(java.util.function.Predicate); method public abstract boolean anyMatch(java.util.function.Predicate); - method public static java.util.stream.Stream.Builder builder(); - method public abstract R collect(java.util.function.Supplier, java.util.function.BiConsumer, java.util.function.BiConsumer); - method public abstract R collect(java.util.stream.Collector); - method public static java.util.stream.Stream concat(java.util.stream.Stream, java.util.stream.Stream); + method public static java.util.stream.Stream.Builder builder(); + method public abstract R collect(java.util.function.Supplier, java.util.function.BiConsumer, java.util.function.BiConsumer); + method public abstract R collect(java.util.stream.Collector); + method public static java.util.stream.Stream concat(java.util.stream.Stream, java.util.stream.Stream); method public abstract long count(); method public abstract java.util.stream.Stream distinct(); - method public static java.util.stream.Stream empty(); + method public static java.util.stream.Stream empty(); method public abstract java.util.stream.Stream filter(java.util.function.Predicate); method public abstract java.util.Optional findAny(); method public abstract java.util.Optional findFirst(); - method public abstract java.util.stream.Stream flatMap(java.util.function.Function>); + method public abstract java.util.stream.Stream flatMap(java.util.function.Function>); method public abstract java.util.stream.DoubleStream flatMapToDouble(java.util.function.Function); method public abstract java.util.stream.IntStream flatMapToInt(java.util.function.Function); method public abstract java.util.stream.LongStream flatMapToLong(java.util.function.Function); method public abstract void forEach(java.util.function.Consumer); method public abstract void forEachOrdered(java.util.function.Consumer); - method public static java.util.stream.Stream generate(java.util.function.Supplier); - method public static java.util.stream.Stream iterate(T, java.util.function.UnaryOperator); + method public static java.util.stream.Stream generate(java.util.function.Supplier); + method public static java.util.stream.Stream iterate(T, java.util.function.UnaryOperator); method public abstract java.util.stream.Stream limit(long); - method public abstract java.util.stream.Stream map(java.util.function.Function); + method public abstract java.util.stream.Stream map(java.util.function.Function); method public abstract java.util.stream.DoubleStream mapToDouble(java.util.function.ToDoubleFunction); method public abstract java.util.stream.IntStream mapToInt(java.util.function.ToIntFunction); method public abstract java.util.stream.LongStream mapToLong(java.util.function.ToLongFunction); method public abstract java.util.Optional max(java.util.Comparator); method public abstract java.util.Optional min(java.util.Comparator); method public abstract boolean noneMatch(java.util.function.Predicate); - method public static java.util.stream.Stream of(T); - method public static java.util.stream.Stream of(T...); + method public static java.util.stream.Stream of(T); + method public static java.util.stream.Stream of(T...); method public abstract java.util.stream.Stream peek(java.util.function.Consumer); method public abstract T reduce(T, java.util.function.BinaryOperator); method public abstract java.util.Optional reduce(java.util.function.BinaryOperator); - method public abstract U reduce(U, java.util.function.BiFunction, java.util.function.BinaryOperator); + method public abstract U reduce(U, java.util.function.BiFunction, java.util.function.BinaryOperator); method public abstract java.util.stream.Stream skip(long); method public abstract java.util.stream.Stream sorted(); method public abstract java.util.stream.Stream sorted(java.util.Comparator); method public abstract java.lang.Object[] toArray(); - method public abstract A[] toArray(java.util.function.IntFunction); + method public abstract A[] toArray(java.util.function.IntFunction); } - public static abstract interface Stream.Builder implements java.util.function.Consumer { + public static abstract interface Stream.Builder implements java.util.function.Consumer { method public abstract void accept(T); method public default java.util.stream.Stream.Builder add(T); method public abstract java.util.stream.Stream build(); @@ -61989,8 +61998,8 @@ package java.util.stream { method public static java.util.stream.IntStream intStream(java.util.function.Supplier, int, boolean); method public static java.util.stream.LongStream longStream(java.util.Spliterator.OfLong, boolean); method public static java.util.stream.LongStream longStream(java.util.function.Supplier, int, boolean); - method public static java.util.stream.Stream stream(java.util.Spliterator, boolean); - method public static java.util.stream.Stream stream(java.util.function.Supplier>, int, boolean); + method public static java.util.stream.Stream stream(java.util.Spliterator, boolean); + method public static java.util.stream.Stream stream(java.util.function.Supplier>, int, boolean); } } @@ -64161,16 +64170,16 @@ package javax.security.auth { public final class Subject implements java.io.Serializable { ctor public Subject(); ctor public Subject(boolean, java.util.Set, java.util.Set, java.util.Set); - method public static T doAs(javax.security.auth.Subject, java.security.PrivilegedAction); - method public static T doAs(javax.security.auth.Subject, java.security.PrivilegedExceptionAction) throws java.security.PrivilegedActionException; - method public static T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedAction, java.security.AccessControlContext); - method public static T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedExceptionAction, java.security.AccessControlContext) throws java.security.PrivilegedActionException; + method public static T doAs(javax.security.auth.Subject, java.security.PrivilegedAction); + method public static T doAs(javax.security.auth.Subject, java.security.PrivilegedExceptionAction) throws java.security.PrivilegedActionException; + method public static T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedAction, java.security.AccessControlContext); + method public static T doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedExceptionAction, java.security.AccessControlContext) throws java.security.PrivilegedActionException; method public java.util.Set getPrincipals(); - method public java.util.Set getPrincipals(java.lang.Class); + method public java.util.Set getPrincipals(java.lang.Class); method public java.util.Set getPrivateCredentials(); - method public java.util.Set getPrivateCredentials(java.lang.Class); + method public java.util.Set getPrivateCredentials(java.lang.Class); method public java.util.Set getPublicCredentials(); - method public java.util.Set getPublicCredentials(java.lang.Class); + method public java.util.Set getPublicCredentials(java.lang.Class); method public static javax.security.auth.Subject getSubject(java.security.AccessControlContext); method public boolean isReadOnly(); method public void setReadOnly(); diff --git a/cmds/bootanimation/audioplay.cpp b/cmds/bootanimation/audioplay.cpp index 4983b9ac4236e65f28d00c41e18395ddfa41b544..c546072e733a17618ecaed19e6e5bca563ae65bc 100644 --- a/cmds/bootanimation/audioplay.cpp +++ b/cmds/bootanimation/audioplay.cpp @@ -141,13 +141,27 @@ bool createBufferQueueAudioPlayer(const ChunkFormat* chunkFormat) { // configure audio source SLDataLocator_AndroidSimpleBufferQueue loc_bufq = {SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 1}; + // Determine channelMask from num_channels + SLuint32 channelMask; + switch (chunkFormat->num_channels) { + case 1: + channelMask = SL_SPEAKER_FRONT_CENTER; + break; + case 2: + channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT; + break; + default: + // Default of 0 will derive mask from num_channels and log a warning. + channelMask = 0; + } + SLDataFormat_PCM format_pcm = { SL_DATAFORMAT_PCM, chunkFormat->num_channels, chunkFormat->sample_rate * 1000, // convert to milliHz chunkFormat->bits_per_sample, 16, - SL_SPEAKER_FRONT_CENTER, + channelMask, SL_BYTEORDER_LITTLEENDIAN }; SLDataSource audioSrc = {&loc_bufq, &format_pcm}; diff --git a/cmds/idmap/scan.cpp b/cmds/idmap/scan.cpp index d94086be09de7e0f818b2dc91b3b8d8afa965042..e59a5007c6c446e6a2ebaae45c1d530e9f6adb20 100644 --- a/cmds/idmap/scan.cpp +++ b/cmds/idmap/scan.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include "idmap.h" @@ -35,16 +36,31 @@ namespace { bool writePackagesList(const char *filename, const SortedVector& overlayVector) { - FILE* fout = fopen(filename, "w"); + // the file is opened for appending so that it doesn't get truncated + // before we can guarantee mutual exclusion via the flock + FILE* fout = fopen(filename, "a"); if (fout == NULL) { return false; } + if (TEMP_FAILURE_RETRY(flock(fileno(fout), LOCK_EX)) != 0) { + fclose(fout); + return false; + } + + if (TEMP_FAILURE_RETRY(ftruncate(fileno(fout), 0)) != 0) { + TEMP_FAILURE_RETRY(flock(fileno(fout), LOCK_UN)); + fclose(fout); + return false; + } + for (size_t i = 0; i < overlayVector.size(); ++i) { const Overlay& overlay = overlayVector[i]; fprintf(fout, "%s %s\n", overlay.apk_path.string(), overlay.idmap_path.string()); } + TEMP_FAILURE_RETRY(fflush(fout)); + TEMP_FAILURE_RETRY(flock(fileno(fout), LOCK_UN)); fclose(fout); // Make file world readable since Zygote (running as root) will read diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java index 32a8088e9c4e618d3a313633e5fee3db1b855b92..1b4eda804312a20d8e5277f040c31d633cca5536 100644 --- a/cmds/pm/src/com/android/commands/pm/Pm.java +++ b/cmds/pm/src/com/android/commands/pm/Pm.java @@ -41,6 +41,10 @@ import android.content.pm.PackageInstaller; import android.content.pm.PackageInstaller.SessionInfo; import android.content.pm.PackageInstaller.SessionParams; import android.content.pm.PackageManager; +import android.content.pm.PackageParser; +import android.content.pm.PackageParser.ApkLite; +import android.content.pm.PackageParser.PackageLite; +import android.content.pm.PackageParser.PackageParserException; import android.content.pm.UserInfo; import android.net.Uri; import android.os.Binder; @@ -362,11 +366,33 @@ public final class Pm { */ private int runInstall() throws RemoteException { final InstallParams params = makeInstallParams(); + final String inPath = nextArg(); + boolean installExternal = + (params.sessionParams.installFlags & PackageManager.INSTALL_EXTERNAL) != 0; + if (params.sessionParams.sizeBytes < 0 && inPath != null) { + File file = new File(inPath); + if (file.isFile()) { + if (installExternal) { + try { + ApkLite baseApk = PackageParser.parseApkLite(file, 0); + PackageLite pkgLite = new PackageLite(null, baseApk, null, null, null); + params.sessionParams.setSize( + PackageHelper.calculateInstalledSize(pkgLite, false, + params.sessionParams.abiOverride)); + } catch (PackageParserException | IOException e) { + System.err.println("Error: Failed to parse APK file : " + e); + return 1; + } + } else { + params.sessionParams.setSize(file.length()); + } + } + } + final int sessionId = doCreateSession(params.sessionParams, params.installerPackageName, params.userId); try { - final String inPath = nextArg(); if (inPath == null && params.sessionParams.sizeBytes == 0) { System.err.println("Error: must either specify a package size or an APK file"); return 1; diff --git a/cmds/wm/src/com/android/commands/wm/Wm.java b/cmds/wm/src/com/android/commands/wm/Wm.java index f7f7c887aeb06d1d89aa401390667f9d8af5f1e8..383cd01ddcd6cca8e2007fb5463cb96166ddf8bb 100644 --- a/cmds/wm/src/com/android/commands/wm/Wm.java +++ b/cmds/wm/src/com/android/commands/wm/Wm.java @@ -23,6 +23,7 @@ import android.graphics.Point; import android.graphics.Rect; import android.os.RemoteException; import android.os.ServiceManager; +import android.os.UserHandle; import android.util.AndroidException; import android.util.DisplayMetrics; import android.view.Display; @@ -201,9 +202,11 @@ public class Wm extends BaseCommand { try { if (density > 0) { // TODO(multidisplay): For now Configuration only applies to main screen. - mWm.setForcedDisplayDensity(Display.DEFAULT_DISPLAY, density); + mWm.setForcedDisplayDensityForUser(Display.DEFAULT_DISPLAY, density, + UserHandle.USER_CURRENT); } else { - mWm.clearForcedDisplayDensity(Display.DEFAULT_DISPLAY); + mWm.clearForcedDisplayDensityForUser(Display.DEFAULT_DISPLAY, + UserHandle.USER_CURRENT); } } catch (RemoteException e) { } diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java index c4eaccc1b4067f86ebbb6ea9ab0f445300a63af3..163e7d2661b91bca0185eef7ea81d75acc228158 100644 --- a/core/java/android/accessibilityservice/AccessibilityService.java +++ b/core/java/android/accessibilityservice/AccessibilityService.java @@ -53,7 +53,7 @@ import java.lang.annotation.RetentionPolicy; import java.util.List; /** - * Accessibility services are intended to assist users with disabilities in using + * Accessibility services should only be used to assist users with disabilities in using * Android devices and apps. They run in the background and receive callbacks by the system * when {@link AccessibilityEvent}s are fired. Such events denote some state transition * in the user interface, for example, the focus has changed, a button has been clicked, diff --git a/core/java/android/accounts/Account.java b/core/java/android/accounts/Account.java index 7b83a3076db336d53bb8d3eef65eb799ed96ff39..b6e85f18a69525e6d35ee20d70d0ae6ae11c9015 100644 --- a/core/java/android/accounts/Account.java +++ b/core/java/android/accounts/Account.java @@ -16,9 +16,19 @@ package android.accounts; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.content.Context; import android.os.Parcelable; import android.os.Parcel; +import android.os.RemoteException; +import android.os.ServiceManager; import android.text.TextUtils; +import android.util.ArraySet; +import android.util.Log; +import com.android.internal.annotations.GuardedBy; + +import java.util.Set; /** * Value type that represents an Account in the {@link AccountManager}. This object is @@ -26,8 +36,14 @@ import android.text.TextUtils; * suitable for use as the key of a {@link java.util.Map} */ public class Account implements Parcelable { + private static final String TAG = "Account"; + + @GuardedBy("sAccessedAccounts") + private static final Set sAccessedAccounts = new ArraySet<>(); + public final String name; public final String type; + private final @Nullable String accessId; public boolean equals(Object o) { if (o == this) return true; @@ -44,6 +60,20 @@ public class Account implements Parcelable { } public Account(String name, String type) { + this(name, type, null); + } + + /** + * @hide + */ + public Account(@NonNull Account other, @NonNull String accessId) { + this(other.name, other.type, accessId); + } + + /** + * @hide + */ + public Account(String name, String type, String accessId) { if (TextUtils.isEmpty(name)) { throw new IllegalArgumentException("the name must not be empty: " + name); } @@ -52,11 +82,31 @@ public class Account implements Parcelable { } this.name = name; this.type = type; + this.accessId = accessId; } public Account(Parcel in) { this.name = in.readString(); this.type = in.readString(); + this.accessId = in.readString(); + if (accessId != null) { + synchronized (sAccessedAccounts) { + if (sAccessedAccounts.add(this)) { + try { + IAccountManager accountManager = IAccountManager.Stub.asInterface( + ServiceManager.getService(Context.ACCOUNT_SERVICE)); + accountManager.onAccountAccessed(accessId); + } catch (RemoteException e) { + Log.e(TAG, "Error noting account access", e); + } + } + } + } + } + + /** @hide */ + public String getAccessId() { + return accessId; } public int describeContents() { @@ -66,6 +116,7 @@ public class Account implements Parcelable { public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeString(type); + dest.writeString(accessId); } public static final Creator CREATOR = new Creator() { diff --git a/core/java/android/accounts/AccountManager.java b/core/java/android/accounts/AccountManager.java index 0188d18684515b7bbd54819b39d34def3d2cb606..b0c22d7c80974cbb8f777456328a9cdaabdaef76 100644 --- a/core/java/android/accounts/AccountManager.java +++ b/core/java/android/accounts/AccountManager.java @@ -28,6 +28,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.IntentSender; import android.content.res.Resources; import android.database.SQLException; import android.os.Build; @@ -177,6 +178,14 @@ public class AccountManager { */ public static final String KEY_ACCOUNT_TYPE = "accountType"; + /** + * Bundle key used for the account access id used for noting the + * account was accessed when unmarshalled from a parcel. + * + * @hide + */ + public static final String KEY_ACCOUNT_ACCESS_ID = "accountAccessId"; + /** * Bundle key used for the auth token value in results * from {@link #getAuthToken} and friends. @@ -265,6 +274,15 @@ public class AccountManager { "android.accounts.AccountAuthenticator"; public static final String AUTHENTICATOR_ATTRIBUTES_NAME = "account-authenticator"; + /** + * Token type for the special case where a UID has access only to an account + * but no authenticator specific auth token types. + * + * @hide + */ + public static final String ACCOUNT_ACCESS_TOKEN_TYPE = + "com.android.AccountManager.ACCOUNT_ACCESS_TOKEN_TYPE"; + private final Context mContext; private final IAccountManager mService; private final Handler mMainHandler; @@ -810,7 +828,8 @@ public class AccountManager { public Account bundleToResult(Bundle bundle) throws AuthenticatorException { String name = bundle.getString(KEY_ACCOUNT_NAME); String type = bundle.getString(KEY_ACCOUNT_TYPE); - return new Account(name, type); + String accessId = bundle.getString(KEY_ACCOUNT_ACCESS_ID); + return new Account(name, type, accessId); } }.start(); } @@ -2285,6 +2304,7 @@ public class AccountManager { result.putString(KEY_ACCOUNT_NAME, null); result.putString(KEY_ACCOUNT_TYPE, null); result.putString(KEY_AUTHTOKEN, null); + result.putBinder(KEY_ACCOUNT_ACCESS_ID, null); try { mResponse.onResult(result); } catch (RemoteException e) { @@ -2310,9 +2330,11 @@ public class AccountManager { public void onResult(Bundle value) throws RemoteException { Account account = new Account( value.getString(KEY_ACCOUNT_NAME), - value.getString(KEY_ACCOUNT_TYPE)); - mFuture = getAuthToken(account, mAuthTokenType, mLoginOptions, - mActivity, mMyCallback, mHandler); + value.getString(KEY_ACCOUNT_TYPE), + value.getString(KEY_ACCOUNT_ACCESS_ID)); + mFuture = getAuthToken(account, mAuthTokenType, + mLoginOptions, mActivity, mMyCallback, + mHandler); } @Override @@ -2359,7 +2381,8 @@ public class AccountManager { setException(new AuthenticatorException("account not in result")); return; } - final Account account = new Account(accountName, accountType); + final String accessId = result.getString(KEY_ACCOUNT_ACCESS_ID); + final Account account = new Account(accountName, accountType, accessId); mNumAccounts = 1; getAuthToken(account, mAuthTokenType, null /* options */, mActivity, mMyCallback, mHandler); @@ -2982,4 +3005,49 @@ public class AccountManager { } }.start(); } + + /** + * Gets whether a given package under a user has access to an account. + * Can be called only from the system UID. + * + * @param account The account for which to check. + * @param packageName The package for which to check. + * @param userHandle The user for which to check. + * @return True if the package can access the account. + * + * @hide + */ + public boolean hasAccountAccess(@NonNull Account account, @NonNull String packageName, + @NonNull UserHandle userHandle) { + try { + return mService.hasAccountAccess(account, packageName, userHandle); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Creates an intent to request access to a given account for a UID. + * The returned intent should be stated for a result where {@link + * Activity#RESULT_OK} result means access was granted whereas {@link + * Activity#RESULT_CANCELED} result means access wasn't granted. Can + * be called only from the system UID. + * + * @param account The account for which to request. + * @param packageName The package name which to request. + * @param userHandle The user for which to request. + * @return The intent to request account access or null if the package + * doesn't exist. + * + * @hide + */ + public IntentSender createRequestAccountAccessIntentSenderAsUser(@NonNull Account account, + @NonNull String packageName, @NonNull UserHandle userHandle) { + try { + return mService.createRequestAccountAccessIntentSenderAsUser(account, packageName, + userHandle); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } } diff --git a/core/java/android/accounts/AccountManagerInternal.java b/core/java/android/accounts/AccountManagerInternal.java new file mode 100644 index 0000000000000000000000000000000000000000..68c17c32fdc3e9c9e9db64976236218d17a35a79 --- /dev/null +++ b/core/java/android/accounts/AccountManagerInternal.java @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2016 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 android.accounts; + +import android.annotation.IntRange; +import android.annotation.NonNull; +import android.os.RemoteCallback; + +/** + * Account manager local system service interface. + * + * @hide Only for use within the system server. + */ +public abstract class AccountManagerInternal { + + /** + * Listener for explicit UID account access grant changes. + */ + public interface OnAppPermissionChangeListener { + + /** + * Called when the explicit grant state for a given UID to + * access an account changes. + * + * @param account The account + * @param uid The UID for which the grant changed + */ + public void onAppPermissionChanged(Account account, int uid); + } + + /** + * Requests that a given package is given access to an account. + * The provided callback will be invoked with a {@link android.os.Bundle} + * containing the result which will be a boolean value mapped to the + * {@link AccountManager#KEY_BOOLEAN_RESULT} key. + * + * @param account The account for which to request. + * @param packageName The package name for which to request. + * @param userId Concrete user id for which to request. + * @param callback A callback for receiving the result. + */ + public abstract void requestAccountAccess(@NonNull Account account, + @NonNull String packageName, @IntRange(from = 0) int userId, + @NonNull RemoteCallback callback); + + /** + * Check whether the given UID has access to the account. + * + * @param account The account + * @param uid The UID + * @return Whether the UID can access the account + */ + public abstract boolean hasAccountAccess(@NonNull Account account, @IntRange(from = 0) int uid); + + /** + * Adds a listener for explicit UID account access grant changes. + * + * @param listener The listener + */ + public abstract void addOnAppPermissionChangeListener( + @NonNull OnAppPermissionChangeListener listener); + + /** + * Backups the account access permissions. + * @param userId The user for which to backup. + * @return The backup data. + */ + public abstract byte[] backupAccountAccessPermissions(int userId); + + /** + * Restores the account access permissions. + * @param data The restore data. + * @param userId The user for which to restore. + */ + public abstract void restoreAccountAccessPermissions(byte[] data, int userId); +} diff --git a/core/java/android/accounts/ChooseTypeAndAccountActivity.java b/core/java/android/accounts/ChooseTypeAndAccountActivity.java index 133df2bfa16aadafaf5d9baa69cf0151d6edb4e7..aed7a36937177c6c01f57536625c7455372b9901 100644 --- a/core/java/android/accounts/ChooseTypeAndAccountActivity.java +++ b/core/java/android/accounts/ChooseTypeAndAccountActivity.java @@ -399,7 +399,7 @@ public class ChooseTypeAndAccountActivity extends Activity * useless. */ private void setNonLabelThemeAndCallSuperCreate(Bundle savedInstanceState) { - setTheme(R.style.Theme_Material_Light_Dialog_NoActionBar); + setTheme(R.style.Theme_DeviceDefault_Light_Dialog_NoActionBar); super.onCreate(savedInstanceState); } diff --git a/core/java/android/accounts/GrantCredentialsPermissionActivity.java b/core/java/android/accounts/GrantCredentialsPermissionActivity.java index 12b2b9ccf1480c8d8e6c93c6ebda1ad5bb259aec..38eab290502259c1085b130c93998baa8699b648 100644 --- a/core/java/android/accounts/GrantCredentialsPermissionActivity.java +++ b/core/java/android/accounts/GrantCredentialsPermissionActivity.java @@ -35,12 +35,10 @@ import java.io.IOException; */ public class GrantCredentialsPermissionActivity extends Activity implements View.OnClickListener { public static final String EXTRAS_ACCOUNT = "account"; - public static final String EXTRAS_AUTH_TOKEN_LABEL = "authTokenLabel"; public static final String EXTRAS_AUTH_TOKEN_TYPE = "authTokenType"; public static final String EXTRAS_RESPONSE = "response"; - public static final String EXTRAS_ACCOUNT_TYPE_LABEL = "accountTypeLabel"; - public static final String EXTRAS_PACKAGES = "application"; public static final String EXTRAS_REQUESTING_UID = "uid"; + private Account mAccount; private String mAuthTokenType; private int mUid; @@ -109,7 +107,11 @@ public class GrantCredentialsPermissionActivity extends Activity implements View } } }; - AccountManager.get(this).getAuthTokenLabel(mAccount.type, mAuthTokenType, callback, null); + + if (!AccountManager.ACCOUNT_ACCESS_TOKEN_TYPE.equals(mAuthTokenType)) { + AccountManager.get(this).getAuthTokenLabel(mAccount.type, + mAuthTokenType, callback, null); + } findViewById(R.id.allow_button).setOnClickListener(this); findViewById(R.id.deny_button).setOnClickListener(this); diff --git a/core/java/android/accounts/IAccountManager.aidl b/core/java/android/accounts/IAccountManager.aidl index 7199288426f2a2fbc638da1d7f846ea38bec267c..c271e7ebc52c8cd051404d8ed67b6304e0c47536 100644 --- a/core/java/android/accounts/IAccountManager.aidl +++ b/core/java/android/accounts/IAccountManager.aidl @@ -19,8 +19,10 @@ package android.accounts; import android.accounts.IAccountManagerResponse; import android.accounts.Account; import android.accounts.AuthenticatorDescription; +import android.content.IntentSender; import android.os.Bundle; - +import android.os.RemoteCallback; +import android.os.UserHandle; /** * Central application service that provides account management. @@ -102,4 +104,12 @@ interface IAccountManager { /* Check if credentials update is suggested */ void isCredentialsUpdateSuggested(in IAccountManagerResponse response, in Account account, String statusToken); + + /* Check if the package in a user can access an account */ + boolean hasAccountAccess(in Account account, String packageName, in UserHandle userHandle); + /* Crate an intent to request account access for package and a given user id */ + IntentSender createRequestAccountAccessIntentSenderAsUser(in Account account, + String packageName, in UserHandle userHandle); + + void onAccountAccessed(String token); } diff --git a/core/java/android/animation/LayoutTransition.java b/core/java/android/animation/LayoutTransition.java index cdd72be76805a2c57845a1e771a409ae3e53dd8b..5a23fddf1d5128bb2497663f5fa73d40826cca26 100644 --- a/core/java/android/animation/LayoutTransition.java +++ b/core/java/android/animation/LayoutTransition.java @@ -62,7 +62,11 @@ import java.util.Map; * layout will run (closing the gap created in the layout when the item was removed). If this * default choreography behavior is not desired, the {@link #setDuration(int, long)} and * {@link #setStartDelay(int, long)} of any or all of the animations can be changed as - * appropriate.

+ * appropriate. Keep in mind, however, that if you start an APPEARING animation before a + * DISAPPEARING animation is completed, the DISAPPEARING animation stops, and any effects from + * the DISAPPEARING animation are reverted. If you instead start a DISAPPEARING animation + * before an APPEARING animation is completed, a similar set of effects occurs for the + * APPEARING animation.

* *

The animations specified for the transition, both the defaults and any custom animations * set on the transition object, are templates only. That is, these animations exist to hold the diff --git a/core/java/android/animation/ObjectAnimator.java b/core/java/android/animation/ObjectAnimator.java index 9a2aa302a4bafe34435e97257da1c1a11b9c76f2..0c21c4ff55e7a7c0907af540d4c968db4febf645 100644 --- a/core/java/android/animation/ObjectAnimator.java +++ b/core/java/android/animation/ObjectAnimator.java @@ -977,8 +977,9 @@ public final class ObjectAnimator extends ValueAnimator { @Override void animateValue(float fraction) { final Object target = getTarget(); - if (target == null) { - // We lost the target reference, cancel and clean up. + if (mTarget != null && target == null) { + // We lost the target reference, cancel and clean up. Note: we allow null target if the + /// target has never been set. cancel(); return; } diff --git a/core/java/android/animation/ValueAnimator.java b/core/java/android/animation/ValueAnimator.java index e3f8fa49f9dde472486438a967286d5ee92c68da..7e16e3ece5495583d979b18ba2fbd5c2f9b44bd2 100644 --- a/core/java/android/animation/ValueAnimator.java +++ b/core/java/android/animation/ValueAnimator.java @@ -18,6 +18,7 @@ package android.animation; import android.annotation.CallSuper; import android.annotation.IntDef; +import android.annotation.TestApi; import android.os.Looper; import android.os.Trace; import android.util.AndroidRuntimeException; @@ -261,6 +262,7 @@ public class ValueAnimator extends Animator implements AnimationHandler.Animatio /** * @hide */ + @TestApi public static void setDurationScale(float durationScale) { sDurationScale = durationScale; } @@ -268,6 +270,7 @@ public class ValueAnimator extends Animator implements AnimationHandler.Animatio /** * @hide */ + @TestApi public static float getDurationScale() { return sDurationScale; } diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index aacd5da58640069b3c4416e5a74ad64fd289afce..50479c8e951bf21ee406a8450663b417635ec83c 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -3017,6 +3017,14 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM reply.writeNoException(); return true; } + case CAN_BYPASS_WORK_CHALLENGE: { + data.enforceInterface(IActivityManager.descriptor); + final PendingIntent intent = PendingIntent.CREATOR.createFromParcel(data); + final boolean result = canBypassWorkChallenge(intent); + reply.writeNoException(); + reply.writeInt(result ? 1 : 0); + return true; + } } return super.onTransact(code, data, reply, flags); @@ -7091,6 +7099,20 @@ class ActivityManagerProxy implements IActivityManager reply.recycle(); return; } + @Override + public boolean canBypassWorkChallenge(PendingIntent intent) + throws RemoteException { + Parcel data = Parcel.obtain(); + Parcel reply = Parcel.obtain(); + data.writeInterfaceToken(IActivityManager.descriptor); + intent.writeToParcel(data, 0); + mRemote.transact(CAN_BYPASS_WORK_CHALLENGE, data, reply, 0); + reply.readException(); + final int result = reply.readInt(); + data.recycle(); + reply.recycle(); + return result != 0; + } private IBinder mRemote; } diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 762ea813c6a7e4f8d6af1f8f10a2c401b922d5b2..2d22f26069f331a07f4b7ab837b1bf473f4236f5 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -108,6 +108,7 @@ import android.renderscript.RenderScriptCacheDir; import android.system.Os; import android.system.OsConstants; import android.system.ErrnoException; +import android.webkit.WebView; import com.android.internal.annotations.GuardedBy; import com.android.internal.app.IVoiceInteractor; @@ -433,8 +434,10 @@ public final class ActivityThread { static final class NewIntentData { List intents; IBinder token; + boolean andPause; public String toString() { - return "NewIntentData{intents=" + intents + " token=" + token + "}"; + return "NewIntentData{intents=" + intents + " token=" + token + + " andPause=" + andPause +"}"; } } @@ -751,10 +754,12 @@ public final class ActivityThread { configChanges, notResumed, config, overrideConfig, true, preserveWindow); } - public final void scheduleNewIntent(List intents, IBinder token) { + public final void scheduleNewIntent( + List intents, IBinder token, boolean andPause) { NewIntentData data = new NewIntentData(); data.intents = intents; data.token = token; + data.andPause = andPause; sendMessage(H.NEW_INTENT, data); } @@ -1037,10 +1042,21 @@ public final class ActivityThread { long dalvikMax = runtime.totalMemory() / 1024; long dalvikFree = runtime.freeMemory() / 1024; long dalvikAllocated = dalvikMax - dalvikFree; + + Class[] classesToCount = new Class[] { + ContextImpl.class, + Activity.class, + WebView.class, + OpenSSLSocketImpl.class + }; + long[] instanceCounts = VMDebug.countInstancesOfClasses(classesToCount, true); + long appContextInstanceCount = instanceCounts[0]; + long activityInstanceCount = instanceCounts[1]; + long webviewInstanceCount = instanceCounts[2]; + long openSslSocketCount = instanceCounts[3]; + long viewInstanceCount = ViewDebug.getViewInstanceCount(); long viewRootInstanceCount = ViewDebug.getViewRootImplCount(); - long appContextInstanceCount = Debug.countInstancesOfClass(ContextImpl.class); - long activityInstanceCount = Debug.countInstancesOfClass(Activity.class); int globalAssetCount = AssetManager.getGlobalAssetCount(); int globalAssetManagerCount = AssetManager.getGlobalAssetManagerCount(); int binderLocalObjectCount = Debug.getBinderLocalObjectCount(); @@ -1048,7 +1064,6 @@ public final class ActivityThread { int binderDeathObjectCount = Debug.getBinderDeathObjectCount(); long parcelSize = Parcel.getGlobalAllocSize(); long parcelCount = Parcel.getGlobalAllocCount(); - long openSslSocketCount = Debug.countInstancesOfClass(OpenSSLSocketImpl.class); SQLiteDebug.PagerStats stats = SQLiteDebug.getDatabaseInfo(); dumpMemInfoTable(pw, memInfo, checkin, dumpFullInfo, dumpDalvik, dumpSummaryOnly, @@ -1111,6 +1126,7 @@ public final class ActivityThread { "Parcel count:", parcelCount); printRow(pw, TWO_COUNT_COLUMNS, "Death Recipients:", binderDeathObjectCount, "OpenSSL Sockets:", openSslSocketCount); + printRow(pw, ONE_COUNT_COLUMN, "WebViews:", webviewInstanceCount); // SQLite mem info pw.println(" "); @@ -2787,24 +2803,34 @@ public final class ActivityThread { } } - public final void performNewIntents(IBinder token, List intents) { - ActivityClientRecord r = mActivities.get(token); - if (r != null) { - final boolean resumed = !r.paused; - if (resumed) { - r.activity.mTemporaryPause = true; - mInstrumentation.callActivityOnPause(r.activity); - } - deliverNewIntents(r, intents); - if (resumed) { - r.activity.performResume(); - r.activity.mTemporaryPause = false; - } + void performNewIntents(IBinder token, List intents, boolean andPause) { + final ActivityClientRecord r = mActivities.get(token); + if (r == null) { + return; + } + + final boolean resumed = !r.paused; + if (resumed) { + r.activity.mTemporaryPause = true; + mInstrumentation.callActivityOnPause(r.activity); + } + deliverNewIntents(r, intents); + if (resumed) { + r.activity.performResume(); + r.activity.mTemporaryPause = false; + } + + if (r.paused && andPause) { + // In this case the activity was in the paused state when we delivered the intent, + // to guarantee onResume gets called after onNewIntent we temporarily resume the + // activity and pause again as the caller wanted. + performResumeActivity(token, false, "performNewIntents"); + performPauseActivityIfNeeded(r, "performNewIntents"); } } private void handleNewIntent(NewIntentData data) { - performNewIntents(data.token, data.intents); + performNewIntents(data.token, data.intents, data.andPause); } public void handleRequestAssistContextExtras(RequestAssistContextExtras cmd) { @@ -3785,7 +3811,7 @@ public final class ActivityThread { * than our client -- for the server, stop means to save state and give * it the result when it is done, but the window may still be visible. * For the client, we want to call onStop()/onStart() to indicate when - * the activity's UI visibillity changes. + * the activity's UI visibility changes. */ private void performStopActivityInner(ActivityClientRecord r, StopInfo info, boolean keepShown, boolean saveState, String reason) { @@ -3959,6 +3985,9 @@ public final class ActivityThread { mSomeActivitiesChanged = true; } + // TODO: This method should be changed to use {@link #performStopActivityInner} to perform to + // stop operation on the activity to reduce code duplication and the chance of fixing a bug in + // one place and missing the other. private void handleSleeping(IBinder token, boolean sleeping) { ActivityClientRecord r = mActivities.get(token); @@ -3969,6 +3998,10 @@ public final class ActivityThread { if (sleeping) { if (!r.stopped && !r.isPreHoneycomb()) { + if (!r.activity.mFinished && r.state == null) { + callCallActivityOnSaveInstanceState(r); + } + try { // Now we are idle. r.activity.performStop(false /*preserveWindow*/); @@ -4989,9 +5022,7 @@ public final class ActivityThread { int uid = Process.myUid(); String[] packages = getPackageManager().getPackagesForUid(uid); - // If there are several packages in this application we won't - // initialize the graphics disk caches - if (packages != null && packages.length == 1) { + if (packages != null) { ThreadedRenderer.setupDiskCache(cacheDir); RenderScriptCacheDir.setupDiskCache(cacheDir); } diff --git a/core/java/android/app/ApplicationThreadNative.java b/core/java/android/app/ApplicationThreadNative.java index d6da3f44f4a0062e57d3f025a140fae6c3014139..05d9d7e412f09987fd4f40a4b344b2b5296d9510 100644 --- a/core/java/android/app/ApplicationThreadNative.java +++ b/core/java/android/app/ApplicationThreadNative.java @@ -190,7 +190,8 @@ public abstract class ApplicationThreadNative extends Binder data.enforceInterface(IApplicationThread.descriptor); List pi = data.createTypedArrayList(ReferrerIntent.CREATOR); IBinder b = data.readStrongBinder(); - scheduleNewIntent(pi, b); + final boolean andPause = data.readInt() == 1; + scheduleNewIntent(pi, b, andPause); return true; } @@ -909,12 +910,13 @@ class ApplicationThreadProxy implements IApplicationThread { data.recycle(); } - public void scheduleNewIntent(List intents, IBinder token) + public void scheduleNewIntent(List intents, IBinder token, boolean andPause) throws RemoteException { Parcel data = Parcel.obtain(); data.writeInterfaceToken(IApplicationThread.descriptor); data.writeTypedList(intents); data.writeStrongBinder(token); + data.writeInt(andPause ? 1 : 0); mRemote.transact(SCHEDULE_NEW_INTENT_TRANSACTION, data, null, IBinder.FLAG_ONEWAY); data.recycle(); diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java index 85a0403fe57e68da6ee315c6fd64db51d8149540..6e2c464e9a371bfc50eb6e85d5c0b9380ab43bb9 100644 --- a/core/java/android/app/Dialog.java +++ b/core/java/android/app/Dialog.java @@ -32,6 +32,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.ContextWrapper; import android.content.DialogInterface; +import android.content.res.Configuration; import android.content.pm.ApplicationInfo; import android.graphics.drawable.Drawable; import android.net.Uri; @@ -288,9 +289,14 @@ public class Dialog implements DialogInterface, Window.Callback, } mCanceled = false; - + if (!mCreated) { dispatchOnCreate(null); + } else { + // Fill the DecorView in on any configuration changes that + // may have occured while it was removed from the WindowManager. + final Configuration config = mContext.getResources().getConfiguration(); + mWindow.getDecorView().dispatchConfigurationChanged(config); } onStart(); diff --git a/core/java/android/app/DownloadManager.java b/core/java/android/app/DownloadManager.java index c237ba3acce12ae05def313a8beca8a32d925cfb..506c72036546d6eece762e5bd3d32ee686ff4c8b 100644 --- a/core/java/android/app/DownloadManager.java +++ b/core/java/android/app/DownloadManager.java @@ -1097,7 +1097,7 @@ public class DownloadManager { if (cursor.moveToFirst()) { int status = cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_STATUS)); if (DownloadManager.STATUS_SUCCESSFUL == status) { - return ContentUris.withAppendedId(Downloads.Impl.ALL_DOWNLOADS_CONTENT_URI, id); + return ContentUris.withAppendedId(Downloads.Impl.ALL_DOWNLOADS_CONTENT_URI, id); } } } finally { diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java index 8afca784b06727d97c15368adf283493f44107c8..5dead2850942dc21118fe86c6b6565a38b5996ba 100644 --- a/core/java/android/app/Fragment.java +++ b/core/java/android/app/Fragment.java @@ -194,7 +194,7 @@ final class FragmentState implements Parcelable { *

* * diff --git a/core/java/android/app/FragmentHostCallback.java b/core/java/android/app/FragmentHostCallback.java index e1d713626e2e1911c8d99da56dd90b137d6ae418..d869168e2b6a55a266093c22a6ab1f44d37483fd 100644 --- a/core/java/android/app/FragmentHostCallback.java +++ b/core/java/android/app/FragmentHostCallback.java @@ -340,6 +340,11 @@ public abstract class FragmentHostCallback extends FragmentContainer { } void restoreLoaderNonConfig(ArrayMap loaderManagers) { + if (loaderManagers != null) { + for (int i = 0, N = loaderManagers.size(); i < N; i++) { + ((LoaderManagerImpl) loaderManagers.valueAt(i)).updateHostController(this); + } + } mAllLoaderManagers = loaderManagers; } diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java index cd7665cf1163eaff434a0667dd92d2e42c45ec82..bfaf3328f6116bff6c426d8a802f2efe2190f9d4 100644 --- a/core/java/android/app/FragmentManager.java +++ b/core/java/android/app/FragmentManager.java @@ -59,7 +59,7 @@ import java.util.List; *
*

Developer Guides

*

For more information about using fragments, read the - * Fragments developer guide.

+ * Fragments developer guide.

*
* * While the FragmentManager API was introduced in diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index e411e03a8a949da41a83c5ec6fe17f96836d64de..5a4470b2ecdb5ba25aef19af2f73c22b9fa6764f 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -671,6 +671,18 @@ public interface IActivityManager extends IInterface { */ public void setHasTopUi(boolean hasTopUi) throws RemoteException; + /** + * Returns if the target of the PendingIntent can be fired directly, without triggering + * a work profile challenge. This can happen if the PendingIntent is to start direct-boot + * aware activities, and the target user is in RUNNING_LOCKED state, i.e. we should allow + * direct-boot aware activity to bypass work challenge when the user hasn't unlocked yet. + * @param intent the {@link PendingIntent} to be tested. + * @return {@code true} if the intent should not trigger a work challenge, {@code false} + * otherwise. + * @throws RemoteException + */ + public boolean canBypassWorkChallenge(PendingIntent intent) throws RemoteException; + /* * Private non-Binder interfaces */ @@ -1062,4 +1074,5 @@ public interface IActivityManager extends IInterface { int SET_VR_THREAD_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 377; int SET_RENDER_THREAD_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 378; int SET_HAS_TOP_UI = IBinder.FIRST_CALL_TRANSACTION + 379; + int CAN_BYPASS_WORK_CHALLENGE = IBinder.FIRST_CALL_TRANSACTION + 380; } diff --git a/core/java/android/app/IApplicationThread.java b/core/java/android/app/IApplicationThread.java index 559f69fc2aec10fbc95070b222044a658e864689..3fa88ae674a44fc9a0e5a12f063d1fb8b31ffa6e 100644 --- a/core/java/android/app/IApplicationThread.java +++ b/core/java/android/app/IApplicationThread.java @@ -67,7 +67,8 @@ public interface IApplicationThread extends IInterface { List pendingNewIntents, int configChanges, boolean notResumed, Configuration config, Configuration overrideConfig, boolean preserveWindow) throws RemoteException; - void scheduleNewIntent(List intent, IBinder token) throws RemoteException; + void scheduleNewIntent( + List intent, IBinder token, boolean andPause) throws RemoteException; void scheduleDestroyActivity(IBinder token, boolean finished, int configChanges) throws RemoteException; void scheduleReceiver(Intent intent, ActivityInfo info, CompatibilityInfo compatInfo, diff --git a/core/java/android/app/ITransientNotification.aidl b/core/java/android/app/ITransientNotification.aidl index 35b53a48e6e18385fd0b42b19c8232cc8f8cc6d5..d5b3ed0a44d80274de5003e873a414398a57c516 100644 --- a/core/java/android/app/ITransientNotification.aidl +++ b/core/java/android/app/ITransientNotification.aidl @@ -19,7 +19,7 @@ package android.app; /** @hide */ oneway interface ITransientNotification { - void show(); + void show(IBinder windowToken); void hide(); } diff --git a/core/java/android/app/IntentService.java b/core/java/android/app/IntentService.java index f33af396070e9dde19302ef366a73e4a7f815a94..e4a22c42d9bcbeadeb63d1ea6a57adca35cdf024 100644 --- a/core/java/android/app/IntentService.java +++ b/core/java/android/app/IntentService.java @@ -46,7 +46,8 @@ import android.os.Message; *
*

Developer Guides

*

For a detailed discussion about how to create services, read the - * Services developer guide.

+ * Services developer + * guide.

*
* * @see android.os.AsyncTask diff --git a/core/java/android/app/LoaderManager.java b/core/java/android/app/LoaderManager.java index c14dec93c348ee1b05112f88fb3a0358566a5970..bedf31a22f26410806c220c20e36ec46ba99a031 100644 --- a/core/java/android/app/LoaderManager.java +++ b/core/java/android/app/LoaderManager.java @@ -195,6 +195,9 @@ public abstract class LoaderManager { public static void enableDebugLogging(boolean enabled) { LoaderManagerImpl.DEBUG = enabled; } + + /** @hide for internal testing only */ + public FragmentHostCallback getFragmentHostCallback() { return null; } } class LoaderManagerImpl extends LoaderManager { @@ -542,6 +545,10 @@ class LoaderManagerImpl extends LoaderManager { void updateHostController(FragmentHostCallback host) { mHost = host; } + + public FragmentHostCallback getFragmentHostCallback() { + return mHost; + } private LoaderInfo createLoader(int id, Bundle args, LoaderManager.LoaderCallbacks callback) { diff --git a/core/java/android/app/LocalActivityManager.java b/core/java/android/app/LocalActivityManager.java index 2a1e3c250a00a24f9e230e464469245553d5743f..3b273bc1c4b6bdc0cb0223158422d98cfc6dad8c 100644 --- a/core/java/android/app/LocalActivityManager.java +++ b/core/java/android/app/LocalActivityManager.java @@ -314,7 +314,7 @@ public class LocalActivityManager { ArrayList intents = new ArrayList<>(1); intents.add(new ReferrerIntent(intent, mParent.getPackageName())); if (localLOGV) Log.v(TAG, r.id + ": new intent"); - mActivityThread.performNewIntents(r, intents); + mActivityThread.performNewIntents(r, intents, false /* andPause */); r.intent = intent; moveToState(r, mCurState); if (mSingleMode) { diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 7c28664b386d2a390d5f987b6d03a888a2300449..9f217d48aa878313d9061f2510a7f26a1c1593e3 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -19,6 +19,7 @@ package android.app; import android.annotation.ColorInt; import android.annotation.DrawableRes; import android.annotation.IntDef; +import android.annotation.NonNull; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; import android.annotation.SystemApi; @@ -1055,6 +1056,7 @@ public class Notification implements Parcelable this(Icon.createWithResource("", icon), title, intent, new Bundle(), null, false); } + /** Keep in sync with {@link Notification.Action.Builder#Builder(Action)}! */ private Action(Icon icon, CharSequence title, PendingIntent intent, Bundle extras, RemoteInput[] remoteInputs, boolean allowGeneratedReplies) { this.mIcon = icon; @@ -1121,7 +1123,7 @@ public class Notification implements Parcelable */ @Deprecated public Builder(int icon, CharSequence title, PendingIntent intent) { - this(Icon.createWithResource("", icon), title, intent, new Bundle(), null); + this(Icon.createWithResource("", icon), title, intent); } /** @@ -1131,7 +1133,7 @@ public class Notification implements Parcelable * @param intent the {@link PendingIntent} to fire when users trigger this action */ public Builder(Icon icon, CharSequence title, PendingIntent intent) { - this(icon, title, intent, new Bundle(), null); + this(icon, title, intent, new Bundle(), null, false); } /** @@ -1140,12 +1142,13 @@ public class Notification implements Parcelable * @param action the action to read fields from. */ public Builder(Action action) { - this(action.getIcon(), action.title, action.actionIntent, new Bundle(action.mExtras), - action.getRemoteInputs()); + this(action.getIcon(), action.title, action.actionIntent, + new Bundle(action.mExtras), action.getRemoteInputs(), + action.getAllowGeneratedReplies()); } private Builder(Icon icon, CharSequence title, PendingIntent intent, Bundle extras, - RemoteInput[] remoteInputs) { + RemoteInput[] remoteInputs, boolean allowGeneratedReplies) { mIcon = icon; mTitle = title; mIntent = intent; @@ -1154,6 +1157,7 @@ public class Notification implements Parcelable mRemoteInputs = new ArrayList(remoteInputs.length); Collections.addAll(mRemoteInputs, remoteInputs); } + mAllowGeneratedReplies = allowGeneratedReplies; } /** @@ -1236,7 +1240,7 @@ public class Notification implements Parcelable getIcon(), title, actionIntent, // safe to alias - new Bundle(mExtras), + mExtras == null ? new Bundle() : new Bundle(mExtras), getRemoteInputs(), getAllowGeneratedReplies()); } @@ -4656,12 +4660,12 @@ public class Notification implements Parcelable } /** - * @param userDisplayName the name to be displayed for any replies sent by the user before the - * posting app reposts the notification with those messages after they've been actually - * sent and in previous messages sent by the user added in + * @param userDisplayName Required - the name to be displayed for any replies sent by the + * user before the posting app reposts the notification with those messages after they've + * been actually sent and in previous messages sent by the user added in * {@link #addMessage(Notification.MessagingStyle.Message)} */ - public MessagingStyle(CharSequence userDisplayName) { + public MessagingStyle(@NonNull CharSequence userDisplayName) { mUserDisplayName = userDisplayName; } diff --git a/core/java/android/app/ResourcesManager.java b/core/java/android/app/ResourcesManager.java index 55bb878a99410ba490eff4b5037d4fdcd21bc11f..4916c1c1f5c79638d5d64f6afcce2074320116fd 100644 --- a/core/java/android/app/ResourcesManager.java +++ b/core/java/android/app/ResourcesManager.java @@ -840,19 +840,22 @@ public class ResourcesManager { tmpConfig = new Configuration(); } tmpConfig.setTo(config); + + // Get new DisplayMetrics based on the DisplayAdjustments given + // to the ResourcesImpl. Update a copy if the CompatibilityInfo + // changed, because the ResourcesImpl object will handle the + // update internally. + DisplayAdjustments daj = r.getDisplayAdjustments(); + if (compat != null) { + daj = new DisplayAdjustments(daj); + daj.setCompatibilityInfo(compat); + } + dm = getDisplayMetrics(displayId, daj); + if (!isDefaultDisplay) { - // Get new DisplayMetrics based on the DisplayAdjustments given - // to the ResourcesImpl. Udate a copy if the CompatibilityInfo - // changed, because the ResourcesImpl object will handle the - // update internally. - DisplayAdjustments daj = r.getDisplayAdjustments(); - if (compat != null) { - daj = new DisplayAdjustments(daj); - daj.setCompatibilityInfo(compat); - } - dm = getDisplayMetrics(displayId, daj); applyNonDefaultDisplayMetricsToConfiguration(dm, tmpConfig); } + if (hasOverrideConfiguration) { tmpConfig.updateFrom(key.mOverrideConfiguration); } diff --git a/core/java/android/app/TimePickerDialog.java b/core/java/android/app/TimePickerDialog.java index aca07636e26ea4f52136a68f0af3cc459e904483..3f467a01bee2a6cca3462575d973b4e159c42994 100644 --- a/core/java/android/app/TimePickerDialog.java +++ b/core/java/android/app/TimePickerDialog.java @@ -16,6 +16,7 @@ package android.app; +import android.annotation.TestApi; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; @@ -91,6 +92,12 @@ public class TimePickerDialog extends AlertDialog implements OnClickListener, /** * Creates a new time picker dialog with the specified theme. + *

+ * The theme is overlaid on top of the theme of the parent {@code context}. + * If {@code themeResId} is 0, the dialog will be inflated using the theme + * specified by the + * {@link android.R.attr#timePickerDialogTheme android:timePickerDialogTheme} + * attribute on the parent {@code context}'s theme. * * @param context the parent context * @param themeResId the resource ID of the theme to apply to this dialog @@ -109,11 +116,6 @@ public class TimePickerDialog extends AlertDialog implements OnClickListener, mIs24HourView = is24HourView; final Context themeContext = getContext(); - - - final TypedValue outValue = new TypedValue(); - context.getTheme().resolveAttribute(R.attr.timePickerDialogTheme, outValue, true); - final LayoutInflater inflater = LayoutInflater.from(themeContext); final View view = inflater.inflate(R.layout.time_picker_dialog, null); setView(view); @@ -128,6 +130,15 @@ public class TimePickerDialog extends AlertDialog implements OnClickListener, mTimePicker.setOnTimeChangedListener(this); } + /** + * @return the time picker displayed in the dialog + * @hide For testing only. + */ + @TestApi + public TimePicker getTimePicker() { + return mTimePicker; + } + @Override public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { /* do nothing */ diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java index 219afea02c48d6f30811e293df8b6a1b1eb5f07c..aa0eaaebf9758d3cb0c555eaa50659c430a5448a 100644 --- a/core/java/android/app/WallpaperManager.java +++ b/core/java/android/app/WallpaperManager.java @@ -910,7 +910,7 @@ public class WallpaperManager { * wallpaper. */ public void setResource(@RawRes int resid) throws IOException { - setResource(resid, FLAG_SYSTEM); + setResource(resid, FLAG_SYSTEM | FLAG_LOCK); } /** @@ -1016,7 +1016,7 @@ public class WallpaperManager { */ public int setBitmap(Bitmap fullImage, Rect visibleCropHint, boolean allowBackup) throws IOException { - return setBitmap(fullImage, visibleCropHint, allowBackup, FLAG_SYSTEM); + return setBitmap(fullImage, visibleCropHint, allowBackup, FLAG_SYSTEM | FLAG_LOCK); } /** @@ -1154,7 +1154,7 @@ public class WallpaperManager { */ public int setStream(InputStream bitmapData, Rect visibleCropHint, boolean allowBackup) throws IOException { - return setStream(bitmapData, visibleCropHint, allowBackup, FLAG_SYSTEM); + return setStream(bitmapData, visibleCropHint, allowBackup, FLAG_SYSTEM | FLAG_LOCK); } /** @@ -1393,6 +1393,7 @@ public class WallpaperManager { */ @SystemApi public void clearWallpaper() { + clearWallpaper(FLAG_LOCK, mContext.getUserId()); clearWallpaper(FLAG_SYSTEM, mContext.getUserId()); } diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 46a5a8c73a19faa7dadf1c8834fa02253ee1cccf..cd1cd49091a45c5fe1d79b35ca10e1d3d4c0c2d9 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -416,6 +416,14 @@ public class DevicePolicyManager { */ public static final int NOTIFICATION_BUGREPORT_FINISHED_NOT_ACCEPTED = 3; + /** + * Default and maximum timeout in milliseconds after which unlocking with weak auth times out, + * i.e. the user has to use a strong authentication method like password, PIN or pattern. + * + * @hide + */ + public static final long DEFAULT_STRONG_AUTH_TIMEOUT_MS = 72 * 60 * 60 * 1000; // 72h + /** * A {@link android.os.Parcelable} extra of type {@link android.os.PersistableBundle} that * allows a mobile device management application or NFC programmer application which starts @@ -1275,6 +1283,33 @@ public class DevicePolicyManager { */ public static final int PASSWORD_QUALITY_MANAGED = 0x80000; + /** + * @hide + * + * adb shell dpm set-{device,profile}-owner will normally not allow installing an owner to + * a user with accounts. {@link #ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED} + * and {@link #ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_DISALLOWED} are the account features + * used by authenticator to exempt their accounts from this: + * + *

    + *
  • Non-test-only DO/PO still can't be installed when there are accounts. + *

    In order to make an apk test-only, add android:testOnly="true" to the + * <application> tag in the manifest. + * + *

  • Test-only DO/PO can be installed even when there are accounts, as long as all the + * accounts have the {@link #ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED} feature. + * Some authenticators claim to have any features, so to detect it, we also check + * {@link #ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_DISALLOWED} and disallow installing + * if any of the accounts have it. + *
+ */ + public static final String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED = + "android.account.DEVICE_OR_PROFILE_OWNER_ALLOWED"; + + /** @hide See {@link #ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED} */ + public static final String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_DISALLOWED = + "android.account.DEVICE_OR_PROFILE_OWNER_DISALLOWED"; + /** * Called by an application that is administering the device to set the password restrictions it * is imposing. After setting this, the user will not be able to enter a new password that is @@ -2219,6 +2254,7 @@ public class DevicePolicyManager { * @throws SecurityException if the calling application does not own an active administrator * that uses {@link DeviceAdminInfo#USES_POLICY_RESET_PASSWORD} * @throws IllegalStateException if the calling user is locked or has a managed profile. + * @throws IllegalArgumentException if the password does not meet system requirements. */ public boolean resetPassword(String password, int flags) { throwIfParentInstance("resetPassword"); @@ -2307,6 +2343,83 @@ public class DevicePolicyManager { return 0; } + /** + * Called by a device/profile owner to set the timeout after which unlocking with secondary, non + * strong auth (e.g. fingerprint, trust agents) times out, i.e. the user has to use a strong + * authentication method like password, pin or pattern. + * + *

This timeout is used internally to reset the timer to require strong auth again after + * specified timeout each time it has been successfully used. + * + *

Fingerprint can also be disabled altogether using {@link #KEYGUARD_DISABLE_FINGERPRINT}. + * + *

Trust agents can also be disabled altogether using {@link #KEYGUARD_DISABLE_TRUST_AGENTS}. + * + *

The calling device admin must be a device or profile owner. If it is not, + * a {@link SecurityException} will be thrown. + * + *

The calling device admin can verify the value it has set by calling + * {@link #getRequiredStrongAuthTimeout(ComponentName)} and passing in its instance. + * + *

This method can be called on the {@link DevicePolicyManager} instance returned by + * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent + * profile. + * + * @param admin Which {@link DeviceAdminReceiver} this request is associated with. + * @param timeoutMs The new timeout, after which the user will have to unlock with strong + * authentication method. A value of 0 means the admin is not participating in + * controlling the timeout. + * The minimum and maximum timeouts are platform-defined and are typically 1 hour and + * 72 hours, respectively. Though discouraged, the admin may choose to require strong + * auth at all times using {@link #KEYGUARD_DISABLE_FINGERPRINT} and/or + * {@link #KEYGUARD_DISABLE_TRUST_AGENTS}. + * + * @throws SecurityException if {@code admin} is not a device or profile owner. + * + * @hide + */ + public void setRequiredStrongAuthTimeout(@NonNull ComponentName admin, + long timeoutMs) { + if (mService != null) { + try { + mService.setRequiredStrongAuthTimeout(admin, timeoutMs, mParentInstance); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + } + + /** + * Determine for how long the user will be able to use secondary, non strong auth for + * authentication, since last strong method authentication (password, pin or pattern) was used. + * After the returned timeout the user is required to use strong authentication method. + * + *

This method can be called on the {@link DevicePolicyManager} instance + * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve + * restrictions on the parent profile. + * + * @param admin The name of the admin component to check, or {@code null} to aggregate + * accross all participating admins. + * @return The timeout or 0 if not configured for the provided admin. + * + * @hide + */ + public long getRequiredStrongAuthTimeout(@Nullable ComponentName admin) { + return getRequiredStrongAuthTimeout(admin, myUserId()); + } + + /** @hide per-user version */ + public long getRequiredStrongAuthTimeout(@Nullable ComponentName admin, @UserIdInt int userId) { + if (mService != null) { + try { + return mService.getRequiredStrongAuthTimeout(admin, userId, mParentInstance); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + return DEFAULT_STRONG_AUTH_TIMEOUT_MS; + } + /** * Make the device lock immediately, as if the lock screen timeout has expired at the point of * this call. @@ -6466,6 +6579,37 @@ public class DevicePolicyManager { } } + /** + * @hide + * Enable backup service. + *

This includes all backup and restore mechanisms. + * Setting this to {@code false} will make backup service no-op or return empty results. + * + *

There must be only one user on the device, managed by the device owner. + * Otherwise a {@link SecurityException} will be thrown. + * + *

Backup service is off by default when device owner is present. + */ + public void setBackupServiceEnabled(@NonNull ComponentName admin, boolean enabled) { + try { + mService.setBackupServiceEnabled(admin, enabled); + } catch (RemoteException re) { + throw re.rethrowFromSystemServer(); + } + } + + /** + * @hide + * @return {@code true} if backup service is enabled, {@code false} otherwise. + */ + public boolean isBackupServiceEnabled(@NonNull ComponentName admin) { + try { + return mService.isBackupServiceEnabled(admin); + } catch (RemoteException re) { + throw re.rethrowFromSystemServer(); + } + } + /** * CM: check if secure keyguard is required * @hide diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl index 8693041c1309804632f01db4c82949bebac2757f..ed13c083d275c56369a697cf5c66f4d9e86f1ddb 100644 --- a/core/java/android/app/admin/IDevicePolicyManager.aidl +++ b/core/java/android/app/admin/IDevicePolicyManager.aidl @@ -82,6 +82,9 @@ interface IDevicePolicyManager { long getMaximumTimeToLock(in ComponentName who, int userHandle, boolean parent); long getMaximumTimeToLockForUserAndProfiles(int userHandle); + void setRequiredStrongAuthTimeout(in ComponentName who, long timeMs, boolean parent); + long getRequiredStrongAuthTimeout(in ComponentName who, int userId, boolean parent); + void lockNow(boolean parent); void wipeData(int flags); @@ -306,5 +309,7 @@ interface IDevicePolicyManager { boolean isDeviceProvisioningConfigApplied(); void setDeviceProvisioningConfigApplied(); + void setBackupServiceEnabled(in ComponentName admin, boolean enabled); + boolean isBackupServiceEnabled(in ComponentName admin); boolean requireSecureKeyguard(int userHandle); } diff --git a/core/java/android/app/backup/BackupAgent.java b/core/java/android/app/backup/BackupAgent.java index 44b1487f0825f2b0d985bc82350df2bc55d2a4d1..a793d0c12ee9627765f814430664bdf8dbe8811d 100644 --- a/core/java/android/app/backup/BackupAgent.java +++ b/core/java/android/app/backup/BackupAgent.java @@ -35,6 +35,8 @@ import android.system.StructStat; import android.util.ArraySet; import android.util.Log; +import libcore.io.IoUtils; + import org.xmlpull.v1.XmlPullParserException; import java.io.File; @@ -650,10 +652,11 @@ public abstract class BackupAgent extends ContextWrapper { File file = scanQueue.remove(0); String filePath; try { - // Ignore symlinks outright + // Ignore things that aren't "real" files or dirs StructStat stat = Os.lstat(file.getPath()); - if (OsConstants.S_ISLNK(stat.st_mode)) { - if (DEBUG) Log.i(TAG, "Symlink (skipping)!: " + file); + if (!OsConstants.S_ISREG(stat.st_mode) + && !OsConstants.S_ISDIR(stat.st_mode)) { + if (DEBUG) Log.i(TAG, "Not a file/dir (skipping)!: " + file); continue; } @@ -924,6 +927,13 @@ public abstract class BackupAgent extends ContextWrapper { } catch (RemoteException e) { // we'll time out anyway, so we're safe } + + // Don't close the fd out from under the system service if this was local + if (Binder.getCallingPid() != Process.myPid()) { + IoUtils.closeQuietly(oldState); + IoUtils.closeQuietly(data); + IoUtils.closeQuietly(newState); + } } } @@ -954,6 +964,11 @@ public abstract class BackupAgent extends ContextWrapper { } catch (RemoteException e) { // we'll time out anyway, so we're safe } + + if (Binder.getCallingPid() != Process.myPid()) { + IoUtils.closeQuietly(data); + IoUtils.closeQuietly(newState); + } } } @@ -997,6 +1012,10 @@ public abstract class BackupAgent extends ContextWrapper { } catch (RemoteException e) { // we'll time out anyway, so we're safe } + + if (Binder.getCallingPid() != Process.myPid()) { + IoUtils.closeQuietly(data); + } } } @@ -1044,6 +1063,10 @@ public abstract class BackupAgent extends ContextWrapper { } catch (RemoteException e) { // we'll time out anyway, so we're safe } + + if (Binder.getCallingPid() != Process.myPid()) { + IoUtils.closeQuietly(data); + } } } diff --git a/core/java/android/app/backup/BackupManager.java b/core/java/android/app/backup/BackupManager.java index 7fcca0969f75966d7c69bc1b180f51cd5989e876..80bc1364fa58755331d0f9681bb445b3d2d345eb 100644 --- a/core/java/android/app/backup/BackupManager.java +++ b/core/java/android/app/backup/BackupManager.java @@ -128,6 +128,14 @@ public class BackupManager { @SystemApi public static final int ERROR_AGENT_FAILURE = BackupTransport.AGENT_ERROR; + /** + * Intent extra when any subsidiary backup-related UI is launched from Settings: does + * device policy or configuration permit backup operations to run at all? + * + * @hide + */ + public static final String EXTRA_BACKUP_SERVICES_AVAILABLE = "backup_services_available"; + private Context mContext; private static IBackupManager sService; diff --git a/core/java/android/app/package.html b/core/java/android/app/package.html index f37f1dcc8401df0acba9c925f3d7c54520e68f1c..b259cadc2bceb689e9317f14dd3057a2a902ebc4 100644 --- a/core/java/android/app/package.html +++ b/core/java/android/app/package.html @@ -34,7 +34,7 @@ action bar.

For information about using some the classes in this package, see the following documents: Activities, Services, Fragments, Fragments, Using the Action Bar, Creating Dialogs, and Notifying the User.

diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java index 6f2c207a59576c6291984bfa4908ca60b54917af..c43acf1591d95467d73b66451119bf8700264d02 100644 --- a/core/java/android/bluetooth/BluetoothAdapter.java +++ b/core/java/android/bluetooth/BluetoothAdapter.java @@ -770,19 +770,13 @@ public final class BluetoothAdapter { public boolean enableBLE() { if (!isBleScanAlwaysAvailable()) return false; - if (isLeEnabled() == true) { - if (DBG) Log.d(TAG, "enableBLE(): BT is already enabled..!"); - try { - mManagerService.updateBleAppCount(mToken, true); - } catch (RemoteException e) { - Log.e(TAG, "", e); - } - return true; - } - try { - if (DBG) Log.d(TAG, "Calling enableBLE"); mManagerService.updateBleAppCount(mToken, true); + if (isLeEnabled()) { + if (DBG) Log.d(TAG, "enableBLE(): Bluetooth already enabled"); + return true; + } + if (DBG) Log.d(TAG, "enableBLE(): Calling enable"); return mManagerService.enable(ActivityThread.currentPackageName()); } catch (RemoteException e) { Log.e(TAG, "", e); @@ -2055,7 +2049,7 @@ public final class BluetoothAdapter { final private IBluetoothManagerCallback mManagerCallback = new IBluetoothManagerCallback.Stub() { public void onBluetoothServiceUp(IBluetooth bluetoothService) { - if (VDBG) Log.d(TAG, "onBluetoothServiceUp: " + bluetoothService); + if (DBG) Log.d(TAG, "onBluetoothServiceUp: " + bluetoothService); mServiceLock.writeLock().lock(); mService = bluetoothService; @@ -2077,7 +2071,7 @@ public final class BluetoothAdapter { } public void onBluetoothServiceDown() { - if (VDBG) Log.d(TAG, "onBluetoothServiceDown: " + mService); + if (DBG) Log.d(TAG, "onBluetoothServiceDown: " + mService); try { mServiceLock.writeLock().lock(); @@ -2106,7 +2100,7 @@ public final class BluetoothAdapter { } public void onBrEdrDown() { - if (VDBG) Log.i(TAG, "on QBrEdrDown: "); + if (DBG) Log.i(TAG, "onBrEdrDown:"); } }; diff --git a/core/java/android/bluetooth/BluetoothDevice.java b/core/java/android/bluetooth/BluetoothDevice.java index a45be303450fcc5989659bf6ac177e8357746486..110aafe788f32683674371f3e8f0a64082cd7aae 100644 --- a/core/java/android/bluetooth/BluetoothDevice.java +++ b/core/java/android/bluetooth/BluetoothDevice.java @@ -1617,7 +1617,7 @@ public final class BluetoothDevice implements Parcelable { // BLE is not supported return null; } - BluetoothGatt gatt = new BluetoothGatt(context, iGatt, this, transport); + BluetoothGatt gatt = new BluetoothGatt(iGatt, this, transport); gatt.connect(autoConnect, callback); return gatt; } catch (RemoteException e) {Log.e(TAG, "", e);} diff --git a/core/java/android/bluetooth/BluetoothGatt.java b/core/java/android/bluetooth/BluetoothGatt.java index 800dd434a969a017c283b6630d5e5db75095c222..552c8d3b0143dc390d4bd17298aae4c4d9a7582d 100644 --- a/core/java/android/bluetooth/BluetoothGatt.java +++ b/core/java/android/bluetooth/BluetoothGatt.java @@ -41,7 +41,6 @@ public final class BluetoothGatt implements BluetoothProfile { private static final boolean DBG = true; private static final boolean VDBG = false; - private final Context mContext; private IBluetoothGatt mService; private BluetoothGattCallback mCallback; private int mClientIf; @@ -496,9 +495,8 @@ public final class BluetoothGatt implements BluetoothProfile { } }; - /*package*/ BluetoothGatt(Context context, IBluetoothGatt iGatt, BluetoothDevice device, + /*package*/ BluetoothGatt(IBluetoothGatt iGatt, BluetoothDevice device, int transport) { - mContext = context; mService = iGatt; mDevice = device; mTransport = transport; diff --git a/core/java/android/bluetooth/BluetoothGattServer.java b/core/java/android/bluetooth/BluetoothGattServer.java index f4513405b196d350693024719868114b8a7edf09..9f8d1a77a8096c43e52cb752879c39322cee2765 100644 --- a/core/java/android/bluetooth/BluetoothGattServer.java +++ b/core/java/android/bluetooth/BluetoothGattServer.java @@ -44,7 +44,6 @@ public final class BluetoothGattServer implements BluetoothProfile { private static final boolean DBG = true; private static final boolean VDBG = false; - private final Context mContext; private BluetoothAdapter mAdapter; private IBluetoothGatt mService; private BluetoothGattServerCallback mCallback; @@ -307,8 +306,7 @@ public final class BluetoothGattServer implements BluetoothProfile { /** * Create a BluetoothGattServer proxy object. */ - /*package*/ BluetoothGattServer(Context context, IBluetoothGatt iGatt, int transport) { - mContext = context; + /*package*/ BluetoothGattServer(IBluetoothGatt iGatt, int transport) { mService = iGatt; mAdapter = BluetoothAdapter.getDefaultAdapter(); mCallback = null; diff --git a/core/java/android/bluetooth/BluetoothHealthAppConfiguration.java b/core/java/android/bluetooth/BluetoothHealthAppConfiguration.java index 15a9101452edd7bfc9f818b416a9552927da6573..1717a1e36e1f69dff73ebeb130a76cafee3ea107 100644 --- a/core/java/android/bluetooth/BluetoothHealthAppConfiguration.java +++ b/core/java/android/bluetooth/BluetoothHealthAppConfiguration.java @@ -68,7 +68,9 @@ public final class BluetoothHealthAppConfiguration implements Parcelable { public boolean equals(Object o) { if (o instanceof BluetoothHealthAppConfiguration) { BluetoothHealthAppConfiguration config = (BluetoothHealthAppConfiguration) o; - // config.getName() can never be NULL + + if (mName == null) return false; + return mName.equals(config.getName()) && mDataType == config.getDataType() && mRole == config.getRole() && diff --git a/core/java/android/bluetooth/BluetoothManager.java b/core/java/android/bluetooth/BluetoothManager.java index 00058a979094f3a13dda2773e434fe54e49bdc83..29283e793ce931c15ccde9567a257d915e9f2341 100644 --- a/core/java/android/bluetooth/BluetoothManager.java +++ b/core/java/android/bluetooth/BluetoothManager.java @@ -236,7 +236,7 @@ public final class BluetoothManager { Log.e(TAG, "Fail to get GATT Server connection"); return null; } - BluetoothGattServer mGattServer = new BluetoothGattServer(context, iGatt,transport); + BluetoothGattServer mGattServer = new BluetoothGattServer(iGatt,transport); Boolean regStatus = mGattServer.registerCallback(callback); return regStatus? mGattServer : null; } catch (RemoteException e) { diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java index 1c8c69ff61ad8b3dd1019f269b5e64d2bf5b066a..8d0367dfccac585f4b063a78082995f6e72d933c 100644 --- a/core/java/android/content/ContentResolver.java +++ b/core/java/android/content/ContentResolver.java @@ -1880,6 +1880,7 @@ public abstract class ContentResolver { if (extras != null) { String accountName = extras.getString(SYNC_EXTRAS_ACCOUNT); if (!TextUtils.isEmpty(accountName)) { + // TODO: No references to Google in AOSP account = new Account(accountName, "com.google"); } extras.remove(SYNC_EXTRAS_ACCOUNT); diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 3f18ea91c99a3e9482f289fbd36742b651be2f8d..3a2f471e96ebcfd767caf99fb89e86661990d815 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -1130,7 +1130,9 @@ public abstract class Context { * Note: you should not rely on the system deleting these * files for you; you should always have a reasonable maximum, such as 1 MB, * for the amount of space you consume with cache files, and prune those - * files when exceeding that space. + * files when exceeding that space. If your app requires a larger + * cache (larger than 1 MB), you should use {@link #getExternalCacheDir()} + * instead. *

* The returned path may change over time if the calling app is moved to an * adopted storage device, so only relative paths should be persisted. @@ -1142,6 +1144,7 @@ public abstract class Context { * @see #openFileOutput * @see #getFileStreamPath * @see #getDir + * @see #getExternalCacheDir */ public abstract File getCacheDir(); @@ -1190,7 +1193,7 @@ public abstract class Context { * *

* If a shared storage device is emulated (as determined by - * {@link Environment#isExternalStorageEmulated(File)}), it's contents are + * {@link Environment#isExternalStorageEmulated(File)}), its contents are * backed by a private user data partition, which means there is little * benefit to storing data here instead of the private directory returned by * {@link #getCacheDir()}. @@ -2761,8 +2764,10 @@ public abstract class Context { *

A {@link android.net.ConnectivityManager ConnectivityManager} for * handling management of network connections. *
{@link #WIFI_SERVICE} ("wifi") - *
A {@link android.net.wifi.WifiManager WifiManager} for management of - * Wi-Fi connectivity. + *
A {@link android.net.wifi.WifiManager WifiManager} for management of Wi-Fi + * connectivity. On releases before NYC, it should only be obtained from an application + * context, and not from any other derived context to avoid memory leaks within the calling + * process. *
{@link #WIFI_P2P_SERVICE} ("wifip2p") *
A {@link android.net.wifi.p2p.WifiP2pManager WifiP2pManager} for management of * Wi-Fi Direct connectivity. diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 659cd689417c71322c09c68b7bfee96ab2bda960..861aae5a8794047f0a784baf531bb595e4bb78d4 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -128,7 +128,7 @@ import static android.content.ContentProvider.maybeAddUserId; * a list of people, which the user can browse through. This example is a * typical top-level entry into the Contacts application, showing you the * list of people. Selecting a particular person to view would result in a - * new intent { {@link #ACTION_VIEW} content://contacts/N } + * new intent { {@link #ACTION_VIEW} content://contacts/people/N } * being used to start an activity to display that person.

* * @@ -4329,6 +4329,14 @@ public class Intent implements Parcelable, Cloneable { */ public static final int FLAG_DEBUG_TRIAGED_MISSING = 0x00000100; + /** + * Internal flag used to indicate ephemeral applications should not be + * considered when resolving the intent. + * + * @hide + */ + public static final int FLAG_IGNORE_EPHEMERAL = 0x00000200; + /** * If set, the new activity is not kept in the history stack. As soon as * the user navigates away from it, the activity is finished. This may also @@ -6581,7 +6589,7 @@ public class Intent implements Parcelable, Cloneable { */ public void removeUnsafeExtras() { if (mExtras != null) { - mExtras.filterValues(); + mExtras = mExtras.filterValues(); } } diff --git a/core/java/android/content/IntentFilter.java b/core/java/android/content/IntentFilter.java index 22ab43bbb42921315f63d713e8ca92ead790a886..f5a79c8c13eb33dc3d1ee4e8efbbf69fa37463a4 100644 --- a/core/java/android/content/IntentFilter.java +++ b/core/java/android/content/IntentFilter.java @@ -124,7 +124,7 @@ import java.util.Set; * Note that authority matching here is case sensitive, unlike * formal RFC host names! You should thus always use lower case letters * for your authority. - * + * *

Data Path matches if any of the given values match the * Intent's data path and both a scheme and authority in the filter * has matched against the Intent, or no paths were supplied in the @@ -265,6 +265,7 @@ public class IntentFilter implements Parcelable { public static final String SCHEME_HTTPS = "https"; private int mPriority; + private int mOrder; private final ArrayList mActions; private ArrayList mCategories = null; private ArrayList mDataSchemes = null; @@ -358,8 +359,8 @@ public class IntentFilter implements Parcelable { * the {@link MalformedMimeTypeException} exception that the constructor * can call and turns it into a runtime exception. * - * @param action The action to match, i.e. Intent.ACTION_VIEW. - * @param dataType The type to match, i.e. "vnd.android.cursor.dir/person". + * @param action The action to match, such as Intent.ACTION_VIEW. + * @param dataType The type to match, such as "vnd.android.cursor.dir/person". * * @return A new IntentFilter for the given action and type. * @@ -386,7 +387,7 @@ public class IntentFilter implements Parcelable { * no data characteristics are subsequently specified, then the * filter will only match intents that contain no data. * - * @param action The action to match, i.e. Intent.ACTION_MAIN. + * @param action The action to match, such as Intent.ACTION_MAIN. */ public IntentFilter(String action) { mPriority = 0; @@ -406,8 +407,8 @@ public class IntentFilter implements Parcelable { *

Throws {@link MalformedMimeTypeException} if the given MIME type is * not syntactically correct. * - * @param action The action to match, i.e. Intent.ACTION_VIEW. - * @param dataType The type to match, i.e. "vnd.android.cursor.dir/person". + * @param action The action to match, such as Intent.ACTION_VIEW. + * @param dataType The type to match, such as "vnd.android.cursor.dir/person". * */ public IntentFilter(String action, String dataType) @@ -425,6 +426,7 @@ public class IntentFilter implements Parcelable { */ public IntentFilter(IntentFilter o) { mPriority = o.mPriority; + mOrder = o.mOrder; mActions = new ArrayList(o.mActions); if (o.mCategories != null) { mCategories = new ArrayList(o.mCategories); @@ -477,6 +479,16 @@ public class IntentFilter implements Parcelable { return mPriority; } + /** @hide */ + public final void setOrder(int order) { + mOrder = order; + } + + /** @hide */ + public final int getOrder() { + return mOrder; + } + /** * Set whether this filter will needs to be automatically verified against its data URIs or not. * The default is false. @@ -640,7 +652,7 @@ public class IntentFilter implements Parcelable { * in the filter, then an Intent's action must be one of those values for * it to match. If no actions are included, the Intent action is ignored. * - * @param action Name of the action to match, i.e. Intent.ACTION_VIEW. + * @param action Name of the action to match, such as Intent.ACTION_VIEW. */ public final void addAction(String action) { if (!mActions.contains(action)) { @@ -709,7 +721,7 @@ public class IntentFilter implements Parcelable { *

Throws {@link MalformedMimeTypeException} if the given MIME type is * not syntactically correct. * - * @param type Name of the data type to match, i.e. "vnd.android.cursor.dir/person". + * @param type Name of the data type to match, such as "vnd.android.cursor.dir/person". * * @see #matchData */ @@ -786,7 +798,7 @@ public class IntentFilter implements Parcelable { * and any schemes you receive from outside of Android should be * converted to lower case before supplying them here.

* - * @param scheme Name of the scheme to match, i.e. "http". + * @param scheme Name of the scheme to match, such as "http". * * @see #matchData */ @@ -897,7 +909,7 @@ public class IntentFilter implements Parcelable { * Determine whether this AuthorityEntry matches the given data Uri. * Note that this comparison is case-sensitive, unlike formal * RFC host names. You thus should always normalize to lower-case. - * + * * @param data The Uri to match. * @return Returns either {@link IntentFilter#NO_MATCH_DATA}, * {@link IntentFilter#MATCH_CATEGORY_PORT}, or @@ -1352,7 +1364,7 @@ public class IntentFilter implements Parcelable { * filter has no impact on matching unless that category is specified in * the intent. * - * @param category Name of category to match, i.e. Intent.CATEGORY_EMBED. + * @param category Name of category to match, such as Intent.CATEGORY_EMBED. */ public final void addCategory(String category) { if (mCategories == null) mCategories = new ArrayList(); diff --git a/core/java/android/content/SyncAdapterType.java b/core/java/android/content/SyncAdapterType.java index 8a16ac94522ebdd3b2bc0a58a1af58f48ed6a670..6ef7fd214069bf7d9858bb2203593839549a20b7 100644 --- a/core/java/android/content/SyncAdapterType.java +++ b/core/java/android/content/SyncAdapterType.java @@ -16,6 +16,7 @@ package android.content; +import android.annotation.Nullable; import android.text.TextUtils; import android.os.Parcelable; import android.os.Parcel; @@ -33,6 +34,7 @@ public class SyncAdapterType implements Parcelable { private final boolean isAlwaysSyncable; private final boolean allowParallelSyncs; private final String settingsActivity; + private final String packageName; public SyncAdapterType(String authority, String accountType, boolean userVisible, boolean supportsUploading) { @@ -50,6 +52,7 @@ public class SyncAdapterType implements Parcelable { this.allowParallelSyncs = false; this.settingsActivity = null; this.isKey = false; + this.packageName = null; } /** @hide */ @@ -57,7 +60,8 @@ public class SyncAdapterType implements Parcelable { boolean supportsUploading, boolean isAlwaysSyncable, boolean allowParallelSyncs, - String settingsActivity) { + String settingsActivity, + String packageName) { if (TextUtils.isEmpty(authority)) { throw new IllegalArgumentException("the authority must not be empty: " + authority); } @@ -72,6 +76,7 @@ public class SyncAdapterType implements Parcelable { this.allowParallelSyncs = allowParallelSyncs; this.settingsActivity = settingsActivity; this.isKey = false; + this.packageName = packageName; } private SyncAdapterType(String authority, String accountType) { @@ -89,6 +94,7 @@ public class SyncAdapterType implements Parcelable { this.allowParallelSyncs = false; this.settingsActivity = null; this.isKey = true; + this.packageName = null; } public boolean supportsUploading() { @@ -148,6 +154,16 @@ public class SyncAdapterType implements Parcelable { return settingsActivity; } + /** + * The package hosting the sync adapter. + * @return The package name. + * + * @hide + */ + public @Nullable String getPackageName() { + return packageName; + } + public static SyncAdapterType newKey(String authority, String accountType) { return new SyncAdapterType(authority, accountType); } @@ -181,6 +197,7 @@ public class SyncAdapterType implements Parcelable { + ", isAlwaysSyncable=" + isAlwaysSyncable + ", allowParallelSyncs=" + allowParallelSyncs + ", settingsActivity=" + settingsActivity + + ", packageName=" + packageName + "}"; } } @@ -201,6 +218,7 @@ public class SyncAdapterType implements Parcelable { dest.writeInt(isAlwaysSyncable ? 1 : 0); dest.writeInt(allowParallelSyncs ? 1 : 0); dest.writeString(settingsActivity); + dest.writeString(packageName); } public SyncAdapterType(Parcel source) { @@ -211,6 +229,7 @@ public class SyncAdapterType implements Parcelable { source.readInt() != 0, source.readInt() != 0, source.readInt() != 0, + source.readString(), source.readString()); } diff --git a/core/java/android/content/SyncAdaptersCache.java b/core/java/android/content/SyncAdaptersCache.java index 6704b75dff7f306634d0e8a2c515a7cc6bb6c1d5..ddbdb8a7a559b965dd63894065bd2dd51156a6c7 100644 --- a/core/java/android/content/SyncAdaptersCache.java +++ b/core/java/android/content/SyncAdaptersCache.java @@ -81,7 +81,7 @@ public class SyncAdaptersCache extends RegisteredServicesCache sa.getString(com.android.internal.R.styleable .SyncAdapter_settingsActivity); return new SyncAdapterType(authority, accountType, userVisible, supportsUploading, - isAlwaysSyncable, allowParallelSyncs, settingsActivity); + isAlwaysSyncable, allowParallelSyncs, settingsActivity, packageName); } finally { sa.recycle(); } diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 3e84a8179e633c4c4592a93dbc7a50238023ead6..0263431f9950e48902c3809eb9bb1d74662bb226 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -5445,7 +5445,7 @@ public abstract class PackageManager { * {@link #COMPONENT_ENABLED_STATE_DISABLED}, or * {@link #COMPONENT_ENABLED_STATE_DEFAULT}. The last one means the * application's enabled state is based on the original information in - * the manifest as found in {@link ComponentInfo}. + * the manifest as found in {@link ApplicationInfo}. * @throws IllegalArgumentException if the named package does not exist. */ public abstract int getApplicationEnabledSetting(String packageName); diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java index d208fe7c10ca1c5f8bac3b1daba4d68313866ad1..f5bcf64417a666a9d7e2ec949ab486dbdd0c73d7 100644 --- a/core/java/android/content/pm/PackageManagerInternal.java +++ b/core/java/android/content/pm/PackageManagerInternal.java @@ -160,4 +160,12 @@ public abstract class PackageManagerInternal { * Returns {@code true} if a given package can't be wiped. Otherwise, returns {@code false}. */ public abstract boolean isPackageDataProtected(int userId, String packageName); + + /** + * Gets whether the package was ever launched. + * @param packageName The package name. + * @param userId The user for which to check. + * @return Whether was launched. + */ + public abstract boolean wasPackageEverLaunched(String packageName, int userId); } diff --git a/core/java/android/content/pm/ResolveInfo.java b/core/java/android/content/pm/ResolveInfo.java index c9be6edab424c0e381cc6f7a4735f0da20abbfca..b5df4d75a2384a39aec1aefcda047fc6ebd654fa 100644 --- a/core/java/android/content/pm/ResolveInfo.java +++ b/core/java/android/content/pm/ResolveInfo.java @@ -67,12 +67,6 @@ public class ResolveInfo implements Parcelable { */ public EphemeralResolveInfo ephemeralResolveInfo; - /** - * A ResolveInfo that points at the ephemeral installer. - * @hide - */ - public ResolveInfo ephemeralInstaller; - /** * The IntentFilter that was matched for this ResolveInfo. */ diff --git a/core/java/android/content/pm/ShortcutInfo.java b/core/java/android/content/pm/ShortcutInfo.java index ed0ac53861764dc4f2d6b0814a8f60f19f34bf9b..a854b899a82af4f5a6a0a168ac077a6099cc7606 100644 --- a/core/java/android/content/pm/ShortcutInfo.java +++ b/core/java/android/content/pm/ShortcutInfo.java @@ -46,7 +46,7 @@ import java.util.List; import java.util.Set; /** - * Represents a "launcher shortcut" that can be published via {@link ShortcutManager}. + * Represents a shortcut that can be published via {@link ShortcutManager}. * * @see ShortcutManager */ @@ -776,17 +776,17 @@ public final class ShortcutInfo implements Parcelable { * activity is published using * {@link ShortcutManager#addDynamicShortcuts(List)} or * {@link ShortcutManager#setDynamicShortcuts(List)}, - * the first main activity defined in the application's AndroidManifest.xml + * the first main activity defined in the app's AndroidManifest.xml * file is used. * *
  • Only "main" activities—ones that define the {@link Intent#ACTION_MAIN} * and {@link Intent#CATEGORY_LAUNCHER} intent filters—can be target * activities. * - *
  • By default, the first main activity defined in the application manifest is + *
  • By default, the first main activity defined in the app's manifest is * the target activity. * - *
  • A target activity must belong to the publisher application. + *
  • A target activity must belong to the publisher app. * * * @see ShortcutInfo#getActivity() @@ -802,7 +802,7 @@ public final class ShortcutInfo implements Parcelable { * *

    Icons are not available on {@link ShortcutInfo} instances * returned by {@link ShortcutManager} or {@link LauncherApps}. The default launcher - * application can use {@link LauncherApps#getShortcutIconDrawable(ShortcutInfo, int)} + * app can use {@link LauncherApps#getShortcutIconDrawable(ShortcutInfo, int)} * or {@link LauncherApps#getShortcutBadgedIconDrawable(ShortcutInfo, int)} to fetch * shortcut icons. * @@ -933,8 +933,8 @@ public final class ShortcutInfo implements Parcelable { } /** - * Sets categories for a shortcut. Launcher applications may use this information to - * categorise shortcuts. + * Sets categories for a shortcut. Launcher apps may use this information to + * categorize shortcuts. * * @see #SHORTCUT_CATEGORY_CONVERSATION * @see ShortcutInfo#getCategories() @@ -953,9 +953,9 @@ public final class ShortcutInfo implements Parcelable { * {@link ShortcutManager#addDynamicShortcuts(List)} or * {@link ShortcutManager#setDynamicShortcuts(List)}. * - *

    A shortcut can launch any intent that the publisher application has permission to + *

    A shortcut can launch any intent that the publisher app has permission to * launch. For example, a shortcut can launch an unexported activity within the publisher - * application. A shortcut intent doesn't have to point at the target activity. + * app. A shortcut intent doesn't have to point at the target activity. * *

    The given {@code intent} can contain extras, but these extras must contain values * of primitive types in order for the system to persist these values. @@ -970,7 +970,9 @@ public final class ShortcutInfo implements Parcelable { /** * Sets multiple intents instead of a single intent, in order to launch an activity with - * other activities in back stack. Use {@link TaskStackBuilder} to build intents. + * other activities in back stack. Use {@link TaskStackBuilder} to build intents. The + * last element in the list represents the only intent that doesn't place an activity on + * the back stack. * See the {@link ShortcutManager} javadoc for details. * * @see Builder#setIntent(Intent) @@ -1006,9 +1008,9 @@ public final class ShortcutInfo implements Parcelable { } /** - * Extras that application can set for any purpose. + * Extras that the app can set for any purpose. * - *

    Applications can store arbitrary shortcut metadata in extras and retrieve the + *

    Apps can store arbitrary shortcut metadata in extras and retrieve the * metadata later using {@link ShortcutInfo#getExtras()}. */ @NonNull @@ -1029,7 +1031,7 @@ public final class ShortcutInfo implements Parcelable { /** * Returns the ID of a shortcut. * - *

    Shortcut IDs are unique within each publisher application and must be stable across + *

    Shortcut IDs are unique within each publisher app and must be stable across * devices so that shortcuts will still be valid when restored on a different device. * See {@link ShortcutManager} for details. */ @@ -1039,7 +1041,7 @@ public final class ShortcutInfo implements Parcelable { } /** - * Return the package name of the publisher application. + * Return the package name of the publisher app. */ @NonNull public String getPackage() { @@ -1050,7 +1052,7 @@ public final class ShortcutInfo implements Parcelable { * Return the target activity. * *

    This has nothing to do with the activity that this shortcut will launch. - * Launcher applications should show the launcher icon for the returned activity alongside + * Launcher apps should show the launcher icon for the returned activity alongside * this shortcut. * * @see Builder#setActivity @@ -1102,7 +1104,7 @@ public final class ShortcutInfo implements Parcelable { } /** - * Return the shorter description of a shortcut. + * Return the short description of a shortcut. * * @see Builder#setShortLabel(CharSequence) */ @@ -1117,7 +1119,7 @@ public final class ShortcutInfo implements Parcelable { } /** - * Return the longer description of a shortcut. + * Return the long description of a shortcut. * * @see Builder#setLongLabel(CharSequence) */ @@ -1161,7 +1163,7 @@ public final class ShortcutInfo implements Parcelable { * Returns the intent that is executed when the user selects this shortcut. * If setIntents() was used, then return the last intent in the array. * - *

    Launcher applications cannot see the intent. If a {@link ShortcutInfo} is + *

    Launcher apps cannot see the intent. If a {@link ShortcutInfo} is * obtained via {@link LauncherApps}, then this method will always return null. * Launchers can only start a shortcut intent with {@link LauncherApps#startShortcut}. * @@ -1180,7 +1182,7 @@ public final class ShortcutInfo implements Parcelable { /** * Return the intent set with {@link Builder#setIntents(Intent[])}. * - *

    Launcher applications cannot see the intents. If a {@link ShortcutInfo} is + *

    Launcher apps cannot see the intents. If a {@link ShortcutInfo} is * obtained via {@link LauncherApps}, then this method will always return null. * Launchers can only start a shortcut intent with {@link LauncherApps#startShortcut}. * @@ -1219,15 +1221,15 @@ public final class ShortcutInfo implements Parcelable { /** * "Rank" of a shortcut, which is a non-negative, sequential value that's unique for each - * {@link #getActivity} for each of the two kinds, dynamic shortcuts and manifest shortcuts. + * {@link #getActivity} for each of the two types of shortcuts (static and dynamic). * - *

    Because manifest shortcuts and dynamic shortcuts have overlapping ranks, - * when a launcher application shows shortcuts for an activity, it should first show - * the manifest shortcuts followed by the dynamic shortcuts. Within each of those categories, + *

    Because static shortcuts and dynamic shortcuts have overlapping ranks, + * when a launcher app shows shortcuts for an activity, it should first show + * the static shortcuts, followed by the dynamic shortcuts. Within each of those categories, * shortcuts should be sorted by rank in ascending order. * - *

    "Floating" shortcuts (i.e. shortcuts that are neither dynamic nor manifest) will all - * have rank 0, because there's no sorting for them. + *

    Floating shortcuts, or shortcuts that are neither static nor dynamic, will all + * have rank 0, because they aren't sorted. * * See the {@link ShortcutManager}'s class javadoc for details. * @@ -1274,7 +1276,7 @@ public final class ShortcutInfo implements Parcelable { } /** - * Extras that application can set to any purposes. + * Extras that the app can set for any purpose. * * @see Builder#setExtras(PersistableBundle) */ @@ -1339,12 +1341,13 @@ public final class ShortcutInfo implements Parcelable { } /** - * Return whether a shortcut is published from AndroidManifest.xml or not. If {@code true}, - * it's also {@link #isImmutable()}. + * Return whether a shortcut is static; that is, whether a shortcut is + * published from AndroidManifest.xml. If {@code true}, the shortcut is + * also {@link #isImmutable()}. * *

    When an app is upgraded and a shortcut is no longer published from AndroidManifest.xml, - * this will be set to {@code false}. If the shortcut is not pinned, then it'll just disappear. - * However, if it's pinned, it will still be alive, and {@link #isEnabled()} will be + * this will be set to {@code false}. If the shortcut is not pinned, then it'll disappear. + * However, if it's pinned, it will still be visible, {@link #isEnabled()} will be * {@code false} and {@link #isImmutable()} will be {@code true}. */ public boolean isDeclaredInManifest() { @@ -1358,7 +1361,7 @@ public final class ShortcutInfo implements Parcelable { } /** - * @return true if pinned but neither dynamic nor manifest. + * @return true if pinned but neither static nor dynamic. * @hide */ public boolean isFloating() { @@ -1374,9 +1377,10 @@ public final class ShortcutInfo implements Parcelable { * Return if a shortcut is immutable, in which case it cannot be modified with any of * {@link ShortcutManager} APIs. * - *

    All manifest shortcuts are immutable. When a manifest shortcut is pinned and then - * disabled because the app is upgraded and its AndroidManifest.xml no longer publishes it, - * {@link #isDeclaredInManifest()} returns {@code false}, but it is still immutable. + *

    All static shortcuts are immutable. When a static shortcut is pinned and is then + * disabled because it doesn't appear in AndroidManifest.xml for a newer version of the + * app, {@link #isDeclaredInManifest()} returns {@code false}, but the shortcut + * is still immutable. * *

    All shortcuts originally published via the {@link ShortcutManager} APIs * are all mutable. @@ -1561,7 +1565,7 @@ public final class ShortcutInfo implements Parcelable { } /** - * Replaces the intent + * Replaces the intent. * * @throws IllegalArgumentException when extra is not compatible with {@link PersistableBundle}. * diff --git a/core/java/android/content/pm/ShortcutManager.java b/core/java/android/content/pm/ShortcutManager.java index cd248ea4e981ac2653b6f63bd62fc2073b07ced5..a93870ece823a26579fc9df82842416f89168067 100644 --- a/core/java/android/content/pm/ShortcutManager.java +++ b/core/java/android/content/pm/ShortcutManager.java @@ -31,87 +31,90 @@ import com.android.internal.annotations.VisibleForTesting; import java.util.List; /** - * The ShortcutManager manages "launcher shortcuts" (or simply "shortcuts"). Shortcuts provide - * users - * with quick access to activities other than an application's main activity in the currently-active + * The ShortcutManager manages an app's shortcuts. Shortcuts provide users + * with quick access to activities other than an app's main activity in the currently-active * launcher. For example, - * an email application may publish the "compose new email" action, which will directly open the + * an email app may publish the "compose new email" action, which will directly open the * compose activity. The {@link ShortcutInfo} class contains information about each of the * shortcuts themselves. * - *

    Dynamic Shortcuts and Manifest Shortcuts

    + *

    Static Shortcuts and Dynamic Shortcuts

    * - * There are two ways to publish shortcuts: manifest shortcuts and dynamic shortcuts. + *

    + * There are two ways to publish shortcuts: static shortcuts and dynamic shortcuts. * *

      - *
    • Manifest shortcuts are declared in a resource - * XML, which is referenced in the publisher application's AndroidManifest.xml file. - * Manifest shortcuts are published when an application is installed, - * and the details of these shortcuts change when an application is upgraded with an updated XML + *
    • Static shortcuts are declared in a resource + * XML file, which is referenced in the publisher app's AndroidManifest.xml file. + * Static shortcuts are published when an app is installed, + * and the details of these shortcuts change when an app is upgraded with an updated XML * file. - * Manifest shortcuts are immutable, and their + * Static shortcuts are immutable, and their * definitions, such as icons and labels, cannot be changed dynamically without upgrading the - * publisher application. + * publisher app. * - *
    • Dynamic shortcuts are published at runtime using the {@link ShortcutManager} APIs. - * Applications can publish, update, and remove dynamic shortcuts at runtime. + *
    • Dynamic shortcuts are published at runtime using this class's APIs. + * Apps can publish, update, and remove dynamic shortcuts at runtime. *
    * - *

    Only "main" activities—activities that handle the {@code MAIN} action and the + *

    Only main activities—activities that handle the {@code MAIN} action and the * {@code LAUNCHER} category—can have shortcuts. - * If an application has multiple main activities, these activities will have different sets + * If an app has multiple main activities, these activities have different sets * of shortcuts. * - *

    Dynamic shortcuts and manifest shortcuts are shown in the currently active launcher when - * the user long-presses on an application launcher icon. The actual gesture may be different - * depending on the launcher application. + *

    Static shortcuts and dynamic shortcuts are shown in the currently active launcher when + * the user long-presses on an app's launcher icon. + * + *

    Note: The actual gesture may be different + * depending on the launcher app. * *

    Each launcher icon can have at most {@link #getMaxShortcutCountPerActivity()} number of - * dynamic and manifest shortcuts combined. + * static and dynamic shortcuts combined. * * *

    Pinning Shortcuts

    * - * Launcher applications allow users to "pin" shortcuts so they're easier to access. Both manifest + *

    + * Launcher apps allow users to pin shortcuts so they're easier to access. Both static * and dynamic shortcuts can be pinned. * Pinned shortcuts cannot be removed by publisher - * applications; they're removed only when the user removes them, - * when the publisher application is uninstalled, or when the - * user performs the "clear data" action on the publisher application from the device's Settings - * application. + * apps; they're removed only when the user removes them, + * when the publisher app is uninstalled, or when the + * user performs the clear data action on the publisher app from the device's Settings + * app. * - *

    However, the publisher application can disable pinned shortcuts so they cannot be + *

    However, the publisher app can disable pinned shortcuts so they cannot be * started. See the following sections for details. * * *

    Updating and Disabling Shortcuts

    * *

    When a dynamic shortcut is pinned, even when the publisher removes it as a dynamic shortcut, - * the pinned shortcut will still be visible and launchable. This allows an application to have + * the pinned shortcut will still be visible and launchable. This allows an app to have * more than {@link #getMaxShortcutCountPerActivity()} number of shortcuts. * *

    For example, suppose {@link #getMaxShortcutCountPerActivity()} is 5: - *

      - *
    • A chat application publishes 5 dynamic shortcuts for the 5 most recent - * conversations, "c1" - "c5". + *
        + *
      1. A chat app publishes 5 dynamic shortcuts for the 5 most recent + * conversations (c1, c2, ..., c5). * *
      2. The user pins all 5 of the shortcuts. * - *
      3. Later, the user has started 3 additional conversations ("c6", "c7", and "c8"), - * so the publisher application + *
      4. Later, the user has started 3 additional conversations (c6, c7, and c8), + * so the publisher app * re-publishes its dynamic shortcuts. The new dynamic shortcut list is: - * "c4", "c5", "c6", "c7", and "c8". - * The publisher application has to remove "c1", "c2", and "c3" because it can't have more than + * c4, c5, ..., c8. + * The publisher app has to remove c1, c2, and c3 because it can't have more than * 5 dynamic shortcuts. * - *
      5. However, even though "c1", "c2" and "c3" are no longer dynamic shortcuts, the pinned + *
      6. However, even though c1, c2, and c3 are no longer dynamic shortcuts, the pinned * shortcuts for these conversations are still available and launchable. * *
      7. At this point, the user can access a total of 8 shortcuts that link to activities in - * the publisher application, including the 3 pinned - * shortcuts, even though it's allowed to have at most 5 dynamic shortcuts. + * the publisher app, including the 3 pinned + * shortcuts, even though an app can have at most 5 dynamic shortcuts. * - *
      8. The application can use {@link #updateShortcuts(List)} to update any of the existing + *
      9. The app can use {@link #updateShortcuts(List)} to update any of the existing * 8 shortcuts, when, for example, the chat peers' icons have changed. *
    * The {@link #addDynamicShortcuts(List)} and {@link #setDynamicShortcuts(List)} methods @@ -121,104 +124,108 @@ import java.util.List; * lists of shortcuts to dynamic shortcuts. * * - *

    Disabling Manifest Shortcuts

    - * When an application is upgraded and the new version - * no longer uses a manifest shortcut that appeared in the previous version, this deprecated - * shortcut will no longer be published as a manifest shortcut. + *

    Disabling Static Shortcuts

    + * When an app is upgraded and the new version + * no longer uses a static shortcut that appeared in the previous version, this deprecated + * shortcut will no longer be published as a static shortcut. * *

    If the deprecated shortcut is pinned, then the pinned shortcut will remain on the launcher, * but it will be disabled automatically. - * Note that, in this case, the pinned shortcut is no longer a manifest shortcut, but it's - * still immutable and cannot be updated using the {@link ShortcutManager} APIs. + * Note that, in this case, the pinned shortcut is no longer a static shortcut, but it's + * still immutable. Therefore, it cannot be updated using this class's APIs. * * *

    Disabling Dynamic Shortcuts

    * Sometimes pinned shortcuts become obsolete and may not be usable. For example, a pinned shortcut - * to a group chat will be unusable when the associated group chat is deleted. In cases like this, - * applications should use {@link #disableShortcuts(List)}, which will remove the specified dynamic - * shortcuts and also make any specified pinned shortcuts un-launchable. + * to a group chat becomes unusable when the associated group chat is deleted. In cases like this, + * apps should use {@link #disableShortcuts(List)}, which removes the specified dynamic + * shortcuts and also makes any specified pinned shortcuts un-launchable. * The {@link #disableShortcuts(List, CharSequence)} method can also be used to disabled shortcuts * and show users a custom error message when they attempt to launch the disabled shortcuts. * * - *

    Publishing Manifest Shortcuts

    + *

    Publishing Static Shortcuts

    * - * In order to add manifest shortcuts to your application, first add + *

    + * In order to add static shortcuts to your app, first add * {@code } to your main activity in * AndroidManifest.xml: *

    - * <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    - *   package="com.example.myapplication">
    - *   <application . . .>
    - *     <activity android:name="Main">
    - *       <intent-filter>
    - *         <action android:name="android.intent.action.MAIN" />
    - *         <category android:name="android.intent.category.LAUNCHER" />
    - *       </intent-filter>
    - *       <meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts"/>
    - *     </activity>
    - *   </application>
    - * </manifest>
    + *<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    + *             package="com.example.myapplication">
    + *  <application ... >
    + *    <activity android:name="Main">
    + *      <intent-filter>
    + *        <action android:name="android.intent.action.MAIN" />
    + *        <category android:name="android.intent.category.LAUNCHER" />
    + *      </intent-filter>
    + *      <meta-data android:name="android.app.shortcuts"
    + *                 android:resource="@xml/shortcuts" />
    + *    </activity>
    + *  </application>
    + *</manifest>
      * 
    * - * Then, define your application's manifest shortcuts in the res/xml/shortcuts.xml + * Then, define your app's static shortcuts in the res/xml/shortcuts.xml * file: *
    - * <shortcuts xmlns:android="http://schemas.android.com/apk/res/android" >
    - *   <shortcut
    - *     android:shortcutId="compose"
    - *     android:enabled="true"
    - *     android:icon="@drawable/compose_icon"
    - *     android:shortcutShortLabel="@string/compose_shortcut_short_label1"
    - *     android:shortcutLongLabel="@string/compose_shortcut_long_label1"
    - *     android:shortcutDisabledMessage="@string/compose_disabled_message1"
    - *     >
    - *     <intent
    - *       android:action="android.intent.action.VIEW"
    - *       android:targetPackage="com.example.myapplication"
    - *       android:targetClass="com.example.myapplication.ComposeActivity" />
    - *     <!-- more intents can go here; see below -->
    - *     <categories android:name="android.shortcut.conversation" />
    - *   </shortcut>
    - *   <!-- more shortcuts can go here -->
    - * </shortcuts>
    + *<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
    + *  <shortcut
    + *    android:shortcutId="compose"
    + *    android:enabled="true"
    + *    android:icon="@drawable/compose_icon"
    + *    android:shortcutShortLabel="@string/compose_shortcut_short_label1"
    + *    android:shortcutLongLabel="@string/compose_shortcut_long_label1"
    + *    android:shortcutDisabledMessage="@string/compose_disabled_message1">
    + *    <intent
    + *      android:action="android.intent.action.VIEW"
    + *      android:targetPackage="com.example.myapplication"
    + *      android:targetClass="com.example.myapplication.ComposeActivity" />
    + *    <!-- If your shortcut is associated with multiple intents, include them
    + *         here. The last intent in the list is what the user sees when they
    + *         launch this shortcut. -->
    + *    <categories android:name="android.shortcut.conversation" />
    + *  </shortcut>
    + *  <!-- Specify more shortcuts here. -->
    + *</shortcuts>
      * 
    * - * The following list includes descriptions for the different attributes within a manifest shortcut: + * The following list includes descriptions for the different attributes within a static shortcut: *
    - *
    android:shortcutId
    + *
    {@code android:shortcutId}
    *
    Mandatory shortcut ID
    * - *
    android:enabled
    + *
    {@code android:enabled}
    *
    Default is {@code true}. Can be set to {@code false} in order - * to disable a manifest shortcut that was published in a previous version and and set a custom - * disabled message. If a custom disabled message is not needed, then a manifest shortcut can + * to disable a static shortcut that was published in a previous version and set a custom + * disabled message. If a custom disabled message is not needed, then a static shortcut can * be simply removed from the XML file rather than keeping it with {@code enabled="false"}.
    * - *
    android:icon
    + *
    {@code android:icon}
    *
    Shortcut icon.
    * - *
    android:shortcutShortLabel
    + *
    {@code android:shortcutShortLabel}
    *
    Mandatory shortcut short label. * See {@link ShortcutInfo.Builder#setShortLabel(CharSequence)}.
    * - *
    android:shortcutLongLabel
    + *
    {@code android:shortcutLongLabel}
    *
    Shortcut long label. * See {@link ShortcutInfo.Builder#setLongLabel(CharSequence)}.
    * - *
    android:shortcutDisabledMessage
    + *
    {@code android:shortcutDisabledMessage}
    *
    When {@code android:enabled} is set to * {@code false}, this attribute is used to display a custom disabled message.
    * - *
    intent
    + *
    {@code intent}
    *
    Intent to launch when the user selects the shortcut. * {@code android:action} is mandatory. * See Using intents for the * other supported tags. - * You can provide multiple intents for a single shortcut so that an activity is launched - * with other activities in the back stack. See {@link android.app.TaskStackBuilder} for details. + * You can provide multiple intents for a single shortcut so that the last defined activity is launched + * with the other activities in the back stack. + * See {@link android.app.TaskStackBuilder} for details. *
    - *
    categories
    + *
    {@code categories}
    *
    Specify shortcut categories. Currently only * {@link ShortcutInfo#SHORTCUT_CATEGORY_CONVERSATION} is defined in the framework. *
    @@ -226,64 +233,68 @@ import java.util.List; * *

    Publishing Dynamic Shortcuts

    * - * Applications can publish dynamic shortcuts with {@link #setDynamicShortcuts(List)} + *

    + * Apps can publish dynamic shortcuts with {@link #setDynamicShortcuts(List)} * or {@link #addDynamicShortcuts(List)}. The {@link #updateShortcuts(List)} method can also be * used to update existing, mutable shortcuts. * Use {@link #removeDynamicShortcuts(List)} or {@link #removeAllDynamicShortcuts()} to remove * dynamic shortcuts. * - *

    Example: + *

    The following code snippet shows how to create a single dynamic shortcut: *

    - * ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
    + *ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
      *
    - * ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "id1")
    - *     .setIntent(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.mysite.com/")))
    - *     .setShortLabel("Web site")
    - *     .setLongLabel("Open the web site")
    - *     .setIcon(Icon.createWithResource(context, R.drawable.icon_website))
    - *     .build();
    + *ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "id1")
    + *    .setShortLabel("Web site")
    + *    .setLongLabel("Open the web site")
    + *    .setIcon(Icon.createWithResource(context, R.drawable.icon_website))
    + *    .setIntent(new Intent(Intent.ACTION_VIEW,
    + *                   Uri.parse("https://www.mysite.example.com/")))
    + *    .build();
      *
    - * shortcutManager.setDynamicShortcuts(Arrays.asList(shortcut));
    + *shortcutManager.setDynamicShortcuts(Arrays.asList(shortcut));
      * 
    * * *

    Shortcut Intents

    + *

    * Dynamic shortcuts can be published with any set of {@link Intent#addFlags Intent} flags. * Typically, {@link Intent#FLAG_ACTIVITY_CLEAR_TASK} is specified, possibly along with other - * flags; otherwise, if the application is already running, the application is simply brought to + * flags; otherwise, if the app is already running, the app is simply brought to * the foreground, and the target activity may not appear. * *

    The {@link ShortcutInfo.Builder#setIntents(Intent[])} method can be used instead of * {@link ShortcutInfo.Builder#setIntent(Intent)} with {@link android.app.TaskStackBuilder} * in order to launch an activity with other activities in the back stack. * When the user selects a shortcut to load an activity with a back stack, - * then presses the back key, a "parent" activity will be shown instead of the user being - * navigated back to the launcher. + * then presses the back key, a parent activity from the same app will be shown + * instead of the user being navigated back to the launcher. * - *

    Manifest shortcuts can also have multiple intents to achieve the same effect. + *

    Static shortcuts can also have multiple intents to achieve the same effect. * In order to associate multiple {@link Intent} objects with a shortcut, simply list multiple * <intent> elements within a single <shortcut> element. - * The last intent specifies what the user will see when they launch a shortcut. + * The last intent specifies what the user sees when they launch a shortcut. * - *

    Manifest shortcuts cannot have custom intent flags. - * The first intent of a manifest shortcut will always have {@link Intent#FLAG_ACTIVITY_NEW_TASK} + *

    Static shortcuts cannot have custom intent flags. + * The first intent of a static shortcut will always have {@link Intent#FLAG_ACTIVITY_NEW_TASK} * and {@link Intent#FLAG_ACTIVITY_CLEAR_TASK} set. - * This means, when the application is already running, all the existing activities will be - * destroyed when a manifest shortcut is launched. + * This means, when the app is already running, all the existing activities will be + * destroyed when a static shortcut is launched. * If this behavior is not desirable, you can use a trampoline activity, * or an invisible activity that starts another activity in {@link Activity#onCreate}, * then calls {@link Activity#finish()}. * The first activity should include an attribute setting - * of {@code android:taskAffinity=""} in the application's AndroidManifest.xml - * file, and the intent within the manifest shortcut should point at this first activity. + * of {@code android:taskAffinity=""} in the app's AndroidManifest.xml + * file, and the intent within the static shortcut should point at this first activity. * * *

    Showing New Information in a Shortcut

    + *

    * In order to avoid confusion, you should not use {@link #updateShortcuts(List)} to update * a shortcut so that it contains conceptually different information. * - *

    For example, a phone application may publish the most frequently called contact as a dynamic - * shortcut. Over time, this contact may change; when it does, the application should + *

    For example, a phone app may publish the most frequently called contact as a dynamic + * shortcut. Over time, this contact may change. When it does, the app should * represent the changed contact with a new shortcut that contains a different ID, using either * {@link #setDynamicShortcuts(List)} or {@link #addDynamicShortcuts(List)}, rather than updating * the existing shortcut with {@link #updateShortcuts(List)}. @@ -291,7 +302,7 @@ import java.util.List; * it to reference a different contact will likely confuse the user. * *

    On the other hand, when the - * contact's information has changed, such as the name or picture, the application should + * contact's information has changed, such as the name or picture, the app should * use {@link #updateShortcuts(List)} so that the pinned shortcut is updated too. * * @@ -299,21 +310,21 @@ import java.util.List; * When the launcher displays the shortcuts that are associated with a particular launcher icon, * the shortcuts should appear in the following order: *

      - *
    • First show manifest shortcuts + *
    • First show static shortcuts * (if {@link ShortcutInfo#isDeclaredInManifest()} is {@code true}), * and then show dynamic shortcuts (if {@link ShortcutInfo#isDynamic()} is {@code true}). - *
    • Within each category of shortcuts (manifest and dynamic), sort the shortcuts in order + *
    • Within each category of shortcuts (static and dynamic), sort the shortcuts in order * of increasing rank according to {@link ShortcutInfo#getRank()}. *
    - *

    Shortcut ranks are non-negative sequential integers + *

    Shortcut ranks are non-negative, sequential integers * that determine the order in which shortcuts appear, assuming that the shortcuts are all in * the same category. * Ranks of existing shortcuts can be updated with - * {@link #updateShortcuts(List)}; you can use {@link #addDynamicShortcuts(List)} and - * {@link #setDynamicShortcuts(List)}, too. + * {@link #updateShortcuts(List)}. You can also use {@link #addDynamicShortcuts(List)} and + * {@link #setDynamicShortcuts(List)}. * *

    Ranks are auto-adjusted so that they're unique for each target activity in each category - * (dynamic or manifest). For example, if there are 3 dynamic shortcuts with ranks 0, 1 and 2, + * (static or dynamic). For example, if there are 3 dynamic shortcuts with ranks 0, 1 and 2, * adding another dynamic shortcut with a rank of 1 represents a request to place this shortcut at * the second position. * In response, the third and fourth shortcuts move closer to the bottom of the shortcut list, @@ -321,119 +332,120 @@ import java.util.List; * *

    Rate Limiting

    * + *

    * Calls to {@link #setDynamicShortcuts(List)}, {@link #addDynamicShortcuts(List)}, and - * {@link #updateShortcuts(List)} may be rate-limited when called by background applications, or - * applications with no foreground activity or service. When you attempt to call these methods - * from a background application after exceeding the rate limit, these APIs return {@code false}. + * {@link #updateShortcuts(List)} may be rate-limited when called by background apps, or + * apps with no foreground activity or service. When you attempt to call these methods + * from a background app after exceeding the rate limit, these APIs return {@code false}. * - *

    Applications with a foreground activity or service are not rate-limited. + *

    Apps with a foreground activity or service are not rate-limited. * - *

    Rate-limiting will be reset upon certain events, so that even background applications - * can call these APIs again until they are rate limit is reached again. + *

    Rate-limiting is reset upon certain events, so that even background apps + * can call these APIs until the rate limit is reached again. * These events include the following: *

      - *
    • When an application comes to the foreground. - *
    • When the system locale changes. - *
    • When the user performs an "inline reply" action on a notification. + *
    • An app comes to the foreground. + *
    • The system locale changes. + *
    • The user performs the inline reply action on a notification. *
    * *

    When rate-limiting is active, {@link #isRateLimitingActive()} returns {@code true}. * *

    Resetting rate-limiting for testing

    * - * If your application is rate-limited during development or testing, you can use the - * "Reset ShortcutManager rate-limiting" development option or the following adb command to reset - * it: - *
    - * adb shell cmd shortcut reset-throttling [ --user USER-ID ]
    + * 

    + * If your app is rate-limited during development or testing, you can use the + * Reset ShortcutManager rate-limiting development option or + * the following {@code adb} command to reset it: + *

    + *$ adb shell cmd shortcut reset-throttling [ --user USER-ID ]
      * 
    * *

    Handling System Locale Changes

    * - * Applications should update dynamic and pinned shortcuts when the system locale changes + *

    + * Apps should update dynamic and pinned shortcuts when the system locale changes * using the {@link Intent#ACTION_LOCALE_CHANGED} broadcast. * - *

    When the system locale changes, rate-limiting is reset, so even background applications - * can set dynamic shortcuts, add dynamic shortcuts, and update shortcuts until the rate limit - * is reached again. + *

    When the system locale changes, rate-limiting is reset, so even background apps + * can add and update dynamic shortcuts until the rate limit is reached again. * * *

    Backup and Restore

    * - * When an application has the {@code android:allowBackup="true"} attribute assignment included + *

    + * When an app has the {@code android:allowBackup="true"} attribute assignment included * in its AndroidManifest.xml file, pinned shortcuts are * backed up automatically and are restored when the user sets up a new device. * - *

    Categories of Shortcuts that are Backed Up

    + *

    Categories of shortcuts that are backed up

    * *
      *
    • Pinned shortcuts are backed up. Bitmap icons are not backed up by the system, - * but launcher applications should back them up and restore them so that the user still sees icons - * for pinned shortcuts on the launcher. Applications can always use + * so launcher apps should back them up and restore them so that the user still sees icons + * for pinned shortcuts on the launcher. Apps can always use * {@link #updateShortcuts(List)} to re-publish icons. * - *
    • Manifest shortcuts are not backed up, but when an application is re-installed on a new - * device, they are re-published from the AndroidManifest.xml file, anyway. + *
    • Static shortcuts aren't backed up, but when an app is re-installed on a new + * device, they are re-published from the AndroidManifest.xml file. * - *
    • Dynamic shortcuts are not backed up. + *
    • Dynamic shortcuts aren't backed up. *
    * - *

    Because dynamic shortcuts are not restored, it is recommended that applications check + *

    Because dynamic shortcuts are not restored, it is recommended that apps check * currently-published dynamic shortcuts using {@link #getDynamicShortcuts()} * each time they are launched, and they should re-publish * dynamic shortcuts when necessary. * *

    - * public class MainActivity extends Activity {
    - *     public void onCreate(Bundle savedInstanceState) {
    - *         super.onCreate(savedInstanceState);
    - *
    - *         ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
    - *
    - *         if (shortcutManager.getDynamicShortcuts().size() == 0) {
    - *             // Application restored; re-publish dynamic shortcuts.
    - *
    - *             if (shortcutManager.getPinnedShortcuts().size() > 0) {
    - *                 // Pinned shortcuts have been restored.  Use updateShortcuts() to make sure
    - *                 // they have up-to-date information.
    - *             }
    - *         }
    - *     }
    - *     :
    - *
    - * }
    + *public class MainActivity extends Activity {
    + *    public void onCreate(Bundle savedInstanceState) {
    + *        super.onCreate(savedInstanceState);
    + *        ShortcutManager shortcutManager =
    + *                getSystemService(ShortcutManager.class);
    + *
    + *        if (shortcutManager.getDynamicShortcuts().size() == 0) {
    + *            // Application restored. Need to re-publish dynamic shortcuts.
    + *            if (shortcutManager.getPinnedShortcuts().size() > 0) {
    + *                // Pinned shortcuts have been restored. Use
    + *                // updateShortcuts() to make sure they contain
    + *                // up-to-date information.
    + *            }
    + *        }
    + *    }
    + *    // ...
    + *}
      * 
    * * *

    Backup/restore and shortcut IDs

    - * - * Because pinned shortcuts are backed up and restored on new devices, shortcut IDs should be - * meaningful across devices; that is, IDs should contain either stable, constant strings - * or server-side identifiers, + *

    + * Because pinned shortcuts are backed up and restored on new devices, shortcut IDs + * should contain either stable, constant strings or server-side identifiers, * rather than identifiers generated locally that might not make sense on other devices. * * *

    Report Shortcut Usage and Prediction

    - * - * Launcher applications may be capable of predicting which shortcuts will most likely be + *

    + * Launcher apps may be capable of predicting which shortcuts will most likely be * used at a given time by examining the shortcut usage history data. * - *

    In order to provide launchers with such data, publisher applications should + *

    In order to provide launchers with such data, publisher apps should * report the shortcuts that are used with {@link #reportShortcutUsed(String)} * when a shortcut is selected, * or when an action equivalent to a shortcut is taken by the user even if it wasn't started * with the shortcut. * - *

    For example, suppose a GPS navigation application supports "navigate to work" as a shortcut. + *

    For example, suppose a navigation app supports "navigate to work" as a shortcut. * It should then report when the user selects this shortcut and when the user chooses - * to navigate to work within the application itself. - * This helps the launcher application + * to navigate to work within the app itself. + * This helps the launcher app * learn that the user wants to navigate to work at a certain time every * weekday, and it can then show this shortcut in a suggestion list at the right time. * *

    Launcher API

    * - * The {@link LauncherApps} class provides APIs for launcher applications to access shortcuts. + * The {@link LauncherApps} class provides APIs for launcher apps to access shortcuts. * * *

    Direct Boot and Shortcuts

    @@ -465,7 +477,7 @@ public class ShortcutManager { } /** - * Publish the list of shortcuts. All existing dynamic shortcuts from the caller application + * Publish the list of shortcuts. All existing dynamic shortcuts from the caller app * will be replaced. If there are already pinned shortcuts with the same IDs, * the mutable pinned shortcuts are updated. * @@ -488,7 +500,7 @@ public class ShortcutManager { } /** - * Return all dynamic shortcuts from the caller application. + * Return all dynamic shortcuts from the caller app. * * @throws IllegalStateException when the user is locked. */ @@ -503,7 +515,7 @@ public class ShortcutManager { } /** - * Return all manifest shortcuts from the caller application. + * Return all static (manifest) shortcuts from the caller app. * * @throws IllegalStateException when the user is locked. */ @@ -554,7 +566,7 @@ public class ShortcutManager { } /** - * Delete all dynamic shortcuts from the caller application. + * Delete all dynamic shortcuts from the caller app. * * @throws IllegalStateException when the user is locked. */ @@ -567,7 +579,7 @@ public class ShortcutManager { } /** - * Return all pinned shortcuts from the caller application. + * Return all pinned shortcuts from the caller app. * * @throws IllegalStateException when the user is locked. */ @@ -661,7 +673,7 @@ public class ShortcutManager { /** * Re-enable pinned shortcuts that were previously disabled. If the target shortcuts - * already enabled, this method does nothing. + * are already enabled, this method does nothing. * * @throws IllegalArgumentException If trying to enable immutable shortcuts. * @@ -684,7 +696,7 @@ public class ShortcutManager { } /** - * Return the maximum number of dynamic and manifest shortcuts that each launcher icon + * Return the maximum number of static and dynamic shortcuts that each launcher icon * can have at a time. */ public int getMaxShortcutCountPerActivity() { @@ -697,7 +709,7 @@ public class ShortcutManager { } /** - * Return the number of times the caller application can call the rate-limited APIs + * Return the number of times the caller app can call the rate-limited APIs * before the rate limit counter is reset. * * @see #getRateLimitResetTime() @@ -729,7 +741,7 @@ public class ShortcutManager { } /** - * Return {@code true} when rate-limiting is active for the caller application. + * Return {@code true} when rate-limiting is active for the caller app. * *

    See the class level javadoc for details. * @@ -769,13 +781,13 @@ public class ShortcutManager { } /** - * Applications that publish shortcuts should call this method - * whenever the user selects the shortcut containing the given ID or when the user completes - * an action in the application that is equivalent to selecting the shortcut. + * Apps that publish shortcuts should call this method whenever the user + * selects the shortcut containing the given ID or when the user completes + * an action in the app that is equivalent to selecting the shortcut. * For more details, see the Javadoc for the {@link ShortcutManager} class * *

    The information is accessible via {@link UsageStatsManager#queryEvents} - * Typically, launcher applications use this information to build a prediction model + * Typically, launcher apps use this information to build a prediction model * so that they can promote the shortcuts that are likely to be used at the moment. * * @throws IllegalStateException when the user is locked. @@ -790,9 +802,9 @@ public class ShortcutManager { } /** - * Called internally when an application is considered to have come to foreground + * Called internally when an app is considered to have come to the foreground * even when technically it's not. This method resets the throttling for this package. - * For example, when the user sends an "inline reply" on an notification, the system UI will + * For example, when the user sends an "inline reply" on a notification, the system UI will * call it. * * @hide diff --git a/core/java/android/database/CursorJoiner.java b/core/java/android/database/CursorJoiner.java index e3c298893e806975fb253b90946515e0cf737cc5..a95263b67b433dde64d9eca98c4d09ec83c7b8ad 100644 --- a/core/java/android/database/CursorJoiner.java +++ b/core/java/android/database/CursorJoiner.java @@ -27,7 +27,7 @@ import java.util.Iterator; * *

      * CursorJoiner joiner = new CursorJoiner(cursorA, keyColumnsofA, cursorB, keyColumnsofB);
    - * for (CursorJointer.Result joinerResult : joiner) {
    + * for (CursorJoiner.Result joinerResult : joiner) {
      *     switch (joinerResult) {
      *         case LEFT:
      *             // handle case where a row in cursorA is unique
    diff --git a/core/java/android/database/sqlite/SQLiteDatabase.java b/core/java/android/database/sqlite/SQLiteDatabase.java
    index 0f64b921a07993779b6e278938204e56d51218eb..8e178320d66d5126f4a6f60126be417aeb6675d0 100644
    --- a/core/java/android/database/sqlite/SQLiteDatabase.java
    +++ b/core/java/android/database/sqlite/SQLiteDatabase.java
    @@ -1371,6 +1371,7 @@ public final class SQLiteDatabase extends SQLiteClosable {
     
         /**
          * Convenience method for replacing a row in the database.
    +     * Inserts a new row if a row does not already exist.
          *
          * @param table the table in which to replace the row
          * @param nullColumnHack optional; may be null.
    @@ -1381,7 +1382,7 @@ public final class SQLiteDatabase extends SQLiteClosable {
          *            provides the name of nullable column name to explicitly insert a NULL into
          *            in the case where your initialValues is empty.
          * @param initialValues this map contains the initial column values for
    -     *   the row.
    +     *   the row. The keys should be the column names and the values the column values.
          * @return the row ID of the newly inserted row, or -1 if an error occurred
          */
         public long replace(String table, String nullColumnHack, ContentValues initialValues) {
    @@ -1396,6 +1397,7 @@ public final class SQLiteDatabase extends SQLiteClosable {
     
         /**
          * Convenience method for replacing a row in the database.
    +     * Inserts a new row if a row does not already exist.
          *
          * @param table the table in which to replace the row
          * @param nullColumnHack optional; may be null.
    @@ -1406,7 +1408,7 @@ public final class SQLiteDatabase extends SQLiteClosable {
          *            provides the name of nullable column name to explicitly insert a NULL into
          *            in the case where your initialValues is empty.
          * @param initialValues this map contains the initial column values for
    -     *   the row. The key
    +     *   the row. The keys should be the column names and the values the column values.
          * @throws SQLException
          * @return the row ID of the newly inserted row, or -1 if an error occurred
          */
    @@ -1740,7 +1742,7 @@ public final class SQLiteDatabase extends SQLiteClosable {
          * Returns true if the new version code is greater than the current database version.
          *
          * @param newVersion The new version code.
    -     * @return True if the new version code is greater than the current database version. 
    +     * @return True if the new version code is greater than the current database version.
          */
         public boolean needUpgrade(int newVersion) {
             return newVersion > getVersion();
    diff --git a/core/java/android/database/sqlite/package.html b/core/java/android/database/sqlite/package.html
    index ceed171ce48c269f5bcf9fd284be0a2e49df4461..864a9bb32702ea2e438f05d3727fa53bcffc49ac 100644
    --- a/core/java/android/database/sqlite/package.html
    +++ b/core/java/android/database/sqlite/package.html
    @@ -6,15 +6,44 @@ classes that an application would use to manage its own private database.
     Applications use these classes to manage private databases. If creating a
     content provider, you will probably have to use these classes to create and
     manage your own database to store content. See Content Providers to learn
    -the conventions for implementing a content provider. See the
    -NotePadProvider class in the NotePad sample application in the SDK for an
    -example of a content provider. Android ships with SQLite version 3.4.0
    -

    If you are working with data sent to you by a provider, you will not use -these SQLite classes, but instead use the generic {@link android.database} -classes. -

    Android ships with the sqlite3 database tool in the tools/ -folder. You can use this tool to browse or run SQL commands on the device. Run by -typing sqlite3 in a shell window. +href="{@docRoot}guide/topics/providers/content-providers.html">Content Providers +to learn the conventions for implementing a content provider. If you are working +with data sent to you by a provider, you do not use these SQLite classes, but +instead use the generic {@link android.database} classes. + +

    The Android SDK and Android emulators both include the +sqlite3 command-line +database tool. On your development machine, run the tool from the +platform-tools/ folder of your SDK. On the emulator, run the tool +with adb shell, for example, adb -e shell sqlite3. + +

    The version of SQLite depends on the version of Android. See the following table: + + + + + + + + +
    Android APISQLite Version
    API 243.9
    API 213.8
    API 113.7
    API 83.6
    API 33.5
    API 13.4
    + +

    Some device manufacturers include different versions of SQLite on their devices. + There are two ways to programmatically determine the version number. + +

      +
    • If available, use the sqlite3 tool, for example: + adb -e shell sqlite3 --version.
    • +
    • Create and query an in-memory database as shown in the following code sample: +
      +    String query = "select sqlite_version() AS sqlite_version";
      +    SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(":memory:", null);
      +    Cursor cursor = db.rawQuery(query, null);
      +    String sqliteVersion = "";
      +    if (cursor.moveToNext()) {
      +        sqliteVersion = cursor.getString(0);
      +    }
      +
    • +
    diff --git a/core/java/android/hardware/camera2/DngCreator.java b/core/java/android/hardware/camera2/DngCreator.java index 9478dc002d6c84f2e51bc387caa7a9d721c4936d..1a51acd6c5ecd9603fca75001d05046be6beca3b 100644 --- a/core/java/android/hardware/camera2/DngCreator.java +++ b/core/java/android/hardware/camera2/DngCreator.java @@ -27,6 +27,7 @@ import android.location.Location; import android.media.ExifInterface; import android.media.Image; import android.os.SystemClock; +import android.util.Log; import android.util.Size; import java.io.IOException; @@ -89,21 +90,43 @@ public final class DngCreator implements AutoCloseable { throw new IllegalArgumentException("Null argument to DngCreator constructor"); } - // Find current time + // Find current time in milliseconds since 1970 long currentTime = System.currentTimeMillis(); - - // Find boot time - long bootTimeMillis = currentTime - SystemClock.elapsedRealtime(); + // Assume that sensor timestamp has that timebase to start + long timeOffset = 0; + + int timestampSource = characteristics.get( + CameraCharacteristics.SENSOR_INFO_TIMESTAMP_SOURCE); + + if (timestampSource == CameraCharacteristics.SENSOR_INFO_TIMESTAMP_SOURCE_REALTIME) { + // This means the same timebase as SystemClock.elapsedRealtime(), + // which is CLOCK_BOOTTIME + timeOffset = currentTime - SystemClock.elapsedRealtime(); + } else if (timestampSource == CameraCharacteristics.SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN) { + // This means the same timebase as System.currentTimeMillis(), + // which is CLOCK_MONOTONIC + timeOffset = currentTime - SystemClock.uptimeMillis(); + } else { + // Unexpected time source - treat as CLOCK_MONOTONIC + Log.w(TAG, "Sensor timestamp source is unexpected: " + timestampSource); + timeOffset = currentTime - SystemClock.uptimeMillis(); + } // Find capture time (nanos since boot) Long timestamp = metadata.get(CaptureResult.SENSOR_TIMESTAMP); long captureTime = currentTime; if (timestamp != null) { - captureTime = timestamp / 1000000 + bootTimeMillis; + captureTime = timestamp / 1000000 + timeOffset; } + // Create this fresh each time since the time zone may change while a long-running application + // is active. + final DateFormat dateTimeStampFormat = + new SimpleDateFormat(TIFF_DATETIME_FORMAT); + dateTimeStampFormat.setTimeZone(TimeZone.getDefault()); + // Format for metadata - String formattedCaptureTime = sDateTimeStampFormat.format(captureTime); + String formattedCaptureTime = dateTimeStampFormat.format(captureTime); nativeInit(characteristics.getNativeCopy(), metadata.getNativeCopy(), formattedCaptureTime); @@ -450,13 +473,10 @@ public final class DngCreator implements AutoCloseable { private static final String GPS_DATE_FORMAT_STR = "yyyy:MM:dd"; private static final String TIFF_DATETIME_FORMAT = "yyyy:MM:dd HH:mm:ss"; private static final DateFormat sExifGPSDateStamp = new SimpleDateFormat(GPS_DATE_FORMAT_STR); - private static final DateFormat sDateTimeStampFormat = - new SimpleDateFormat(TIFF_DATETIME_FORMAT); private final Calendar mGPSTimeStampCalendar = Calendar .getInstance(TimeZone.getTimeZone("UTC")); static { - sDateTimeStampFormat.setTimeZone(TimeZone.getDefault()); sExifGPSDateStamp.setTimeZone(TimeZone.getTimeZone("UTC")); } diff --git a/core/java/android/hardware/camera2/utils/TaskDrainer.java b/core/java/android/hardware/camera2/utils/TaskDrainer.java index 7c46e502501b59fe8b7c29ddf7784a937a9c7165..ed30ff34afc890f71065e7869dde9c16ddd5cc19 100644 --- a/core/java/android/hardware/camera2/utils/TaskDrainer.java +++ b/core/java/android/hardware/camera2/utils/TaskDrainer.java @@ -29,8 +29,9 @@ import static com.android.internal.util.Preconditions.*; * (and new ones won't begin). * *

    The initial state is to allow all tasks to be started and finished. A task may only be started - * once, after which it must be finished before starting again. Likewise, finishing a task - * that hasn't been started is also not allowed.

    + * once, after which it must be finished before starting again. Likewise, a task may only be + * finished once, after which it must be started before finishing again. It is okay to finish a + * task before starting it due to different threads handling starting and finishing.

    * *

    When draining begins, no more new tasks can be started. This guarantees that at some * point when all the tasks are finished there will be no more collective new tasks, @@ -60,6 +61,11 @@ public class TaskDrainer { /** Set of tasks which have been started but not yet finished with #taskFinished */ private final Set mTaskSet = new HashSet(); + /** + * Set of tasks which have been finished but not yet started with #taskStarted. This may happen + * if taskStarted and taskFinished are called from two different threads. + */ + private final Set mEarlyFinishedTaskSet = new HashSet(); private final Object mLock = new Object(); private boolean mDraining = false; @@ -118,8 +124,12 @@ public class TaskDrainer { throw new IllegalStateException("Can't start more tasks after draining has begun"); } - if (!mTaskSet.add(task)) { - throw new IllegalStateException("Task " + task + " was already started"); + // Try to remove the task from the early finished set. + if (!mEarlyFinishedTaskSet.remove(task)) { + // The task is not finished early. Add it to the started set. + if (!mTaskSet.add(task)) { + throw new IllegalStateException("Task " + task + " was already started"); + } } } } @@ -128,8 +138,7 @@ public class TaskDrainer { /** * Mark an asynchronous task as having finished. * - *

    A task cannot be finished if it hasn't started. Once finished, a task - * cannot be finished again (unless it's started again).

    + *

    A task cannot be finished more than once without first having started.

    * * @param task a key to identify a task * @@ -137,7 +146,7 @@ public class TaskDrainer { * @see #beginDrain * * @throws IllegalStateException - * If attempting to start a task which is already finished (and not re-started), + * If attempting to finish a task which is already finished (and not started), */ public void taskFinished(T task) { synchronized (mLock) { @@ -145,8 +154,12 @@ public class TaskDrainer { Log.v(TAG + "[" + mName + "]", "taskFinished " + task); } + // Try to remove the task from started set. if (!mTaskSet.remove(task)) { - throw new IllegalStateException("Task " + task + " was already finished"); + // Task is not started yet. Add it to the early finished set. + if (!mEarlyFinishedTaskSet.add(task)) { + throw new IllegalStateException("Task " + task + " was already finished"); + } } // If this is the last finished task and draining has already begun, fire #onDrained diff --git a/core/java/android/hardware/location/ContextHubManager.java b/core/java/android/hardware/location/ContextHubManager.java index 0c3d4b3d7be6b4c1bca79ddba067509c67eb95d8..d4dcacceb76164805c7f52e7df99baaab9a88dc4 100644 --- a/core/java/android/hardware/location/ContextHubManager.java +++ b/core/java/android/hardware/location/ContextHubManager.java @@ -123,10 +123,18 @@ public final class ContextHubManager { /** * Load a nano app on a specified context hub. * + * Note that loading is asynchronous. When we return from this method, + * the nano app (probably) hasn't loaded yet. Assuming a return of 0 + * from this method, then the final success/failure for the load, along + * with the "handle" for the nanoapp, is all delivered in a byte + * string via a call to Callback.onMessageReceipt. + * + * TODO(b/30784270): Provide a better success/failure and "handle" delivery. + * * @param hubHandle handle of context hub to load the app on. * @param app the nanoApp to load on the hub * - * @return int nanoAppInstance of the loaded nanoApp on success, + * @return 0 if the command for loading was sent to the context hub; * -1 otherwise * * @see NanoApp @@ -150,9 +158,17 @@ public final class ContextHubManager { /** * Unload a specified nanoApp * - * @param nanoAppHandle handle of the nanoApp to load + * Note that unloading is asynchronous. When we return from this method, + * the nano app (probably) hasn't unloaded yet. Assuming a return of 0 + * from this method, then the final success/failure for the unload is + * delivered in a byte string via a call to Callback.onMessageReceipt. + * + * TODO(b/30784270): Provide a better success/failure delivery. * - * @return int 0 on success, -1 otherwise + * @param nanoAppHandle handle of the nanoApp to unload + * + * @return 0 if the command for unloading was sent to the context hub; + * -1 otherwise */ public int unloadNanoApp(int nanoAppHandle) { int retVal = -1; @@ -169,6 +185,24 @@ public final class ContextHubManager { /** * get information about the nano app instance * + * NOTE: The returned NanoAppInstanceInfo does _not_ contain correct + * information for several fields, specifically: + * - getName() + * - getPublisher() + * - getNeededExecMemBytes() + * - getNeededReadMemBytes() + * - getNeededWriteMemBytes() + * + * For example, say you call loadNanoApp() with a NanoApp that has + * getName() returning "My Name". Later, if you call getNanoAppInstanceInfo + * for that nanoapp, the returned NanoAppInstanceInfo's getName() + * method will claim "Preloaded app, unknown", even though you would + * have expected "My Name". For now, as the user, you'll need to + * separately track the above fields if they are of interest to you. + * + * TODO(b/30943489): Have the returned NanoAppInstanceInfo contain the + * correct information. + * * @param nanoAppHandle handle of the nanoAppInstance * @return NanoAppInstanceInfo Information about the nano app instance. * @@ -209,6 +243,14 @@ public final class ContextHubManager { /** * Send a message to a specific nano app instance on a context hub. * + * Note that the return value of this method only speaks of success + * up to the point of sending this to the Context Hub. It is not + * an assurance that the Context Hub successfully sent this message + * on to the nanoapp. If assurance is desired, a protocol should be + * established between your code and the nanoapp, with the nanoapp + * sending a confirmation message (which will be reported via + * Callback.onMessageReceipt). + * * @param hubHandle handle of the hub to send the message to * @param nanoAppHandle handle of the nano app to send to * @param message Message to be sent diff --git a/core/java/android/hardware/location/ContextHubService.java b/core/java/android/hardware/location/ContextHubService.java index 062c9580c1e42160c33c928d3627a404e720600c..06af46122a7b5ba533d39463c3f96acc66d011b8 100644 --- a/core/java/android/hardware/location/ContextHubService.java +++ b/core/java/android/hardware/location/ContextHubService.java @@ -18,6 +18,8 @@ package android.hardware.location; import java.io.FileDescriptor; import java.io.PrintWriter; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; import java.util.ArrayList; import java.util.HashMap; @@ -146,6 +148,36 @@ public class ContextHubService extends IContextHubService.Stub { return mContextHubInfo[contextHubHandle]; } + // TODO(b/30808791): Remove this when NanoApp's API is correctly treating + // app IDs as 64-bits. + private static long parseAppId(NanoApp app) { + // NOTE: If this shifting seems odd (since it's actually "ONAN"), note + // that it matches how this is defined in context_hub.h. + final int HEADER_MAGIC = + (((int)'N' << 0) | + ((int)'A' << 8) | + ((int)'N' << 16) | + ((int)'O' << 24)); + final int HEADER_MAGIC_OFFSET = 4; + final int HEADER_APP_ID_OFFSET = 8; + + ByteBuffer header = ByteBuffer.wrap(app.getAppBinary()) + .order(ByteOrder.LITTLE_ENDIAN); + + try { + if (header.getInt(HEADER_MAGIC_OFFSET) == HEADER_MAGIC) { + // This is a legitimate nanoapp header. Let's grab the app ID. + return header.getLong(HEADER_APP_ID_OFFSET); + } + } catch (IndexOutOfBoundsException e) { + // The header is undersized. We'll fall through to our code + // path below, which handles being unable to parse the header. + } + // We failed to parse the header. Even through it's probably wrong, + // let's give NanoApp's idea of our ID. This is at least consistent. + return app.getAppId(); + } + @Override public int loadNanoApp(int contextHubHandle, NanoApp app) throws RemoteException { checkPermissions(); @@ -162,6 +194,15 @@ public class ContextHubService extends IContextHubService.Stub { msgHeader[HEADER_FIELD_MSG_TYPE] = MSG_LOAD_NANO_APP; long appId = app.getAppId(); + // TODO(b/30808791): Remove this hack when the NanoApp API is fixed, + // and getAppId() returns a 'long' instead of an 'int'. + if ((appId >> 32) != 0) { + // We're unlikely to notice this warning, but at least + // we can avoid running our hack logic. + Log.w(TAG, "Code has not been updated since API fix."); + } else { + appId = parseAppId(app); + } msgHeader[HEADER_FIELD_LOAD_APP_ID_LO] = (int)(appId & 0xFFFFFFFF); msgHeader[HEADER_FIELD_LOAD_APP_ID_HI] = (int)((appId >> 32) & 0xFFFFFFFF); @@ -322,9 +363,16 @@ public class ContextHubService extends IContextHubService.Stub { appInfo.setNeededReadMemBytes(PRE_LOADED_APP_MEM_REQ); appInfo.setNeededWriteMemBytes(PRE_LOADED_APP_MEM_REQ); + String action; + if (mNanoAppHash.containsKey(appInstanceHandle)) { + action = "Updated"; + } else { + action = "Added"; + } + mNanoAppHash.put(appInstanceHandle, appInfo); - Log.d(TAG, "Added app instance " + appInstanceHandle + " with id " + appId - + " version " + appVersion); + Log.d(TAG, action + " app instance " + appInstanceHandle + " with id " + + appId + " version " + appVersion); return 0; } diff --git a/core/java/android/hardware/location/NanoAppFilter.java b/core/java/android/hardware/location/NanoAppFilter.java index 8db70e9c53f1c6f47fa5c76b65ee67a17731e7b5..bf35a3d6fbd69ad25d192fc2a5a1e210f988f158 100644 --- a/core/java/android/hardware/location/NanoAppFilter.java +++ b/core/java/android/hardware/location/NanoAppFilter.java @@ -43,7 +43,8 @@ public class NanoAppFilter { private long mAppIdVendorMask; // Id of the context hub this instance is expected on - private int mContextHubId; + // TODO: Provide an API which will let us change this HubId. + private int mContextHubId = HUB_ANY; /** * Flag indicating any version. With this flag set, all versions shall match provided version. diff --git a/core/java/android/hardware/location/NanoAppInstanceInfo.java b/core/java/android/hardware/location/NanoAppInstanceInfo.java index 71a5a8816f5830f544e46ffd8cfd5eaef6d3ace9..ac6d83f622b2dfa003b5ea31cb7f9466b4dae855 100644 --- a/core/java/android/hardware/location/NanoAppInstanceInfo.java +++ b/core/java/android/hardware/location/NanoAppInstanceInfo.java @@ -113,7 +113,12 @@ public class NanoAppInstanceInfo { } /** - * Set the application version + * Get the application version + * + * NOTE: There is a race condition where shortly after loading, this + * may return -1 instead of the correct version. + * + * TODO(b/30970527): Fix this race condition. * * @return int - version of the app */ diff --git a/core/java/android/hardware/usb/UsbDeviceConnection.java b/core/java/android/hardware/usb/UsbDeviceConnection.java index c062b3a311526ba094303c8782c9dd3f0fcd48bd..893b9541ff3d2647dff30e6e7d2583342fcd1443 100644 --- a/core/java/android/hardware/usb/UsbDeviceConnection.java +++ b/core/java/android/hardware/usb/UsbDeviceConnection.java @@ -16,8 +16,10 @@ package android.hardware.usb; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.content.Context; import android.os.ParcelFileDescriptor; - import java.io.FileDescriptor; @@ -31,6 +33,8 @@ public class UsbDeviceConnection { private final UsbDevice mDevice; + private Context mContext; + // used by the JNI code private long mNativeContext; @@ -42,10 +46,21 @@ public class UsbDeviceConnection { mDevice = device; } - /* package */ boolean open(String name, ParcelFileDescriptor pfd) { + /* package */ boolean open(String name, ParcelFileDescriptor pfd, @NonNull Context context) { + mContext = context.getApplicationContext(); + return native_open(name, pfd.getFileDescriptor()); } + /** + * @return The application context the connection was created for. + * + * @hide + */ + public @Nullable Context getContext() { + return mContext; + } + /** * Releases all system resources related to the device. * Once the object is closed it cannot be used again. diff --git a/core/java/android/hardware/usb/UsbManager.java b/core/java/android/hardware/usb/UsbManager.java index 629db06a30e37dd5e10c66a92632ef7e251394e0..cb2720ab98489f080c92a42616138037383a4c6c 100644 --- a/core/java/android/hardware/usb/UsbManager.java +++ b/core/java/android/hardware/usb/UsbManager.java @@ -330,7 +330,7 @@ public class UsbManager { ParcelFileDescriptor pfd = mService.openDevice(deviceName); if (pfd != null) { UsbDeviceConnection connection = new UsbDeviceConnection(device); - boolean result = connection.open(deviceName, pfd); + boolean result = connection.open(deviceName, pfd, mContext); pfd.close(); if (result) { return connection; diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index 0779ba60dfb2ab1ddab6279a766130f201430563..1b165b1a6f7de779ca37f5eb82795089305005fe 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -1836,6 +1836,16 @@ public class ConnectivityManager { return (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); } + /* TODO: These permissions checks don't belong in client-side code. Move them to + * services.jar, possibly in com.android.server.net. */ + + /** {@hide} */ + public static final boolean checkChangePermission(Context context) { + int uid = Binder.getCallingUid(); + return Settings.checkAndNoteChangeNetworkStateOperation(context, uid, Settings + .getPackageNameForUid(context, uid), false /* throwException */); + } + /** {@hide} */ public static final void enforceChangePermission(Context context) { int uid = Binder.getCallingUid(); diff --git a/core/java/android/net/IIpConnectivityMetrics.aidl b/core/java/android/net/IIpConnectivityMetrics.aidl new file mode 100644 index 0000000000000000000000000000000000000000..8f634bbf0cc9a113e71da730c8cf96c6eabbeaf4 --- /dev/null +++ b/core/java/android/net/IIpConnectivityMetrics.aidl @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2016 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 android.net; + +import android.os.Parcelable; +import android.net.ConnectivityMetricsEvent; + +/** {@hide} */ +interface IIpConnectivityMetrics { + + /** + * @return number of remaining available slots in buffer. + */ + int logEvent(in ConnectivityMetricsEvent event); +} diff --git a/core/java/android/net/LocalSocketImpl.java b/core/java/android/net/LocalSocketImpl.java index b83fb260d6f1e60a692aaac2e18fabcf3605c833..0f0e9c49a0b04657b1678fd64530307cc12955c4 100644 --- a/core/java/android/net/LocalSocketImpl.java +++ b/core/java/android/net/LocalSocketImpl.java @@ -516,13 +516,11 @@ class LocalSocketImpl Os.setsockoptLinger(fd, OsConstants.SOL_SOCKET, OsConstants.SO_LINGER, linger); break; case SocketOptions.SO_TIMEOUT: - /* - * SO_TIMEOUT from the core library gets converted to - * SO_SNDTIMEO, but the option is supposed to set both - * send and receive timeouts. Note: The incoming timeout - * value is in milliseconds. - */ + // The option must set both send and receive timeouts. + // Note: The incoming timeout value is in milliseconds. StructTimeval timeval = StructTimeval.fromMillis(intValue); + Os.setsockoptTimeval(fd, OsConstants.SOL_SOCKET, OsConstants.SO_RCVTIMEO, + timeval); Os.setsockoptTimeval(fd, OsConstants.SOL_SOCKET, OsConstants.SO_SNDTIMEO, timeval); break; diff --git a/core/java/android/net/NetworkCapabilities.java b/core/java/android/net/NetworkCapabilities.java index 6243f467016ae565d7d785db05a60ed0654036bd..56eba4f0e3ef4eee98a5bc2f0f5392833c8e4faf 100644 --- a/core/java/android/net/NetworkCapabilities.java +++ b/core/java/android/net/NetworkCapabilities.java @@ -182,8 +182,15 @@ public final class NetworkCapabilities implements Parcelable { */ public static final int NET_CAPABILITY_CAPTIVE_PORTAL = 17; + /** + * Indicates that this network is available for use by apps, and not a network that is being + * kept up in the background to facilitate fast network switching. + * @hide + */ + public static final int NET_CAPABILITY_FOREGROUND = 18; + private static final int MIN_NET_CAPABILITY = NET_CAPABILITY_MMS; - private static final int MAX_NET_CAPABILITY = NET_CAPABILITY_CAPTIVE_PORTAL; + private static final int MAX_NET_CAPABILITY = NET_CAPABILITY_FOREGROUND; /** * Network capabilities that are expected to be mutable, i.e., can change while a particular @@ -194,7 +201,8 @@ public final class NetworkCapabilities implements Parcelable { // http://b/18206275 (1 << NET_CAPABILITY_TRUSTED) | (1 << NET_CAPABILITY_VALIDATED) | - (1 << NET_CAPABILITY_CAPTIVE_PORTAL); + (1 << NET_CAPABILITY_CAPTIVE_PORTAL) | + (1 << NET_CAPABILITY_FOREGROUND); /** * Network specifier for factories which want to match any network specifier @@ -217,8 +225,7 @@ public final class NetworkCapabilities implements Parcelable { * get immediately torn down because they do not have the requested capability. */ private static final long NON_REQUESTABLE_CAPABILITIES = - (1 << NET_CAPABILITY_VALIDATED) | - (1 << NET_CAPABILITY_CAPTIVE_PORTAL); + MUTABLE_CAPABILITIES & ~(1 << NET_CAPABILITY_TRUSTED); /** * Capabilities that are set by default when the object is constructed. @@ -325,6 +332,7 @@ public final class NetworkCapabilities implements Parcelable { public String describeFirstNonRequestableCapability() { if (hasCapability(NET_CAPABILITY_VALIDATED)) return "NET_CAPABILITY_VALIDATED"; if (hasCapability(NET_CAPABILITY_CAPTIVE_PORTAL)) return "NET_CAPABILITY_CAPTIVE_PORTAL"; + if (hasCapability(NET_CAPABILITY_FOREGROUND)) return "NET_CAPABILITY_FOREGROUND"; // This cannot happen unless the preceding checks are incomplete. if ((mNetworkCapabilities & NON_REQUESTABLE_CAPABILITIES) != 0) { return "unknown non-requestable capabilities " + Long.toHexString(mNetworkCapabilities); @@ -352,6 +360,11 @@ public final class NetworkCapabilities implements Parcelable { (that.mNetworkCapabilities & ~MUTABLE_CAPABILITIES)); } + private boolean equalsNetCapabilitiesRequestable(NetworkCapabilities that) { + return ((this.mNetworkCapabilities & ~NON_REQUESTABLE_CAPABILITIES) == + (that.mNetworkCapabilities & ~NON_REQUESTABLE_CAPABILITIES)); + } + /** * Removes the NET_CAPABILITY_NOT_RESTRICTED capability if all the capabilities it provides are * typically provided by restricted networks. @@ -749,6 +762,19 @@ public final class NetworkCapabilities implements Parcelable { equalsSpecifier(nc)); } + /** + * Checks that our requestable capabilities are the same as those of the given + * {@code NetworkCapabilities}. + * + * @hide + */ + public boolean equalRequestableCapabilities(NetworkCapabilities nc) { + if (nc == null) return false; + return (equalsNetCapabilitiesRequestable(nc) && + equalsTransportTypes(nc) && + equalsSpecifier(nc)); + } + @Override public boolean equals(Object obj) { if (obj == null || (obj instanceof NetworkCapabilities == false)) return false; @@ -833,6 +859,7 @@ public final class NetworkCapabilities implements Parcelable { case NET_CAPABILITY_NOT_VPN: capabilities += "NOT_VPN"; break; case NET_CAPABILITY_VALIDATED: capabilities += "VALIDATED"; break; case NET_CAPABILITY_CAPTIVE_PORTAL: capabilities += "CAPTIVE_PORTAL"; break; + case NET_CAPABILITY_FOREGROUND: capabilities += "FOREGROUND"; break; } if (++i < types.length) capabilities += "&"; } diff --git a/core/java/android/net/NetworkIdentity.java b/core/java/android/net/NetworkIdentity.java index 9cd563e87c4a8c9dcac668b5d2b3601c0bdddb0f..d570e66a24357e74744b311308a5a9f513e8348f 100644 --- a/core/java/android/net/NetworkIdentity.java +++ b/core/java/android/net/NetworkIdentity.java @@ -175,7 +175,11 @@ public class NetworkIdentity implements Comparable { if (isNetworkTypeMobile(type)) { if (state.subscriberId == null) { - Slog.w(TAG, "Active mobile network without subscriber!"); + if (state.networkInfo.getState() != NetworkInfo.State.DISCONNECTED && + state.networkInfo.getState() != NetworkInfo.State.UNKNOWN) { + Slog.w(TAG, "Active mobile network without subscriber! ni = " + + state.networkInfo); + } } subscriberId = state.subscriberId; diff --git a/core/java/android/net/NetworkRequest.java b/core/java/android/net/NetworkRequest.java index 4501f7b089b96c1ccb62c3da438076ae180ebce7..ae724709c6c62e92f6bcf975984753ef92cdfbec 100644 --- a/core/java/android/net/NetworkRequest.java +++ b/core/java/android/net/NetworkRequest.java @@ -49,7 +49,7 @@ public class NetworkRequest implements Parcelable { public final int legacyType; /** - * A NetworkRequest as used by the system can be one of three types: + * A NetworkRequest as used by the system can be one of the following types: * * - LISTEN, for which the framework will issue callbacks about any * and all networks that match the specified NetworkCapabilities, @@ -64,7 +64,20 @@ public class NetworkRequest implements Parcelable { * current network (if any) that matches the capabilities of the * default Internet request (mDefaultRequest), but which cannot cause * the framework to either create or retain the existence of any - * specific network. + * specific network. Note that from the point of view of the request + * matching code, TRACK_DEFAULT is identical to REQUEST: its special + * behaviour is not due to different semantics, but to the fact that + * the system will only ever create a TRACK_DEFAULT with capabilities + * that are identical to the default request's capabilities, thus + * causing it to share fate in every way with the default request. + * + * - BACKGROUND_REQUEST, like REQUEST but does not cause any networks + * to retain the NET_CAPABILITY_FOREGROUND capability. A network with + * no foreground requests is in the background. A network that has + * one or more background requests and loses its last foreground + * request to a higher-scoring network will not go into the + * background immediately, but will linger and go into the background + * after the linger timeout. * * - The value NONE is used only by applications. When an application * creates a NetworkRequest, it does not have a type; the type is set @@ -77,7 +90,8 @@ public class NetworkRequest implements Parcelable { NONE, LISTEN, TRACK_DEFAULT, - REQUEST + REQUEST, + BACKGROUND_REQUEST, }; /** @@ -140,7 +154,7 @@ public class NetworkRequest implements Parcelable { * Add the given capability requirement to this builder. These represent * the requested network's required capabilities. Note that when searching * for a network to satisfy a request, all capabilities requested must be - * satisfied. See {@link NetworkCapabilities} for {@code NET_CAPABILITIY_*} + * satisfied. See {@link NetworkCapabilities} for {@code NET_CAPABILITY_*} * definitions. * * @param capability The {@code NetworkCapabilities.NET_CAPABILITY_*} to add. @@ -284,7 +298,7 @@ public class NetworkRequest implements Parcelable { }; /** - * Returns true iff. the contained NetworkRequest is of type LISTEN. + * Returns true iff. this NetworkRequest is of type LISTEN. * * @hide */ @@ -298,8 +312,9 @@ public class NetworkRequest implements Parcelable { * - should be associated with at most one satisfying network * at a time; * - * - should cause a network to be kept up if it is the best network - * which can satisfy the NetworkRequest. + * - should cause a network to be kept up, but not necessarily in + * the foreground, if it is the best network which can satisfy the + * NetworkRequest. * * For full detail of how isRequest() is used for pairing Networks with * NetworkRequests read rematchNetworkAndRequests(). @@ -307,9 +322,36 @@ public class NetworkRequest implements Parcelable { * @hide */ public boolean isRequest() { + return isForegroundRequest() || isBackgroundRequest(); + } + + /** + * Returns true iff. the contained NetworkRequest is one that: + * + * - should be associated with at most one satisfying network + * at a time; + * + * - should cause a network to be kept up and in the foreground if + * it is the best network which can satisfy the NetworkRequest. + * + * For full detail of how isRequest() is used for pairing Networks with + * NetworkRequests read rematchNetworkAndRequests(). + * + * @hide + */ + public boolean isForegroundRequest() { return type == Type.TRACK_DEFAULT || type == Type.REQUEST; } + /** + * Returns true iff. this NetworkRequest is of type BACKGROUND_REQUEST. + * + * @hide + */ + public boolean isBackgroundRequest() { + return type == Type.BACKGROUND_REQUEST; + } + public String toString() { return "NetworkRequest [ " + type + " id=" + requestId + (legacyType != ConnectivityManager.TYPE_NONE ? ", legacyType=" + legacyType : "") + diff --git a/core/java/android/net/NetworkStats.java b/core/java/android/net/NetworkStats.java index 25806fa776740d6d20c18cba98f9c47da4da5b39..f65a50f02df32d7bc9a5e1b3affe2578be238c0e 100644 --- a/core/java/android/net/NetworkStats.java +++ b/core/java/android/net/NetworkStats.java @@ -904,7 +904,8 @@ public class NetworkStats implements Parcelable { if (pool.isEmpty()) { return true; } - Entry moved = addTrafficToApplications(tunIface, underlyingIface, tunIfaceTotal, pool); + Entry moved = + addTrafficToApplications(tunUid, tunIface, underlyingIface, tunIfaceTotal, pool); deductTrafficFromVpnApp(tunUid, underlyingIface, moved); if (!moved.isEmpty()) { @@ -919,9 +920,9 @@ public class NetworkStats implements Parcelable { * Initializes the data used by the migrateTun() method. * * This is the first pass iteration which does the following work: - * (1) Adds up all the traffic through tun0. - * (2) Adds up all the traffic through the tunUid's underlyingIface + * (1) Adds up all the traffic through the tunUid's underlyingIface * (both foreground and background). + * (2) Adds up all the traffic through tun0 excluding traffic from the vpn app itself. */ private void tunAdjustmentInit(int tunUid, String tunIface, String underlyingIface, Entry tunIfaceTotal, Entry underlyingIfaceTotal) { @@ -941,8 +942,9 @@ public class NetworkStats implements Parcelable { underlyingIfaceTotal.add(recycle); } - if (recycle.tag == TAG_NONE && Objects.equals(tunIface, recycle.iface)) { - // Add up all tunIface traffic. + if (recycle.uid != tunUid && recycle.tag == TAG_NONE + && Objects.equals(tunIface, recycle.iface)) { + // Add up all tunIface traffic excluding traffic from the vpn app itself. tunIfaceTotal.add(recycle); } } @@ -958,13 +960,15 @@ public class NetworkStats implements Parcelable { return pool; } - private Entry addTrafficToApplications(String tunIface, String underlyingIface, + private Entry addTrafficToApplications(int tunUid, String tunIface, String underlyingIface, Entry tunIfaceTotal, Entry pool) { Entry moved = new Entry(); Entry tmpEntry = new Entry(); tmpEntry.iface = underlyingIface; for (int i = 0; i < size; i++) { - if (Objects.equals(iface[i], tunIface)) { + // the vpn app is excluded from the redistribution but all moved traffic will be + // deducted from the vpn app (see deductTrafficFromVpnApp below). + if (Objects.equals(iface[i], tunIface) && uid[i] != tunUid) { if (tunIfaceTotal.rxBytes > 0) { tmpEntry.rxBytes = pool.rxBytes * rxBytes[i] / tunIfaceTotal.rxBytes; } else { diff --git a/core/java/android/net/metrics/DhcpErrorEvent.java b/core/java/android/net/metrics/DhcpErrorEvent.java index 59c5fb61b2116725cfd39277ceecc97a8847eb57..c3abcf7610b4e420bb458d41aae7972c0c898624 100644 --- a/core/java/android/net/metrics/DhcpErrorEvent.java +++ b/core/java/android/net/metrics/DhcpErrorEvent.java @@ -50,9 +50,13 @@ public final class DhcpErrorEvent implements Parcelable { public static final int DHCP_INVALID_OPTION_LENGTH = makeErrorCode(DHCP_ERROR, 3); public static final int DHCP_NO_MSG_TYPE = makeErrorCode(DHCP_ERROR, 4); public static final int DHCP_UNKNOWN_MSG_TYPE = makeErrorCode(DHCP_ERROR, 5); + /** {@hide} */ + public static final int DHCP_NO_COOKIE = makeErrorCode(DHCP_ERROR, 6); public static final int BUFFER_UNDERFLOW = makeErrorCode(MISC_ERROR, 1); public static final int RECEIVE_ERROR = makeErrorCode(MISC_ERROR, 2); + /** {@hide} */ + public static final int PARSING_ERROR = makeErrorCode(MISC_ERROR, 3); public final String ifName; // error code byte format (MSB to LSB): @@ -115,8 +119,9 @@ public final class DhcpErrorEvent implements Parcelable { } final static class Decoder { - static final SparseArray constants = - MessageUtils.findMessageNames(new Class[]{DhcpErrorEvent.class}, - new String[]{"L2_", "L3_", "L4_", "BOOTP_", "DHCP_", "BUFFER_", "RECEIVE_"}); + static final SparseArray constants = MessageUtils.findMessageNames( + new Class[]{DhcpErrorEvent.class}, + new String[]{"L2_", "L3_", "L4_", "BOOTP_", "DHCP_", "BUFFER_", "RECEIVE_", + "PARSING_"}); } } diff --git a/core/java/android/net/metrics/IpConnectivityLog.java b/core/java/android/net/metrics/IpConnectivityLog.java index dd7bd1b915b852e84478620c5dab851c9bf66640..173e5fd0fbc179c04d9eb38565580bd31ca1f58d 100644 --- a/core/java/android/net/metrics/IpConnectivityLog.java +++ b/core/java/android/net/metrics/IpConnectivityLog.java @@ -17,63 +17,65 @@ package android.net.metrics; import android.net.ConnectivityMetricsEvent; -import android.net.ConnectivityMetricsLogger; -import android.net.IConnectivityMetricsLogger; +import android.net.IIpConnectivityMetrics; import android.os.Parcelable; import android.os.RemoteException; +import android.os.ServiceManager; import android.util.Log; - import com.android.internal.annotations.VisibleForTesting; /** - * Specialization of the ConnectivityMetricsLogger class for recording IP connectivity events. + * Class for logging IpConnectvity events with IpConnectivityMetrics * {@hide} */ -public class IpConnectivityLog extends ConnectivityMetricsLogger { - private static String TAG = "IpConnectivityMetricsLogger"; - private static final boolean DBG = true; +public class IpConnectivityLog { + private static final String TAG = IpConnectivityLog.class.getSimpleName(); + private static final boolean DBG = false; + + public static final String SERVICE_NAME = "connmetrics"; + + private IIpConnectivityMetrics mService; public IpConnectivityLog() { - // mService initialized in super constructor. } @VisibleForTesting - public IpConnectivityLog(IConnectivityMetricsLogger service) { - super(service); + public IpConnectivityLog(IIpConnectivityMetrics service) { + mService = service; + } + + private boolean checkLoggerService() { + if (mService != null) { + return true; + } + final IIpConnectivityMetrics service = + IIpConnectivityMetrics.Stub.asInterface(ServiceManager.getService(SERVICE_NAME)); + if (service == null) { + return false; + } + // Two threads racing here will write the same pointer because getService + // is idempotent once MetricsLoggerService is initialized. + mService = service; + return true; } /** - * Log an IpConnectivity event. Contrary to logEvent(), this method does not - * keep track of skipped events and is thread-safe for callers. - * + * Log an IpConnectivity event. * @param timestamp is the epoch timestamp of the event in ms. * @param data is a Parcelable instance representing the event. - * * @return true if the event was successfully logged. */ public boolean log(long timestamp, Parcelable data) { if (!checkLoggerService()) { if (DBG) { - Log.d(TAG, CONNECTIVITY_METRICS_LOGGER_SERVICE + " service was not ready"); - } - return false; - } - - if (System.currentTimeMillis() < mServiceUnblockedTimestampMillis) { - if (DBG) { - Log.d(TAG, "skipping logging due to throttling for IpConnectivity component"); + Log.d(TAG, SERVICE_NAME + " service was not ready"); } return false; } try { - final ConnectivityMetricsEvent event = - new ConnectivityMetricsEvent(timestamp, COMPONENT_TAG_CONNECTIVITY, 0, data); - final long result = mService.logEvent(event); - if (result >= 0) { - mServiceUnblockedTimestampMillis = result; - } - return (result == 0); + int left = mService.logEvent(new ConnectivityMetricsEvent(timestamp, 0, 0, data)); + return left >= 0; } catch (RemoteException e) { Log.e(TAG, "Error logging event", e); return false; diff --git a/core/java/android/net/metrics/ValidationProbeEvent.java b/core/java/android/net/metrics/ValidationProbeEvent.java index 331cf0cdd4ad7698534ecc268d77a02feea06397..1a31b56f1ffb62f8a46d51af360e1ecb17b7ba68 100644 --- a/core/java/android/net/metrics/ValidationProbeEvent.java +++ b/core/java/android/net/metrics/ValidationProbeEvent.java @@ -34,10 +34,12 @@ import java.lang.annotation.RetentionPolicy; @SystemApi public final class ValidationProbeEvent implements Parcelable { - public static final int PROBE_DNS = 0; - public static final int PROBE_HTTP = 1; - public static final int PROBE_HTTPS = 2; - public static final int PROBE_PAC = 3; + public static final int PROBE_DNS = 0; + public static final int PROBE_HTTP = 1; + public static final int PROBE_HTTPS = 2; + public static final int PROBE_PAC = 3; + /** {@hide} */ + public static final int PROBE_FALLBACK = 4; public static final int DNS_FAILURE = 0; public static final int DNS_SUCCESS = 1; @@ -57,7 +59,7 @@ public final class ValidationProbeEvent implements Parcelable { public final @ProbeType int probeType; public final @ReturnCode int returnCode; - /** @hide */ + /** {@hide} */ public ValidationProbeEvent( int netId, long durationMs, @ProbeType int probeType, @ReturnCode int returnCode) { this.netId = netId; diff --git a/core/java/android/os/AsyncTask.java b/core/java/android/os/AsyncTask.java index 4f4e7223acb98240e4c154e3e793101016596ce2..fea64ec5ee1eb9e1d24addeefc1160e994d8747e 100644 --- a/core/java/android/os/AsyncTask.java +++ b/core/java/android/os/AsyncTask.java @@ -298,12 +298,19 @@ public abstract class AsyncTask { mWorker = new WorkerRunnable() { public Result call() throws Exception { mTaskInvoked.set(true); - - Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); - //noinspection unchecked - Result result = doInBackground(mParams); - Binder.flushPendingCommands(); - return postResult(result); + Result result = null; + try { + Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); + //noinspection unchecked + result = doInBackground(mParams); + Binder.flushPendingCommands(); + } catch (Throwable tr) { + mCancelled.set(true); + throw tr; + } finally { + postResult(result); + } + return result; } }; diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java index 94963b72a954b50d48be2befce82c93ae0633be0..30b060768c575b7263b79d00359665f0c76a70e8 100644 --- a/core/java/android/os/Build.java +++ b/core/java/android/os/Build.java @@ -713,6 +713,14 @@ public class Build { * {@link android.widget.LinearLayout.LayoutParams LinearLayout.LayoutParams} to * {@link android.widget.RelativeLayout.LayoutParams RelativeLayout.LayoutParams}).
  • *
  • Your application processes will not be killed when the device density changes.
  • + *
  • Drag and drop. After a view receives the + * {@link android.view.DragEvent#ACTION_DRAG_ENTERED} event, when the drag shadow moves into + * a descendant view that can accept the data, the view receives the + * {@link android.view.DragEvent#ACTION_DRAG_EXITED} event and won’t receive + * {@link android.view.DragEvent#ACTION_DRAG_LOCATION} and + * {@link android.view.DragEvent#ACTION_DROP} events while the drag shadow is within that + * descendant view, even if the descendant view returns false from its handler + * for these events.
  • * */ public static final int N = 24; diff --git a/core/java/android/os/Bundle.java b/core/java/android/os/Bundle.java index ca64a965af0b5f8702e3c49981d0c2b160d3d50d..62fa7721702eeb126069abbba7ed9d90fab6404c 100644 --- a/core/java/android/os/Bundle.java +++ b/core/java/android/os/Bundle.java @@ -309,25 +309,49 @@ public final class Bundle extends BaseBundle implements Cloneable, Parcelable { * Filter values in Bundle to only basic types. * @hide */ - public void filterValues() { + public Bundle filterValues() { unparcel(); + Bundle bundle = this; if (mMap != null) { - for (int i = mMap.size() - 1; i >= 0; i--) { - Object value = mMap.valueAt(i); + ArrayMap map = mMap; + for (int i = map.size() - 1; i >= 0; i--) { + Object value = map.valueAt(i); if (PersistableBundle.isValidType(value)) { continue; } if (value instanceof Bundle) { - ((Bundle)value).filterValues(); + Bundle newBundle = ((Bundle)value).filterValues(); + if (newBundle != value) { + if (map == mMap) { + // The filter had to generate a new bundle, but we have not yet + // created a new one here. Do that now. + bundle = new Bundle(this); + // Note the ArrayMap<> constructor is guaranteed to generate + // a new object with items in the same order as the original. + map = bundle.mMap; + } + // Replace this current entry with the new child bundle. + map.setValueAt(i, newBundle); + } + continue; } if (value.getClass().getName().startsWith("android.")) { continue; } - mMap.removeAt(i); + if (map == mMap) { + // This is the first time we have had to remove something, that means we + // need to switch to a new Bundle. + bundle = new Bundle(this); + // Note the ArrayMap<> constructor is guaranteed to generate + // a new object with items in the same order as the original. + map = bundle.mMap; + } + map.removeAt(i); } } mFlags |= FLAG_HAS_FDS_KNOWN; mFlags &= ~FLAG_HAS_FDS; + return bundle; } /** diff --git a/core/java/android/os/FileObserver.java b/core/java/android/os/FileObserver.java index 4e705e04b447f3bfb7f2230238345109ad1a9766..dd85e1584f0ea2841e960eefc1cfaafd29f39fbf 100644 --- a/core/java/android/os/FileObserver.java +++ b/core/java/android/os/FileObserver.java @@ -16,6 +16,7 @@ package android.os; +import android.annotation.Nullable; import android.util.Log; import java.lang.ref.WeakReference; @@ -204,7 +205,8 @@ public abstract class FileObserver { * * @param event The type of event which happened * @param path The path, relative to the main monitored file or directory, - * of the file or directory which triggered the event + * of the file or directory which triggered the event. This value can + * be {@code null} for certain events, such as {@link #MOVE_SELF}. */ - public abstract void onEvent(int event, String path); + public abstract void onEvent(int event, @Nullable String path); } diff --git a/core/java/android/os/FileUtils.java b/core/java/android/os/FileUtils.java index fa32848e63626b61ba8123b5452a2375c378dd6d..8e24caf478393bc94ef80b9eec1349e0d47c9372 100644 --- a/core/java/android/os/FileUtils.java +++ b/core/java/android/os/FileUtils.java @@ -605,6 +605,22 @@ public class FileUtils { return null; } + private static File buildUniqueFileWithExtension(File parent, String name, String ext) + throws FileNotFoundException { + File file = buildFile(parent, name, ext); + + // If conflicting file, try adding counter suffix + int n = 0; + while (file.exists()) { + if (n++ >= 32) { + throw new FileNotFoundException("Failed to create unique file"); + } + file = buildFile(parent, name + " (" + n + ")", ext); + } + + return file; + } + /** * Generates a unique file name under the given parent directory. If the display name doesn't * have an extension that matches the requested MIME type, the default extension for that MIME @@ -619,20 +635,29 @@ public class FileUtils { public static File buildUniqueFile(File parent, String mimeType, String displayName) throws FileNotFoundException { final String[] parts = splitFileName(mimeType, displayName); - final String name = parts[0]; - final String ext = parts[1]; - File file = buildFile(parent, name, ext); + return buildUniqueFileWithExtension(parent, parts[0], parts[1]); + } - // If conflicting file, try adding counter suffix - int n = 0; - while (file.exists()) { - if (n++ >= 32) { - throw new FileNotFoundException("Failed to create unique file"); - } - file = buildFile(parent, name + " (" + n + ")", ext); + /** + * Generates a unique file name under the given parent directory, keeping + * any extension intact. + */ + public static File buildUniqueFile(File parent, String displayName) + throws FileNotFoundException { + final String name; + final String ext; + + // Extract requested extension from display name + final int lastDot = displayName.lastIndexOf('.'); + if (lastDot >= 0) { + name = displayName.substring(0, lastDot); + ext = displayName.substring(lastDot + 1); + } else { + name = displayName; + ext = null; } - return file; + return buildUniqueFileWithExtension(parent, name, ext); } /** diff --git a/core/java/android/os/IRecoverySystem.aidl b/core/java/android/os/IRecoverySystem.aidl index 12830a4996aa8e8ef551593255bb629ae98cff03..c5ceecd7c8b95ce39ab7af082ea314b0d1c3d8aa 100644 --- a/core/java/android/os/IRecoverySystem.aidl +++ b/core/java/android/os/IRecoverySystem.aidl @@ -25,4 +25,5 @@ interface IRecoverySystem { boolean uncrypt(in String packageFile, IRecoverySystemProgressListener listener); boolean setupBcb(in String command); boolean clearBcb(); + void rebootRecoveryWithCommand(in String command); } diff --git a/core/java/android/os/PatternMatcher.java b/core/java/android/os/PatternMatcher.java index 56dc837549a75ee9fe66ef4dc782717e74a1a476..3890fbfafb326f2e4bd297e0db5e9a8e0a606d19 100644 --- a/core/java/android/os/PatternMatcher.java +++ b/core/java/android/os/PatternMatcher.java @@ -16,6 +16,10 @@ package android.os; +import android.util.Log; + +import java.util.Arrays; + /** * A simple pattern matcher, which is safe to use on untrusted data: it does * not provide full reg-exp support, only simple globbing that can not be @@ -44,13 +48,59 @@ public class PatternMatcher implements Parcelable { * wildcard part of a normal regexp. */ public static final int PATTERN_SIMPLE_GLOB = 2; - + + /** + * Pattern type: the given pattern is interpreted with a regular + * expression-like syntax for matching against the string it is tested + * against. Supported tokens include dot ({@code .}) and sets ({@code [...]}) + * with full support for character ranges and the not ({@code ^}) modifier. + * Supported modifiers include star ({@code *}) for zero-or-more, plus ({@code +}) + * for one-or-more and full range ({@code {...}}) support. This is a simple + * evaulation implementation in which matching is done against the pattern in + * realtime with no backtracking support. + * + * {@hide} Pending approval for public API + */ + public static final int PATTERN_ADVANCED_GLOB = 3; + + // token types for advanced matching + private static final int TOKEN_TYPE_LITERAL = 0; + private static final int TOKEN_TYPE_ANY = 1; + private static final int TOKEN_TYPE_SET = 2; + private static final int TOKEN_TYPE_INVERSE_SET = 3; + + // Return for no match + private static final int NO_MATCH = -1; + + private static final String TAG = "PatternMatcher"; + + // Parsed placeholders for advanced patterns + private static final int PARSED_TOKEN_CHAR_SET_START = -1; + private static final int PARSED_TOKEN_CHAR_SET_INVERSE_START = -2; + private static final int PARSED_TOKEN_CHAR_SET_STOP = -3; + private static final int PARSED_TOKEN_CHAR_ANY = -4; + private static final int PARSED_MODIFIER_RANGE_START = -5; + private static final int PARSED_MODIFIER_RANGE_STOP = -6; + private static final int PARSED_MODIFIER_ZERO_OR_MORE = -7; + private static final int PARSED_MODIFIER_ONE_OR_MORE = -8; + private final String mPattern; private final int mType; - + private final int[] mParsedPattern; + + + private static final int MAX_PATTERN_STORAGE = 2048; + // workspace to use for building a parsed advanced pattern; + private static final int[] sParsedPatternScratch = new int[MAX_PATTERN_STORAGE]; + public PatternMatcher(String pattern, int type) { mPattern = pattern; mType = type; + if (mType == PATTERN_ADVANCED_GLOB) { + mParsedPattern = parseAndVerifyAdvancedPattern(pattern); + } else { + mParsedPattern = null; + } } public final String getPath() { @@ -62,7 +112,7 @@ public class PatternMatcher implements Parcelable { } public boolean match(String str) { - return matchPattern(mPattern, str, mType); + return matchPattern(str, mPattern, mParsedPattern, mType); } public String toString() { @@ -77,6 +127,9 @@ public class PatternMatcher implements Parcelable { case PATTERN_SIMPLE_GLOB: type = "GLOB: "; break; + case PATTERN_ADVANCED_GLOB: + type = "ADVANCED: "; + break; } return "PatternMatcher{" + type + mPattern + "}"; } @@ -88,11 +141,13 @@ public class PatternMatcher implements Parcelable { public void writeToParcel(Parcel dest, int flags) { dest.writeString(mPattern); dest.writeInt(mType); + dest.writeIntArray(mParsedPattern); } public PatternMatcher(Parcel src) { mPattern = src.readString(); mType = src.readInt(); + mParsedPattern = src.createIntArray(); } public static final Parcelable.Creator CREATOR @@ -106,16 +161,21 @@ public class PatternMatcher implements Parcelable { } }; - static boolean matchPattern(String pattern, String match, int type) { + static boolean matchPattern(String match, String pattern, int[] parsedPattern, int type) { if (match == null) return false; if (type == PATTERN_LITERAL) { return pattern.equals(match); } if (type == PATTERN_PREFIX) { return match.startsWith(pattern); - } else if (type != PATTERN_SIMPLE_GLOB) { - return false; + } else if (type == PATTERN_SIMPLE_GLOB) { + return matchGlobPattern(pattern, match); + } else if (type == PATTERN_ADVANCED_GLOB) { + return matchAdvancedPattern(parsedPattern, match); } - + return false; + } + + static boolean matchGlobPattern(String pattern, String match) { final int NP = pattern.length(); if (NP <= 0) { return match.length() <= 0; @@ -194,4 +254,310 @@ public class PatternMatcher implements Parcelable { return false; } -} + + /** + * Parses the advanced pattern and returns an integer array representation of it. The integer + * array treats each field as a character if positive and a unique token placeholder if + * negative. This method will throw on any pattern structure violations. + */ + synchronized static int[] parseAndVerifyAdvancedPattern(String pattern) { + int ip = 0; + final int LP = pattern.length(); + + int it = 0; + + boolean inSet = false; + boolean inRange = false; + boolean inCharClass = false; + + boolean addToParsedPattern; + + while (ip < LP) { + if (it > MAX_PATTERN_STORAGE - 3) { + throw new IllegalArgumentException("Pattern is too large!"); + } + + char c = pattern.charAt(ip); + addToParsedPattern = false; + + switch (c) { + case '[': + if (inSet) { + addToParsedPattern = true; // treat as literal or char class in set + } else { + if (pattern.charAt(ip + 1) == '^') { + sParsedPatternScratch[it++] = PARSED_TOKEN_CHAR_SET_INVERSE_START; + ip++; // skip over the '^' + } else { + sParsedPatternScratch[it++] = PARSED_TOKEN_CHAR_SET_START; + } + ip++; // move to the next pattern char + inSet = true; + continue; + } + break; + case ']': + if (!inSet) { + addToParsedPattern = true; // treat as literal outside of set + } else { + int parsedToken = sParsedPatternScratch[it - 1]; + if (parsedToken == PARSED_TOKEN_CHAR_SET_START || + parsedToken == PARSED_TOKEN_CHAR_SET_INVERSE_START) { + throw new IllegalArgumentException( + "You must define characters in a set."); + } + sParsedPatternScratch[it++] = PARSED_TOKEN_CHAR_SET_STOP; + inSet = false; + inCharClass = false; + } + break; + case '{': + if (!inSet) { + if (it == 0 || isParsedModifier(sParsedPatternScratch[it - 1])) { + throw new IllegalArgumentException("Modifier must follow a token."); + } + sParsedPatternScratch[it++] = PARSED_MODIFIER_RANGE_START; + ip++; + inRange = true; + } + break; + case '}': + if (inRange) { // only terminate the range if we're currently in one + sParsedPatternScratch[it++] = PARSED_MODIFIER_RANGE_STOP; + inRange = false; + } + break; + case '*': + if (!inSet) { + if (it == 0 || isParsedModifier(sParsedPatternScratch[it - 1])) { + throw new IllegalArgumentException("Modifier must follow a token."); + } + sParsedPatternScratch[it++] = PARSED_MODIFIER_ZERO_OR_MORE; + } + break; + case '+': + if (!inSet) { + if (it == 0 || isParsedModifier(sParsedPatternScratch[it - 1])) { + throw new IllegalArgumentException("Modifier must follow a token."); + } + sParsedPatternScratch[it++] = PARSED_MODIFIER_ONE_OR_MORE; + } + break; + case '.': + if (!inSet) { + sParsedPatternScratch[it++] = PARSED_TOKEN_CHAR_ANY; + } + break; + case '\\': // escape + if (ip + 1 >= LP) { + throw new IllegalArgumentException("Escape found at end of pattern!"); + } + c = pattern.charAt(++ip); + addToParsedPattern = true; + break; + default: + addToParsedPattern = true; + break; + } + if (inSet) { + if (inCharClass) { + sParsedPatternScratch[it++] = c; + inCharClass = false; + } else { + // look forward for character class + if (ip + 2 < LP + && pattern.charAt(ip + 1) == '-' + && pattern.charAt(ip + 2) != ']') { + inCharClass = true; + sParsedPatternScratch[it++] = c; // set first token as lower end of range + ip++; // advance past dash + } else { // literal + sParsedPatternScratch[it++] = c; // set first token as literal + sParsedPatternScratch[it++] = c; // set second set as literal + } + } + } else if (inRange) { + int endOfSet = pattern.indexOf('}', ip); + if (endOfSet < 0) { + throw new IllegalArgumentException("Range not ended with '}'"); + } + String rangeString = pattern.substring(ip, endOfSet); + int commaIndex = rangeString.indexOf(','); + try { + final int rangeMin; + final int rangeMax; + if (commaIndex < 0) { + int parsedRange = Integer.parseInt(rangeString); + rangeMin = rangeMax = parsedRange; + } else { + rangeMin = Integer.parseInt(rangeString.substring(0, commaIndex)); + if (commaIndex == rangeString.length() - 1) { // e.g. {n,} (n or more) + rangeMax = Integer.MAX_VALUE; + } else { + rangeMax = Integer.parseInt(rangeString.substring(commaIndex + 1)); + } + } + if (rangeMin > rangeMax) { + throw new IllegalArgumentException( + "Range quantifier minimum is greater than maximum"); + } + sParsedPatternScratch[it++] = rangeMin; + sParsedPatternScratch[it++] = rangeMax; + } catch (NumberFormatException e) { + throw new IllegalArgumentException("Range number format incorrect", e); + } + ip = endOfSet; + continue; // don't increment ip + } else if (addToParsedPattern) { + sParsedPatternScratch[it++] = c; + } + ip++; + } + if (inSet) { + throw new IllegalArgumentException("Set was not terminated!"); + } + return Arrays.copyOf(sParsedPatternScratch, it); + } + + private static boolean isParsedModifier(int parsedChar) { + return parsedChar == PARSED_MODIFIER_ONE_OR_MORE || + parsedChar == PARSED_MODIFIER_ZERO_OR_MORE || + parsedChar == PARSED_MODIFIER_RANGE_STOP || + parsedChar == PARSED_MODIFIER_RANGE_START; + } + + static boolean matchAdvancedPattern(int[] parsedPattern, String match) { + + // create indexes + int ip = 0, im = 0; + + // one-time length check + final int LP = parsedPattern.length, LM = match.length(); + + // The current character being analyzed in the pattern + int patternChar; + + int tokenType; + + int charSetStart = 0, charSetEnd = 0; + + while (ip < LP) { // we still have content in the pattern + + patternChar = parsedPattern[ip]; + // get the match type of the next verb + + switch (patternChar) { + case PARSED_TOKEN_CHAR_ANY: + tokenType = TOKEN_TYPE_ANY; + ip++; + break; + case PARSED_TOKEN_CHAR_SET_START: + case PARSED_TOKEN_CHAR_SET_INVERSE_START: + tokenType = patternChar == PARSED_TOKEN_CHAR_SET_START + ? TOKEN_TYPE_SET + : TOKEN_TYPE_INVERSE_SET; + charSetStart = ip + 1; // start from the char after the set start + while (++ip < LP && parsedPattern[ip] != PARSED_TOKEN_CHAR_SET_STOP); + charSetEnd = ip - 1; // we're on the set stop, end is the previous + ip++; // move the pointer to the next pattern entry + break; + default: + charSetStart = ip; + tokenType = TOKEN_TYPE_LITERAL; + ip++; + break; + } + + final int minRepetition; + final int maxRepetition; + + // look for a match length modifier + if (ip >= LP) { + minRepetition = maxRepetition = 1; + } else { + patternChar = parsedPattern[ip]; + switch (patternChar) { + case PARSED_MODIFIER_ZERO_OR_MORE: + minRepetition = 0; + maxRepetition = Integer.MAX_VALUE; + ip++; + break; + case PARSED_MODIFIER_ONE_OR_MORE: + minRepetition = 1; + maxRepetition = Integer.MAX_VALUE; + ip++; + break; + case PARSED_MODIFIER_RANGE_START: + minRepetition = parsedPattern[++ip]; + maxRepetition = parsedPattern[++ip]; + ip += 2; // step over PARSED_MODIFIER_RANGE_STOP and on to the next token + break; + default: + minRepetition = maxRepetition = 1; // implied literal + break; + } + } + if (minRepetition > maxRepetition) { + return false; + } + + // attempt to match as many characters as possible + int matched = matchChars(match, im, LM, tokenType, minRepetition, maxRepetition, + parsedPattern, charSetStart, charSetEnd); + + // if we found a conflict, return false immediately + if (matched == NO_MATCH) { + return false; + } + + // move the match pointer the number of characters matched + im += matched; + } + return ip >= LP && im >= LM; // have parsed entire string and regex + } + + private static int matchChars(String match, int im, final int lm, int tokenType, + int minRepetition, int maxRepetition, int[] parsedPattern, + int tokenStart, int tokenEnd) { + int matched = 0; + + while(matched < maxRepetition + && matchChar(match, im + matched, lm, tokenType, parsedPattern, tokenStart, + tokenEnd)) { + matched++; + } + + return matched < minRepetition ? NO_MATCH : matched; + } + + private static boolean matchChar(String match, int im, final int lm, int tokenType, + int[] parsedPattern, int tokenStart, int tokenEnd) { + if (im >= lm) { // we've overrun the string, no match + return false; + } + switch (tokenType) { + case TOKEN_TYPE_ANY: + return true; + case TOKEN_TYPE_SET: + for (int i = tokenStart; i < tokenEnd; i += 2) { + char matchChar = match.charAt(im); + if (matchChar >= parsedPattern[i] && matchChar <= parsedPattern[i + 1]) { + return true; + } + } + return false; + case TOKEN_TYPE_INVERSE_SET: + for (int i = tokenStart; i < tokenEnd; i += 2) { + char matchChar = match.charAt(im); + if (matchChar >= parsedPattern[i] && matchChar <= parsedPattern[i + 1]) { + return false; + } + } + return true; + case TOKEN_TYPE_LITERAL: + return match.charAt(im) == parsedPattern[tokenStart]; + default: + return false; + } + } +} \ No newline at end of file diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java index fc8ed3dd6542274487902a1ee9cb5e1cc59729b6..eba27991c314eec9b45abe7738a45830a77cf3cf 100644 --- a/core/java/android/os/PowerManager.java +++ b/core/java/android/os/PowerManager.java @@ -1355,6 +1355,11 @@ public final class PowerManager { mTag = tag; } + /** @hide */ + public String getTag() { + return mTag; + } + /** @hide */ public void setHistoryTag(String tag) { mHistoryTag = tag; @@ -1374,6 +1379,35 @@ public final class PowerManager { + " held=" + mHeld + ", refCount=" + mCount + "}"; } } + + /** + * Wraps a Runnable such that this method immediately acquires the wake lock and then + * once the Runnable is done the wake lock is released. + * + *

    Example: + * + *

    +         * mHandler.post(mWakeLock.wrap(() -> {
    +         *     // do things on handler, lock is held while we're waiting for this
    +         *     // to get scheduled and until the runnable is done executing.
    +         * });
    +         * 
    + * + *

    Note: you must make sure that the Runnable eventually gets executed, otherwise you'll + * leak the wakelock! + * + * @hide + */ + public Runnable wrap(Runnable r) { + acquire(); + return () -> { + try { + r.run(); + } finally { + release(); + } + }; + } } /** diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java index 507379baaa9495874a98d0640e0437dc8a54a180..d48431afe6913eca2ad5703428fe11d7678610c1 100644 --- a/core/java/android/os/RecoverySystem.java +++ b/core/java/android/os/RecoverySystem.java @@ -93,6 +93,14 @@ public class RecoverySystem { */ public static final File UNCRYPT_PACKAGE_FILE = new File(RECOVERY_DIR, "uncrypt_file"); + /** + * UNCRYPT_STATUS_FILE stores the time cost (and error code in the case of a failure) + * of uncrypt. + * + * @hide + */ + public static final File UNCRYPT_STATUS_FILE = new File(RECOVERY_DIR, "uncrypt_status"); + // Length limits for reading files. private static final int LOG_FILE_MAX_LENGTH = 64 * 1024; @@ -692,28 +700,22 @@ public class RecoverySystem { * @throws IOException if something goes wrong. */ private static void bootCommand(Context context, String... args) throws IOException { - synchronized (sRequestLock) { - LOG_FILE.delete(); + LOG_FILE.delete(); - StringBuilder command = new StringBuilder(); - for (String arg : args) { - if (!TextUtils.isEmpty(arg)) { - command.append(arg); - command.append("\n"); - } + StringBuilder command = new StringBuilder(); + for (String arg : args) { + if (!TextUtils.isEmpty(arg)) { + command.append(arg); + command.append("\n"); } + } - // Write the command into BCB (bootloader control block). - RecoverySystem rs = (RecoverySystem) context.getSystemService( - Context.RECOVERY_SERVICE); - rs.setupBcb(command.toString()); - - // Having set up the BCB, go ahead and reboot. - PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); - pm.reboot(PowerManager.REBOOT_RECOVERY); + // Write the command into BCB (bootloader control block) and boot from + // there. Will not return unless failed. + RecoverySystem rs = (RecoverySystem) context.getSystemService(Context.RECOVERY_SERVICE); + rs.rebootRecoveryWithCommand(command.toString()); - throw new IOException("Reboot failed (no permissions?)"); - } + throw new IOException("Reboot failed (no permissions?)"); } // Read last_install; then report time (in seconds) and I/O (in MiB) for @@ -724,6 +726,7 @@ public class RecoverySystem { String line = null; int bytesWrittenInMiB = -1, bytesStashedInMiB = -1; int timeTotal = -1; + int uncryptTime = -1; int sourceVersion = -1; while ((line = in.readLine()) != null) { // Here is an example of lines in last_install: @@ -759,6 +762,8 @@ public class RecoverySystem { if (line.startsWith("time")) { timeTotal = scaled; + } else if (line.startsWith("uncrypt_time")) { + uncryptTime = scaled; } else if (line.startsWith("source_build")) { sourceVersion = scaled; } else if (line.startsWith("bytes_written")) { @@ -774,6 +779,9 @@ public class RecoverySystem { if (timeTotal != -1) { MetricsLogger.histogram(context, "ota_time_total", timeTotal); } + if (uncryptTime != -1) { + MetricsLogger.histogram(context, "ota_uncrypt_time", uncryptTime); + } if (sourceVersion != -1) { MetricsLogger.histogram(context, "ota_source_version", sourceVersion); } @@ -901,6 +909,17 @@ public class RecoverySystem { return false; } + /** + * Talks to RecoverySystemService via Binder to set up the BCB command and + * reboot into recovery accordingly. + */ + private void rebootRecoveryWithCommand(String command) { + try { + mService.rebootRecoveryWithCommand(command); + } catch (RemoteException ignored) { + } + } + /** * Internally, recovery treats each line of the command file as a separate * argv, so we only need to protect against newlines and nulls. diff --git a/core/java/android/os/RemoteCallbackList.java b/core/java/android/os/RemoteCallbackList.java index 5849350cc49ebb885e41587ec41c90b164fdefd3..3546e17698b9fa867f20aa13236330c1c6e2f39a 100644 --- a/core/java/android/os/RemoteCallbackList.java +++ b/core/java/android/os/RemoteCallbackList.java @@ -288,20 +288,22 @@ public class RemoteCallbackList { * @see #beginBroadcast */ public void finishBroadcast() { - if (mBroadcastCount < 0) { - throw new IllegalStateException( - "finishBroadcast() called outside of a broadcast"); - } - - Object[] active = mActiveBroadcast; - if (active != null) { - final int N = mBroadcastCount; - for (int i=0; iThis value is typically filled in by the dialer app for the caching purpose, + * so it's not guaranteed to be present, and may not be current if the contact + * information associated with this number has changed. *

    Type: TEXT

    */ public static final String CACHED_NAME = "name"; @@ -313,8 +315,10 @@ public class CallLog { /** * The cached number type (Home, Work, etc) associated with the * phone number, if it exists. - * This value is not guaranteed to be current, if the contact information - * associated with this number has changed. + * + *

    This value is typically filled in by the dialer app for the caching purpose, + * so it's not guaranteed to be present, and may not be current if the contact + * information associated with this number has changed. *

    Type: INTEGER

    */ public static final String CACHED_NUMBER_TYPE = "numbertype"; @@ -322,8 +326,10 @@ public class CallLog { /** * The cached number label, for a custom number type, associated with the * phone number, if it exists. - * This value is not guaranteed to be current, if the contact information - * associated with this number has changed. + * + *

    This value is typically filled in by the dialer app for the caching purpose, + * so it's not guaranteed to be present, and may not be current if the contact + * information associated with this number has changed. *

    Type: TEXT

    */ public static final String CACHED_NUMBER_LABEL = "numberlabel"; @@ -359,40 +365,50 @@ public class CallLog { /** * The cached URI to look up the contact associated with the phone number, if it exists. - * This value may not be current if the contact information associated with this number - * has changed. + * + *

    This value is typically filled in by the dialer app for the caching purpose, + * so it's not guaranteed to be present, and may not be current if the contact + * information associated with this number has changed. *

    Type: TEXT

    */ public static final String CACHED_LOOKUP_URI = "lookup_uri"; /** * The cached phone number of the contact which matches this entry, if it exists. - * This value may not be current if the contact information associated with this number - * has changed. + * + *

    This value is typically filled in by the dialer app for the caching purpose, + * so it's not guaranteed to be present, and may not be current if the contact + * information associated with this number has changed. *

    Type: TEXT

    */ public static final String CACHED_MATCHED_NUMBER = "matched_number"; /** * The cached normalized(E164) version of the phone number, if it exists. - * This value may not be current if the contact information associated with this number - * has changed. + * + *

    This value is typically filled in by the dialer app for the caching purpose, + * so it's not guaranteed to be present, and may not be current if the contact + * information associated with this number has changed. *

    Type: TEXT

    */ public static final String CACHED_NORMALIZED_NUMBER = "normalized_number"; /** * The cached photo id of the picture associated with the phone number, if it exists. - * This value may not be current if the contact information associated with this number - * has changed. + * + *

    This value is typically filled in by the dialer app for the caching purpose, + * so it's not guaranteed to be present, and may not be current if the contact + * information associated with this number has changed. *

    Type: INTEGER (long)

    */ public static final String CACHED_PHOTO_ID = "photo_id"; /** * The cached photo URI of the picture associated with the phone number, if it exists. - * This value may not be current if the contact information associated with this number - * has changed. + * + *

    This value is typically filled in by the dialer app for the caching purpose, + * so it's not guaranteed to be present, and may not be current if the contact + * information associated with this number has changed. *

    Type: TEXT (URI)

    */ public static final String CACHED_PHOTO_URI = "photo_uri"; @@ -400,9 +416,10 @@ public class CallLog { /** * The cached phone number, formatted with formatting rules based on the country the * user was in when the call was made or received. - * This value is not guaranteed to be present, and may not be current if the contact - * information associated with this number - * has changed. + * + *

    This value is typically filled in by the dialer app for the caching purpose, + * so it's not guaranteed to be present, and may not be current if the contact + * information associated with this number has changed. *

    Type: TEXT

    */ public static final String CACHED_FORMATTED_NUMBER = "formatted_number"; diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java index 52b00e91f9777230446173f38787fd5cefb7b594..e5ba321c684eda91936f11f13a060ddd5f762771 100644 --- a/core/java/android/provider/ContactsContract.java +++ b/core/java/android/provider/ContactsContract.java @@ -35,6 +35,7 @@ import android.content.Intent; import android.content.res.AssetFileDescriptor; import android.content.res.Resources; import android.database.Cursor; +import android.database.CursorWrapper; import android.database.DatabaseUtils; import android.graphics.Rect; import android.net.Uri; @@ -138,8 +139,20 @@ public final class ContactsContract { public static final String DIRECTORY_PARAM_KEY = "directory"; /** - * A query parameter that limits the number of results returned. The + * A query parameter that limits the number of results returned for supported URIs. The * parameter value should be an integer. + * + *

    This parameter is not supported by all URIs. Supported URIs include, but not limited to, + * {@link Contacts#CONTENT_URI}, + * {@link RawContacts#CONTENT_URI}, + * {@link Data#CONTENT_URI}, + * {@link CommonDataKinds.Phone#CONTENT_URI}, + * {@link CommonDataKinds.Callable#CONTENT_URI}, + * {@link CommonDataKinds.Email#CONTENT_URI}, + * {@link CommonDataKinds.Contactables#CONTENT_URI}, + * + *

    In order to limit the number of rows returned by a non-supported URI, you can implement a + * {@link CursorWrapper} and override the {@link CursorWrapper#getCount()} methods. */ public static final String LIMIT_PARAM_KEY = "limit"; @@ -437,6 +450,9 @@ public final class ContactsContract { /** * _ID of the default directory, which represents locally stored contacts. + * This is only supported by {@link ContactsContract.Contacts#CONTENT_URI} and + * {@link ContactsContract.Contacts#CONTENT_FILTER_URI}. + * Other URLs do not support the concept of "visible" or "invisible" contacts. */ public static final long DEFAULT = 0; diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 0645dd8af678d4d63dc3687a6e385c8e9f742fc7..24f6b8450fab5605285dc1631315d980386f50ad 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -44,7 +44,6 @@ import android.net.ConnectivityManager; import android.net.Uri; import android.net.wifi.WifiManager; import android.os.BatteryManager; -import android.os.Binder; import android.os.Bundle; import android.os.DropBoxManager; import android.os.IBinder; @@ -1299,6 +1298,19 @@ public final class Settings { public static final String ACTION_VR_LISTENER_SETTINGS = "android.settings.VR_LISTENER_SETTINGS"; + /** + * Activity Action: Show Storage Manager settings. + *

    + * Input: Nothing. + *

    + * Output: Nothing. + * + * @hide + */ + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) + public static final String ACTION_STORAGE_MANAGER_SETTINGS + = "android.settings.STORAGE_MANAGER_SETTINGS"; + /** * Activity Action: Allows user to select current webview implementation. *

    @@ -1859,7 +1871,6 @@ public final class Settings { MOVED_TO_GLOBAL.add(Settings.Global.CALL_AUTO_RETRY); MOVED_TO_GLOBAL.add(Settings.Global.DEBUG_APP); MOVED_TO_GLOBAL.add(Settings.Global.WAIT_FOR_DEBUGGER); - MOVED_TO_GLOBAL.add(Settings.Global.SHOW_PROCESSES); MOVED_TO_GLOBAL.add(Settings.Global.ALWAYS_FINISH_ACTIVITIES); MOVED_TO_GLOBAL.add(Settings.Global.TZINFO_UPDATE_CONTENT_URL); MOVED_TO_GLOBAL.add(Settings.Global.TZINFO_UPDATE_METADATA_URL); @@ -2862,7 +2873,8 @@ public final class Settings { /** * Control whether the process CPU usage meter should be shown. * - * @deprecated Use {@link Global#SHOW_PROCESSES} instead + * @deprecated This functionality is no longer available as of + * {@link android.os.Build.VERSION_CODES#N_MR1}. */ @Deprecated public static final String SHOW_PROCESSES = Global.SHOW_PROCESSES; @@ -6023,6 +6035,8 @@ public final class Settings { /** * If nonzero, ANRs in invisible background processes bring up a dialog. * Otherwise, the process will be silently killed. + * + * Also prevents ANRs and crash dialogs from being suppressed. * @hide */ public static final String ANR_SHOW_BACKGROUND = "anr_show_background"; @@ -6110,6 +6124,18 @@ public final class Settings { */ public static final String DOZE_ENABLED = "doze_enabled"; + /** + * Whether the device should pulse on pick up gesture. + * @hide + */ + public static final String DOZE_PULSE_ON_PICK_UP = "doze_pulse_on_pick_up"; + + /** + * Whether the device should pulse on double tap gesture. + * @hide + */ + public static final String DOZE_PULSE_ON_DOUBLE_TAP = "doze_pulse_on_double_tap"; + /** * The current night mode that has been selected by the user. Owned * and controlled by UiModeManagerService. Constants are as per @@ -6524,6 +6550,13 @@ public final class Settings { public static final String DEMO_USER_SETUP_COMPLETE = "demo_user_setup_complete"; + /** + * Specifies whether the web action API is enabled. + * + * @hide + */ + public static final String WEB_ACTION_ENABLED = "web_action_enabled"; + /** * This are the settings to be backed up. * @@ -6607,6 +6640,9 @@ public final class Settings { CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, SYSTEM_NAVIGATION_KEYS_ENABLED, QS_TILES, + DOZE_ENABLED, + DOZE_PULSE_ON_PICK_UP, + DOZE_PULSE_ON_DOUBLE_TAP }; /** @@ -8158,11 +8194,36 @@ public final class Settings { /** * The server used for captive portal detection upon a new conection. A * 204 response code from the server is used for validation. + * TODO: remove this deprecated symbol. * * @hide */ public static final String CAPTIVE_PORTAL_SERVER = "captive_portal_server"; + /** + * The URL used for HTTPS captive portal detection upon a new connection. + * A 204 response code from the server is used for validation. + * + * @hide + */ + public static final String CAPTIVE_PORTAL_HTTPS_URL = "captive_portal_https_url"; + + /** + * The URL used for HTTP captive portal detection upon a new connection. + * A 204 response code from the server is used for validation. + * + * @hide + */ + public static final String CAPTIVE_PORTAL_HTTP_URL = "captive_portal_http_url"; + + /** + * The URL used for fallback HTTP captive portal detection when previous HTTP + * and HTTPS captive portal detection attemps did not return a conclusive answer. + * + * @hide + */ + public static final String CAPTIVE_PORTAL_FALLBACK_URL = "captive_portal_fallback_url"; + /** * Whether to use HTTPS for network validation. This is enabled by default and the setting * needs to be set to 0 to disable it. This setting is a misnomer because captive portals @@ -8172,6 +8233,14 @@ public final class Settings { */ public static final String CAPTIVE_PORTAL_USE_HTTPS = "captive_portal_use_https"; + /** + * Which User-Agent string to use in the header of the captive portal detection probes. + * The User-Agent field is unset when this setting has no value (HttpUrlConnection default). + * + * @hide + */ + public static final String CAPTIVE_PORTAL_USER_AGENT = "captive_portal_user_agent"; + /** * Whether network service discovery is enabled. * @@ -8544,6 +8613,13 @@ public final class Settings { */ public static final String CALL_AUTO_RETRY = "call_auto_retry"; + /** + * A setting that can be read whether the emergency affordance is currently needed. + * The value is a boolean (1 or 0). + * @hide + */ + public static final String EMERGENCY_AFFORDANCE_NEEDED = "emergency_affordance_needed"; + /** * See RIL_PreferredNetworkType in ril.h * @hide @@ -8564,7 +8640,11 @@ public final class Settings { /** * Control whether the process CPU usage meter should be shown. + * + * @deprecated This functionality is no longer available as of + * {@link android.os.Build.VERSION_CODES#N_MR1}. */ + @Deprecated public static final String SHOW_PROCESSES = "show_processes"; /** @@ -8885,7 +8965,7 @@ public final class Settings { public static final String WFC_IMS_ENABLED = "wfc_ims_enabled"; /** - * WFC Mode. + * WFC mode on home/non-roaming network. *

    * Type: int - 2=Wi-Fi preferred, 1=Cellular preferred, 0=Wi-Fi only * @@ -8893,6 +8973,15 @@ public final class Settings { */ public static final String WFC_IMS_MODE = "wfc_ims_mode"; + /** + * WFC mode on roaming network. + *

    + * Type: int - see {@link WFC_IMS_MODE} for values + * + * @hide + */ + public static final String WFC_IMS_ROAMING_MODE = "wfc_ims_roaming_mode"; + /** * Whether WFC roaming is enabled *

    @@ -8920,6 +9009,16 @@ public final class Settings { public static final String EPHEMERAL_COOKIE_MAX_SIZE_BYTES = "ephemeral_cookie_max_size_bytes"; + /** + * Toggle to enable/disable the entire ephemeral feature. By default, ephemeral is + * enabled. Set to zero to disable. + *

    + * Type: int (0 for false, 1 for true) + * + * @hide + */ + public static final String ENABLE_EPHEMERAL_FEATURE = "enable_ephemeral_feature"; + /** * A mask applied to the ephemeral hash to generate the hash prefix. *

    @@ -8998,6 +9097,16 @@ public final class Settings { */ public static final String RETAIL_DEMO_MODE_CONSTANTS = "retail_demo_mode_constants"; + /** + * The reason for the settings database being downgraded. This is only for + * troubleshooting purposes and its value should not be interpreted in any way. + * + * Type: string + * + * @hide + */ + public static final String DATABASE_DOWNGRADE_REASON = "database_downgrade_reason"; + /** * Settings to backup. This is here so that it's in the same place as the settings * keys and easy to update. diff --git a/core/java/android/security/net/config/DirectoryCertificateSource.java b/core/java/android/security/net/config/DirectoryCertificateSource.java index e3c9d659c91bb579dcecc3419cbbf1771cca2bfa..119f5d0de0a06c9859c795ec07407485be887640 100644 --- a/core/java/android/security/net/config/DirectoryCertificateSource.java +++ b/core/java/android/security/net/config/DirectoryCertificateSource.java @@ -19,6 +19,7 @@ package android.security.net.config; import android.os.Environment; import android.os.UserHandle; import android.util.ArraySet; +import android.util.Log; import android.util.Pair; import java.io.BufferedInputStream; import java.io.File; @@ -44,6 +45,7 @@ import javax.security.auth.x500.X500Principal; * @hide */ abstract class DirectoryCertificateSource implements CertificateSource { + private static final String LOG_TAG = "DirectoryCertificateSrc"; private final File mDir; private final Object mLock = new Object(); private final CertificateFactory mCertFactory; @@ -149,6 +151,9 @@ abstract class DirectoryCertificateSource implements CertificateSource { continue; } X509Certificate cert = readCertificate(fileName); + if (cert == null) { + continue; + } if (!subj.equals(cert.getSubjectX500Principal())) { continue; } @@ -173,6 +178,9 @@ abstract class DirectoryCertificateSource implements CertificateSource { continue; } X509Certificate cert = readCertificate(fileName); + if (cert == null) { + continue; + } if (!subj.equals(cert.getSubjectX500Principal())) { continue; } @@ -194,6 +202,7 @@ abstract class DirectoryCertificateSource implements CertificateSource { is = new BufferedInputStream(new FileInputStream(new File(mDir, file))); return (X509Certificate) mCertFactory.generateCertificate(is); } catch (CertificateException | IOException e) { + Log.e(LOG_TAG, "Failed to read certificate from " + file, e); return null; } finally { IoUtils.closeQuietly(is); diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java index 0557d138eb741a11c77d43c22d2577b274bfe1bd..94505d37310deebd319f9b8e326f48cbab0d5766 100644 --- a/core/java/android/service/dreams/DreamService.java +++ b/core/java/android/service/dreams/DreamService.java @@ -27,6 +27,7 @@ import android.graphics.PixelFormat; import android.graphics.drawable.ColorDrawable; import android.os.Handler; import android.os.IBinder; +import android.os.IRemoteCallback; import android.os.PowerManager; import android.os.RemoteException; import android.os.ServiceManager; @@ -942,8 +943,9 @@ public class DreamService extends Service implements Window.Callback { * Must run on mHandler. * * @param windowToken A window token that will allow a window to be created in the correct layer. + * @param started A callback that will be invoked once onDreamingStarted has completed. */ - private final void attach(IBinder windowToken, boolean canDoze) { + private final void attach(IBinder windowToken, boolean canDoze, IRemoteCallback started) { if (mWindowToken != null) { Slog.e(TAG, "attach() called when already attached with token=" + mWindowToken); return; @@ -1017,7 +1019,15 @@ public class DreamService extends Service implements Window.Callback { if (mWindow != null || mWindowless) { if (mDebug) Slog.v(TAG, "Calling onDreamingStarted()"); mStarted = true; - onDreamingStarted(); + try { + onDreamingStarted(); + } finally { + try { + started.sendResult(null); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } } } }); @@ -1092,11 +1102,12 @@ public class DreamService extends Service implements Window.Callback { private final class DreamServiceWrapper extends IDreamService.Stub { @Override - public void attach(final IBinder windowToken, final boolean canDoze) { + public void attach(final IBinder windowToken, final boolean canDoze, + IRemoteCallback started) { mHandler.post(new Runnable() { @Override public void run() { - DreamService.this.attach(windowToken, canDoze); + DreamService.this.attach(windowToken, canDoze, started); } }); } diff --git a/core/java/android/service/dreams/IDreamService.aidl b/core/java/android/service/dreams/IDreamService.aidl index 9bb18044e3eab7b8d1b6daa086dd59f5ffa2b778..ce04354989179e46cc49fc29ea4f7b071bc57ebd 100644 --- a/core/java/android/service/dreams/IDreamService.aidl +++ b/core/java/android/service/dreams/IDreamService.aidl @@ -16,11 +16,13 @@ package android.service.dreams; +import android.os.IRemoteCallback; + /** * @hide */ oneway interface IDreamService { - void attach(IBinder windowToken, boolean canDoze); + void attach(IBinder windowToken, boolean canDoze, IRemoteCallback started); void detach(); void wakeUp(); } diff --git a/core/java/android/util/DisplayMetrics.java b/core/java/android/util/DisplayMetrics.java index f4db4d6611eaff35e44182a377d82ade4dbe652c..b7099b642e98a38c28b2c292e84033e413afcfe5 100644 --- a/core/java/android/util/DisplayMetrics.java +++ b/core/java/android/util/DisplayMetrics.java @@ -268,6 +268,10 @@ public class DisplayMetrics { } public void setTo(DisplayMetrics o) { + if (this == o) { + return; + } + widthPixels = o.widthPixels; heightPixels = o.heightPixels; density = o.density; diff --git a/core/java/android/util/PackageUtils.java b/core/java/android/util/PackageUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..6531aef9a50ca1765a926c948c50276c2e12a464 --- /dev/null +++ b/core/java/android/util/PackageUtils.java @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2016 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 android.util; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.Signature; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +/** + * Helper functions applicable to packages. + * @hide + */ +public final class PackageUtils { + private final static char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray(); + + private PackageUtils() { + /* hide constructor */ + } + + /** + * Computes the SHA256 digest of the signing cert for a package. + * @param packageManager The package manager. + * @param packageName The package for which to generate the digest. + * @param userId The user for which to generate the digest. + * @return The digest or null if the package does not exist for this user. + */ + public static @Nullable String computePackageCertSha256Digest( + @NonNull PackageManager packageManager, + @NonNull String packageName, int userId) { + final PackageInfo packageInfo; + try { + packageInfo = packageManager.getPackageInfoAsUser(packageName, + PackageManager.GET_SIGNATURES, userId); + } catch (PackageManager.NameNotFoundException e) { + return null; + } + return computeCertSha256Digest(packageInfo.signatures[0]); + } + + /** + * Computes the SHA256 digest of a cert. + * @param signature The signature. + * @return The digest or null if an error occurs. + */ + public static @Nullable String computeCertSha256Digest(@NonNull Signature signature) { + return computeSha256Digest(signature.toByteArray()); + } + + /** + * Computes the SHA256 digest of some data. + * @param data The data. + * @return The digest or null if an error occurs. + */ + public static @Nullable String computeSha256Digest(@NonNull byte[] data) { + MessageDigest messageDigest; + try { + messageDigest = MessageDigest.getInstance("SHA256"); + } catch (NoSuchAlgorithmException e) { + /* can't happen */ + return null; + } + + messageDigest.update(data); + + final byte[] digest = messageDigest.digest(); + final int digestLength = digest.length; + final int charCount = 2 * digestLength; + + final char[] chars = new char[charCount]; + for (int i = 0; i < digestLength; i++) { + final int byteHex = digest[i] & 0xFF; + chars[i * 2] = HEX_ARRAY[byteHex >>> 4]; + chars[i * 2 + 1] = HEX_ARRAY[byteHex & 0x0F]; + } + return new String(chars); + } +} diff --git a/core/java/android/view/DragEvent.java b/core/java/android/view/DragEvent.java index b0f15b5f2329fceb11b5ac94e4592cce11afc760..2baa0b4691ab6a6ef5ef46edcc0ef2931af4e3d8 100644 --- a/core/java/android/view/DragEvent.java +++ b/core/java/android/view/DragEvent.java @@ -134,6 +134,7 @@ public class DragEvent implements Parcelable { Object mLocalState; boolean mDragResult; + boolean mEventHandlerWasCalled; private DragEvent mNext; private RuntimeException mRecycledLocation; @@ -152,12 +153,16 @@ public class DragEvent implements Parcelable { * if it can accept a drop. The onDragEvent() or onDrag() methods usually inspect the metadata * from {@link #getClipDescription()} to determine if they can accept the data contained in * this drag. For an operation that doesn't represent data transfer, these methods may - * perform other actions to determine whether or not the View should accept the drag. + * perform other actions to determine whether or not the View should accept the data. * If the View wants to indicate that it is a valid drop target, it can also react by * changing its appearance. *

    - * A View only receives further drag events if it returns {@code true} in response to - * ACTION_DRAG_STARTED. + * Views added or becoming visible for the first time during a drag operation receive this + * event when they are added or becoming visible. + *

    + *

    + * A View only receives further drag events if it returns {@code true} in response to + * ACTION_DRAG_STARTED. *

    * @see #ACTION_DRAG_ENDED * @see #getX() @@ -176,9 +181,10 @@ public class DragEvent implements Parcelable { *

    *

    * The system stops sending ACTION_DRAG_LOCATION events to a View once the user moves the - * drag shadow out of the View object's bounding box. If the user moves the drag shadow back - * into the View object's bounding box, the View receives an ACTION_DRAG_ENTERED again before - * receiving any more ACTION_DRAG_LOCATION events. + * drag shadow out of the View object's bounding box or into a descendant view that can accept + * the data. If the user moves the drag shadow back into the View object's bounding box or out + * of a descendant view that can accept the data, the View receives an ACTION_DRAG_ENTERED again + * before receiving any more ACTION_DRAG_LOCATION events. *

    * @see #ACTION_DRAG_ENTERED * @see #getX() @@ -188,7 +194,8 @@ public class DragEvent implements Parcelable { /** * Action constant returned by {@link #getAction()}: Signals to a View that the user - * has released the drag shadow, and the drag point is within the bounding box of the View. + * has released the drag shadow, and the drag point is within the bounding box of the View and + * not within a descendant view that can accept the data. * The View should retrieve the data from the DragEvent by calling {@link #getClipData()}. * The methods {@link #getX()} and {@link #getY()} return the X and Y position of the drop point * within the View object's bounding box. @@ -211,8 +218,10 @@ public class DragEvent implements Parcelable { * operation has concluded. A View that changed its appearance during the operation should * return to its usual drawing state in response to this event. *

    - * All views that received an ACTION_DRAG_STARTED event will receive the - * ACTION_DRAG_ENDED event even if they are not currently visible when the drag ends. + * All views with listeners that returned boolean true for the ACTION_DRAG_STARTED + * event will receive the ACTION_DRAG_ENDED event even if they are not currently visible when + * the drag ends. Views removed during the drag operation won't receive the ACTION_DRAG_ENDED + * event. *

    *

    * The View object can call {@link #getResult()} to see the result of the operation. @@ -233,9 +242,10 @@ public class DragEvent implements Parcelable { * drop target. *

    * The system stops sending ACTION_DRAG_LOCATION events to a View once the user moves the - * drag shadow out of the View object's bounding box. If the user moves the drag shadow back - * into the View object's bounding box, the View receives an ACTION_DRAG_ENTERED again before - * receiving any more ACTION_DRAG_LOCATION events. + * drag shadow out of the View object's bounding box or into a descendant view that can accept + * the data. If the user moves the drag shadow back into the View object's bounding box or out + * of a descendant view that can accept the data, the View receives an ACTION_DRAG_ENTERED again + * before receiving any more ACTION_DRAG_LOCATION events. *

    * @see #ACTION_DRAG_ENTERED * @see #ACTION_DRAG_LOCATION @@ -244,7 +254,8 @@ public class DragEvent implements Parcelable { /** * Action constant returned by {@link #getAction()}: Signals that the user has moved the - * drag shadow outside the bounding box of the View. + * drag shadow out of the bounding box of the View or into a descendant view that can accept + * the data. * The View can react by changing its appearance in a way that tells the user that * View is no longer the immediate drop target. *

    @@ -377,6 +388,10 @@ public class DragEvent implements Parcelable { * The object is intended to provide local information about the drag and drop operation. For * example, it can indicate whether the drag and drop operation is a copy or a move. *

    + * The local state is available only to views in the activity which has started the drag + * operation. In all other activities this method will return null + *

    + *

    * This method returns valid data for all event actions except for {@link #ACTION_DRAG_ENDED}. *

    * @return The local state object sent to the system by startDrag(). @@ -435,6 +450,7 @@ public class DragEvent implements Parcelable { mClipData = null; mClipDescription = null; mLocalState = null; + mEventHandlerWasCalled = false; synchronized (gRecyclerLock) { if (gRecyclerUsed < MAX_RECYCLED) { diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index cdd34aff3bcbdb4fa8d8cc2547f7b07b79c6b6fc..d402d6662733cbc21d912a285ee5158cd5648df0 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -73,8 +73,8 @@ interface IWindowManager void clearForcedDisplaySize(int displayId); int getInitialDisplayDensity(int displayId); int getBaseDisplayDensity(int displayId); - void setForcedDisplayDensity(int displayId, int density); - void clearForcedDisplayDensity(int displayId); + void setForcedDisplayDensityForUser(int displayId, int density, int userId); + void clearForcedDisplayDensityForUser(int displayId, int userId); void setForcedDisplayScalingMode(int displayId, int mode); // 0 = auto, 1 = disable void setOverscan(int displayId, int left, int top, int right, int bottom); @@ -330,6 +330,16 @@ interface IWindowManager */ oneway void statusBarVisibilityChanged(int visibility); + /** + * Called by System UI to notify of changes to the visibility of Recents. + */ + oneway void setRecentsVisibility(boolean visible); + + /** + * Called by System UI to notify of changes to the visibility of PIP. + */ + oneway void setTvPipVisibility(boolean visible); + /** * Device has a software navigation bar (separate from the status bar). */ diff --git a/core/java/android/view/KeyEvent.java b/core/java/android/view/KeyEvent.java index 38635c6ced4cd8c86b6494f714f48f65a8cca91f..934c6b23bffcafdaeda0ad40979cd4c428bd2195 100644 --- a/core/java/android/view/KeyEvent.java +++ b/core/java/android/view/KeyEvent.java @@ -1289,8 +1289,9 @@ public class KeyEvent extends InputEvent implements Parcelable { boolean onKeyUp(int keyCode, KeyEvent event); /** - * Called when multiple down/up pairs of the same key have occurred - * in a row. + * Called when a user's interaction with an analog control, such as + * flinging a trackball, generates simulated down/up events for the same + * key multiple times in quick succession. * * @param keyCode The value in event.getKeyCode(). * @param count Number of pairs as returned by event.getRepeatCount(). diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java index 286e0979d12b73b9ccdb3363fdbd6dea9d9787dc..22e68a3b909cb0c9b7cbca420f372b3e808b8025 100644 --- a/core/java/android/view/Surface.java +++ b/core/java/android/view/Surface.java @@ -33,6 +33,18 @@ import dalvik.system.CloseGuard; /** * Handle onto a raw buffer that is being managed by the screen compositor. + * + *

    A Surface is generally created by or from a consumer of image buffers (such as a + * {@link android.graphics.SurfaceTexture}, {@link android.media.MediaRecorder}, or + * {@link android.renderscript.Allocation}), and is handed to some kind of producer (such as + * {@link android.opengl.EGL14#eglCreateWindowSurface(android.opengl.EGLDisplay,android.opengl.EGLConfig,java.lang.Object,int[],int) OpenGL}, + * {@link android.media.MediaPlayer#setSurface MediaPlayer}, or + * {@link android.hardware.camera2.CameraDevice#createCaptureSession CameraDevice}) to draw + * into.

    + * + *

    Note: A Surface acts like a + * {@link java.lang.ref.WeakReference weak reference} to the consumer it is associated with. By + * itself it will not keep its parent consumer from being reclaimed.

    */ public class Surface implements Parcelable { private static final String TAG = "Surface"; @@ -59,6 +71,7 @@ public class Surface implements Parcelable { private static native long nativeGetNextFrameNumber(long nativeObject); private static native int nativeSetScalingMode(long nativeObject, int scalingMode); private static native void nativeSetBuffersTransform(long nativeObject, long transform); + private static native int nativeForceScopedDisconnect(long nativeObject); public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { @@ -96,6 +109,8 @@ public class Surface implements Parcelable { private HwuiContext mHwuiContext; + private boolean mIsSingleBuffered; + /** @hide */ @Retention(RetentionPolicy.SOURCE) @IntDef({SCALING_MODE_FREEZE, SCALING_MODE_SCALE_TO_WINDOW, @@ -158,7 +173,7 @@ public class Surface implements Parcelable { if (surfaceTexture == null) { throw new IllegalArgumentException("surfaceTexture must not be null"); } - + mIsSingleBuffered = surfaceTexture.isSingleBuffered(); synchronized (mLock) { mName = surfaceTexture.toString(); setNativeObjectLocked(nativeCreateFromSurfaceTexture(surfaceTexture)); @@ -457,7 +472,10 @@ public class Surface implements Parcelable { // create a new native Surface and return it after reducing // the reference count on mNativeObject. Either way, it is // not necessary to call nativeRelease() here. + // NOTE: This must be kept synchronized with the native parceling code + // in frameworks/native/libs/Surface.cpp mName = source.readString(); + mIsSingleBuffered = source.readInt() != 0; setNativeObjectLocked(nativeReadFromParcel(mNativeObject, source)); } } @@ -468,7 +486,10 @@ public class Surface implements Parcelable { throw new IllegalArgumentException("dest must not be null"); } synchronized (mLock) { + // NOTE: This must be kept synchronized with the native parceling code + // in frameworks/native/libs/Surface.cpp dest.writeString(mName); + dest.writeInt(mIsSingleBuffered ? 1 : 0); nativeWriteToParcel(mNativeObject, dest); } if ((flags & Parcelable.PARCELABLE_WRITE_RETURN_VALUE) != 0) { @@ -530,6 +551,24 @@ public class Surface implements Parcelable { } } + void forceScopedDisconnect() { + synchronized (mLock) { + checkNotReleasedLocked(); + int err = nativeForceScopedDisconnect(mNativeObject); + if (err != 0) { + throw new RuntimeException("Failed to disconnect Surface instance (bad object?)"); + } + } + } + + /** + * Returns whether or not this Surface is backed by a single-buffered SurfaceTexture + * @hide + */ + public boolean isSingleBuffered() { + return mIsSingleBuffered; + } + /** * Exception thrown when a Canvas couldn't be locked with {@link Surface#lockCanvas}, or * when a SurfaceTexture could not successfully be allocated. diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 48189106f2c4a3b7d9621db6f6ab27dc6833d115..4b9a5708173f456ee87392d91fb4951aa9255134 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -115,6 +115,7 @@ public class SurfaceView extends View { final Rect mStableInsets = new Rect(); final Rect mOutsets = new Rect(); final Rect mBackdropFrame = new Rect(); + final Rect mTmpRect = new Rect(); final Configuration mConfiguration = new Configuration(); static final int KEEP_SCREEN_ON_MSG = 1; @@ -193,26 +194,20 @@ public class SurfaceView extends View { private boolean mGlobalListenersAdded; public SurfaceView(Context context) { - super(context); - init(); + this(context, null); } public SurfaceView(Context context, AttributeSet attrs) { - super(context, attrs); - init(); + this(context, attrs, 0); } public SurfaceView(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - init(); + this(context, attrs, defStyleAttr, 0); } public SurfaceView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); - init(); - } - private void init() { setWillNotDraw(true); } @@ -233,6 +228,7 @@ public class SurfaceView extends View { mSession = getWindowSession(); mLayout.token = getWindowToken(); mLayout.setTitle("SurfaceView - " + getViewRootImpl().getTitle()); + mLayout.packageName = mContext.getOpPackageName(); mViewVisibility = getVisibility() == VISIBLE; if (!mGlobalListenersAdded) { @@ -591,6 +587,20 @@ public class SurfaceView extends View { for (SurfaceHolder.Callback c : callbacks) { c.surfaceDestroyed(mSurfaceHolder); } + // Since Android N the same surface may be reused and given to us + // again by the system server at a later point. However + // as we didn't do this in previous releases, clients weren't + // necessarily required to clean up properly in + // surfaceDestroyed. This leads to problems for example when + // clients don't destroy their EGL context, and try + // and create a new one on the same surface following reuse. + // Since there is no valid use of the surface in-between + // surfaceDestroyed and surfaceCreated, we force a disconnect, + // so the next connect will always work if we end up reusing + // the surface. + if (mSurface.isValid()) { + mSurface.forceScopedDisconnect(); + } } } @@ -666,21 +676,21 @@ public class SurfaceView extends View { transformFromViewToWindowSpace(mLocation); - mWinFrame.set(mWindowSpaceLeft, mWindowSpaceTop, + mTmpRect.set(mWindowSpaceLeft, mWindowSpaceTop, mLocation[0], mLocation[1]); if (mTranslator != null) { - mTranslator.translateRectInAppWindowToScreen(mWinFrame); + mTranslator.translateRectInAppWindowToScreen(mTmpRect); } if (!isHardwareAccelerated() || !mRtHandlingPositionUpdates) { try { if (DEBUG) Log.d(TAG, String.format("%d updateWindowPosition UI, " + "postion = [%d, %d, %d, %d]", System.identityHashCode(this), - mWinFrame.left, mWinFrame.top, - mWinFrame.right, mWinFrame.bottom)); - mSession.repositionChild(mWindow, mWinFrame.left, mWinFrame.top, - mWinFrame.right, mWinFrame.bottom, -1, mWinFrame); + mTmpRect.left, mTmpRect.top, + mTmpRect.right, mTmpRect.bottom)); + mSession.repositionChild(mWindow, mTmpRect.left, mTmpRect.top, + mTmpRect.right, mTmpRect.bottom, -1, mTmpRect); } catch (RemoteException ex) { Log.e(TAG, "Exception from relayout", ex); } @@ -692,10 +702,10 @@ public class SurfaceView extends View { private Rect mRTLastReportedPosition = new Rect(); /** - * Called by native on RenderThread to update the window position + * Called by native by a Rendering Worker thread to update the window position * @hide */ - public final void updateWindowPositionRT(long frameNumber, + public final void updateWindowPosition_renderWorker(long frameNumber, int left, int top, int right, int bottom) { IWindowSession session = mSession; MyWindow window = mWindow; @@ -720,7 +730,7 @@ public class SurfaceView extends View { } try { if (DEBUG) { - Log.d(TAG, String.format("%d updateWindowPosition RT, frameNr = %d, " + + Log.d(TAG, String.format("%d updateWindowPosition RenderWorker, frameNr = %d, " + "postion = [%d, %d, %d, %d]", System.identityHashCode(this), frameNumber, left, top, right, bottom)); } @@ -737,12 +747,12 @@ public class SurfaceView extends View { /** * Called by native on RenderThread to notify that the window is no longer in the - * draw tree + * draw tree. UI thread is blocked at this point. * @hide */ - public final void windowPositionLostRT(long frameNumber) { + public final void windowPositionLost_uiRtSync(long frameNumber) { if (DEBUG) { - Log.d(TAG, String.format("%d windowPositionLostRT RT, frameNr = %d", + Log.d(TAG, String.format("%d windowPositionLost, frameNr = %d", System.identityHashCode(this), frameNumber)); } IWindowSession session = mSession; @@ -757,14 +767,18 @@ public class SurfaceView extends View { // safely access other member variables at this time. // So do what the UI thread would have done if RT wasn't handling position // updates. - if (!mWinFrame.isEmpty() && !mWinFrame.equals(mRTLastReportedPosition)) { + mTmpRect.set(mLayout.x, mLayout.y, + mLayout.x + mLayout.width, + mLayout.y + mLayout.height); + + if (!mTmpRect.isEmpty() && !mTmpRect.equals(mRTLastReportedPosition)) { try { if (DEBUG) Log.d(TAG, String.format("%d updateWindowPosition, " + "postion = [%d, %d, %d, %d]", System.identityHashCode(this), - mWinFrame.left, mWinFrame.top, - mWinFrame.right, mWinFrame.bottom)); - session.repositionChild(window, mWinFrame.left, mWinFrame.top, - mWinFrame.right, mWinFrame.bottom, frameNumber, mWinFrame); + mTmpRect.left, mTmpRect.top, + mTmpRect.right, mTmpRect.bottom)); + session.repositionChild(window, mTmpRect.left, mTmpRect.top, + mTmpRect.right, mTmpRect.bottom, frameNumber, mWinFrame); } catch (RemoteException ex) { Log.e(TAG, "Exception from relayout", ex); } diff --git a/core/java/android/view/TextureView.java b/core/java/android/view/TextureView.java index c7eca44c87494acb1eda44f68dc046d20fe69821..645ab5cdd3fa396441d17390d0706c5929d3086c 100644 --- a/core/java/android/view/TextureView.java +++ b/core/java/android/view/TextureView.java @@ -228,6 +228,7 @@ public class TextureView extends View { */ @Override protected void destroyHardwareResources() { + super.destroyHardwareResources(); destroyHardwareLayer(); } @@ -719,7 +720,7 @@ public class TextureView extends View { /** * Set the {@link SurfaceTexture} for this view to use. If a {@link * SurfaceTexture} is already being used by this view, it is immediately - * released and not be usable any more. The {@link + * released and not usable any more. The {@link * SurfaceTextureListener#onSurfaceTextureDestroyed} callback is not * called for the previous {@link SurfaceTexture}. Similarly, the {@link * SurfaceTextureListener#onSurfaceTextureAvailable} callback is not diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index e757db7c22c31ae8e7f1fd9c5315fe55a42a60d8..5f40ad520d0cea934740849744f28e7b3be265ed 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -40,7 +40,6 @@ import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Canvas; -import android.graphics.Color; import android.graphics.Insets; import android.graphics.Interpolator; import android.graphics.LinearGradient; @@ -830,6 +829,17 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ protected static boolean sPreserveMarginParamsInLayoutParamConversion; + /** + * Prior to N, when drag enters into child of a view that has already received an + * ACTION_DRAG_ENTERED event, the parent doesn't get a ACTION_DRAG_EXITED event. + * ACTION_DRAG_LOCATION and ACTION_DROP were delivered to the parent of a view that returned + * false from its event handler for these events. + * Starting from N, the parent will get ACTION_DRAG_EXITED event before the child gets its + * ACTION_DRAG_ENTERED. ACTION_DRAG_LOCATION and ACTION_DROP are never propagated to the parent. + * sCascadedDragDrop is true for pre-N apps for backwards compatibility implementation. + */ + static boolean sCascadedDragDrop; + /** * This view does not want keystrokes. Use with TAKES_FOCUS_MASK when * calling setFlags. @@ -3083,20 +3093,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ public static final int NAVIGATION_BAR_TRANSLUCENT = 0x80000000; - /** - * @hide - * - * Whether Recents is visible or not. - */ - public static final int RECENT_APPS_VISIBLE = 0x00004000; - - /** - * @hide - * - * Whether the TV's picture-in-picture is visible or not. - */ - public static final int TV_PICTURE_IN_PICTURE_VISIBLE = 0x00010000; - /** * @hide * @@ -4066,6 +4062,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, // in apps so we target check it to avoid breaking existing apps. sPreserveMarginParamsInLayoutParamConversion = targetSdkVersion >= N; + sCascadedDragDrop = targetSdkVersion < N; + sCompatibilityDone = true; } } @@ -8061,7 +8059,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** - * Set the enabled state of this view. + * Set the visibility state of this view. * * @param visibility One of {@link #VISIBLE}, {@link #INVISIBLE}, or {@link #GONE}. * @attr ref android.R.styleable#View_visibility @@ -20284,8 +20282,14 @@ public class View implements Drawable.Callback, KeyEvent.Callback, // remove it from the transparent region. final int[] location = attachInfo.mTransparentLocation; getLocationInWindow(location); - region.op(location[0], location[1], location[0] + mRight - mLeft, - location[1] + mBottom - mTop, Region.Op.DIFFERENCE); + // When a view has Z value, then it will be better to leave some area below the view + // for drawing shadow. The shadow outset is proportional to the Z value. Note that + // the bottom part needs more offset than the left, top and right parts due to the + // spot light effects. + int shadowOffset = getZ() > 0 ? (int) getZ() : 0; + region.op(location[0] - shadowOffset, location[1] - shadowOffset, + location[0] + mRight - mLeft + shadowOffset, + location[1] + mBottom - mTop + (shadowOffset * 3), Region.Op.DIFFERENCE); } else { if (mBackground != null && mBackground.getOpacity() != PixelFormat.TRANSPARENT) { // The SKIP_DRAW flag IS set and the background drawable exists, we remove @@ -20653,8 +20657,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @param shadowBuilder A {@link android.view.View.DragShadowBuilder} object for building the * drag shadow. * @param myLocalState An {@link java.lang.Object} containing local data about the drag and - * drop operation. This Object is put into every DragEvent object sent by the system during the - * current drag. + * drop operation. When dispatching drag events to views in the same activity this object + * will be available through {@link android.view.DragEvent#getLocalState()}. Views in other + * activities will not have access to this data ({@link android.view.DragEvent#getLocalState()} + * will return null). *

    * myLocalState is a lightweight mechanism for the sending information from the dragged View * to the target Views. For example, it can contain flags that differentiate between a @@ -20855,6 +20861,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback, return false; } + // Dispatches ACTION_DRAG_ENTERED and ACTION_DRAG_EXITED events for pre-Nougat apps. + boolean dispatchDragEnterExitInPreN(DragEvent event) { + return callDragEventHandler(event); + } + /** * Detects if this View is enabled and has a drag event listener. * If both are true, then it calls the drag event listener with the @@ -20872,13 +20883,44 @@ public class View implements Drawable.Callback, KeyEvent.Callback, *

    */ public boolean dispatchDragEvent(DragEvent event) { + event.mEventHandlerWasCalled = true; + if (event.mAction == DragEvent.ACTION_DRAG_LOCATION || + event.mAction == DragEvent.ACTION_DROP) { + // About to deliver an event with coordinates to this view. Notify that now this view + // has drag focus. This will send exit/enter events as needed. + getViewRootImpl().setDragFocus(this, event); + } + return callDragEventHandler(event); + } + + final boolean callDragEventHandler(DragEvent event) { + final boolean result; + ListenerInfo li = mListenerInfo; //noinspection SimplifiableIfStatement if (li != null && li.mOnDragListener != null && (mViewFlags & ENABLED_MASK) == ENABLED && li.mOnDragListener.onDrag(this, event)) { - return true; + result = true; + } else { + result = onDragEvent(event); } - return onDragEvent(event); + + switch (event.mAction) { + case DragEvent.ACTION_DRAG_ENTERED: { + mPrivateFlags2 |= View.PFLAG2_DRAG_HOVERED; + refreshDrawableState(); + } break; + case DragEvent.ACTION_DRAG_EXITED: { + mPrivateFlags2 &= ~View.PFLAG2_DRAG_HOVERED; + refreshDrawableState(); + } break; + case DragEvent.ACTION_DRAG_ENDED: { + mPrivateFlags2 &= ~View.DRAG_MASK; + refreshDrawableState(); + } break; + } + + return result; } boolean canAcceptDrag() { diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 3ff8d4f2e2b1b6a0cc56c7ec51d2dda762011c60..d4b7d3bdd76aacee53f635c0d1cd8f142e2b6b7e 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -153,8 +153,9 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager */ Transformation mInvalidationTransformation; - // View currently under an ongoing drag. Can be null, a child or this window. - private View mCurrentDragView; + // Current frontmost child that can accept drag and lies under the drag location. + // Used only to generate ENTER/EXIT events for pre-Nougat aps. + private View mCurrentDragChild; // Metadata about the ongoing drag private DragEvent mCurrentDragStartEvent; @@ -1355,6 +1356,20 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager return mLocalPoint; } + @Override + boolean dispatchDragEnterExitInPreN(DragEvent event) { + if (event.mAction == DragEvent.ACTION_DRAG_EXITED && mCurrentDragChild != null) { + // The drag exited a sub-tree of views; notify of the exit all descendants that are in + // entered state. + // We don't need this recursive delivery for ENTERED events because they get generated + // from the recursive delivery of LOCATION/DROP events, and hence, don't need their own + // recursion. + mCurrentDragChild.dispatchDragEnterExitInPreN(event); + mCurrentDragChild = null; + } + return mIsInterestedInDrag && super.dispatchDragEnterExitInPreN(event); + } + // TODO: Write real docs @Override public boolean dispatchDragEvent(DragEvent event) { @@ -1362,15 +1377,13 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager final float tx = event.mX; final float ty = event.mY; - ViewRootImpl root = getViewRootImpl(); - // Dispatch down the view hierarchy final PointF localPoint = getLocalPoint(); switch (event.mAction) { case DragEvent.ACTION_DRAG_STARTED: { - // clear state to recalculate which views we drag over - mCurrentDragView = null; + // Clear the state to recalculate which views we drag over. + mCurrentDragChild = null; // Set up our tracking of drag-started notifications mCurrentDragStartEvent = DragEvent.obtain(event); @@ -1416,8 +1429,6 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager if (child.dispatchDragEvent(event)) { retval = true; } - child.mPrivateFlags2 &= ~View.DRAG_MASK; - child.refreshDrawableState(); } childrenInterestedInDrag.clear(); } @@ -1434,60 +1445,45 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } } break; - case DragEvent.ACTION_DRAG_LOCATION: { + case DragEvent.ACTION_DRAG_LOCATION: + case DragEvent.ACTION_DROP: { // Find the [possibly new] drag target View target = findFrontmostDroppableChildAt(event.mX, event.mY, localPoint); - if (target == null && mIsInterestedInDrag) { - target = this; - } - // If we've changed apparent drag target, tell the view root which view - // we're over now [for purposes of the eventual drag-recipient-changed - // notifications to the framework] and tell the new target that the drag - // has entered its bounds. The root will see setDragFocus() calls all - // the way down to the final leaf view that is handling the LOCATION event - // before reporting the new potential recipient to the framework. - if (mCurrentDragView != target) { - root.setDragFocus(target); - - final int action = event.mAction; - // Position should not be available for ACTION_DRAG_ENTERED and ACTION_DRAG_EXITED. - event.mX = 0; - event.mY = 0; - - // If we've dragged off of a child view or this window, send it the EXITED message - if (mCurrentDragView != null) { - final View view = mCurrentDragView; - event.mAction = DragEvent.ACTION_DRAG_EXITED; - if (view != this) { - view.dispatchDragEvent(event); - view.mPrivateFlags2 &= ~View.PFLAG2_DRAG_HOVERED; - view.refreshDrawableState(); - } else { - super.dispatchDragEvent(event); + if (target != mCurrentDragChild) { + if (sCascadedDragDrop) { + // For pre-Nougat apps, make sure that the whole hierarchy of views that contain + // the drag location is kept in the state between ENTERED and EXITED events. + // (Starting with N, only the innermost view will be in that state). + + final int action = event.mAction; + // Position should not be available for ACTION_DRAG_ENTERED and + // ACTION_DRAG_EXITED. + event.mX = 0; + event.mY = 0; + + if (mCurrentDragChild != null) { + event.mAction = DragEvent.ACTION_DRAG_EXITED; + mCurrentDragChild.dispatchDragEnterExitInPreN(event); } - } - mCurrentDragView = target; - - // If we've dragged over a new child view, send it the ENTERED message, otherwise - // send it to this window. - if (target != null) { - event.mAction = DragEvent.ACTION_DRAG_ENTERED; - if (target != this) { - target.dispatchDragEvent(event); - target.mPrivateFlags2 |= View.PFLAG2_DRAG_HOVERED; - target.refreshDrawableState(); - } else { - super.dispatchDragEvent(event); + if (target != null) { + event.mAction = DragEvent.ACTION_DRAG_ENTERED; + target.dispatchDragEnterExitInPreN(event); } + + event.mAction = action; + event.mX = tx; + event.mY = ty; } - event.mAction = action; // restore the event's original state - event.mX = tx; - event.mY = ty; + mCurrentDragChild = target; } - // Dispatch the actual drag location notice, localized into its coordinates + if (target == null && mIsInterestedInDrag) { + target = this; + } + + // Dispatch the actual drag notice, localized into the target coordinates. if (target != null) { if (target != this) { event.mX = localPoint.x; @@ -1497,55 +1493,21 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager event.mX = tx; event.mY = ty; - } else { - retval = super.dispatchDragEvent(event); - } - } - } break; - /* Entered / exited dispatch - * - * DRAG_ENTERED is not dispatched downwards from ViewGroup. The reason for this is - * that we're about to get the corresponding LOCATION event, which we will use to - * determine which of our children is the new target; at that point we will - * push a DRAG_ENTERED down to the new target child [which may itself be a ViewGroup]. - * If no suitable child is detected, dispatch to this window. - * - * DRAG_EXITED *is* dispatched all the way down immediately: once we know the - * drag has left this ViewGroup, we know by definition that every contained subview - * is also no longer under the drag point. - */ + if (mIsInterestedInDrag) { + final boolean eventWasConsumed; + if (sCascadedDragDrop) { + eventWasConsumed = retval; + } else { + eventWasConsumed = event.mEventHandlerWasCalled; + } - case DragEvent.ACTION_DRAG_EXITED: { - if (mCurrentDragView != null) { - final View view = mCurrentDragView; - if (view != this) { - view.dispatchDragEvent(event); - view.mPrivateFlags2 &= ~View.PFLAG2_DRAG_HOVERED; - view.refreshDrawableState(); + if (!eventWasConsumed) { + retval = super.dispatchDragEvent(event); + } + } } else { - super.dispatchDragEvent(event); - } - - mCurrentDragView = null; - } - } break; - - case DragEvent.ACTION_DROP: { - if (ViewDebug.DEBUG_DRAG) Log.d(View.VIEW_LOG_TAG, "Drop event: " + event); - View target = findFrontmostDroppableChildAt(event.mX, event.mY, localPoint); - if (target != null) { - if (ViewDebug.DEBUG_DRAG) Log.d(View.VIEW_LOG_TAG, " dispatch drop to " + target); - event.mX = localPoint.x; - event.mY = localPoint.y; - retval = target.dispatchDragEvent(event); - event.mX = tx; - event.mY = ty; - } else if (mIsInterestedInDrag) { - retval = super.dispatchDragEvent(event); - } else { - if (ViewDebug.DEBUG_DRAG) { - Log.d(View.VIEW_LOG_TAG, " not dropped on an accepting view"); + retval = super.dispatchDragEvent(event); } } } break; @@ -1592,6 +1554,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager final boolean canAccept = child.dispatchDragEvent(mCurrentDragStartEvent); mCurrentDragStartEvent.mX = tx; mCurrentDragStartEvent.mY = ty; + mCurrentDragStartEvent.mEventHandlerWasCalled = false; if (canAccept) { mChildrenInterestedInDrag.add(child); if (!child.canAcceptDrag()) { @@ -6406,16 +6369,28 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager return true; } super.gatherTransparentRegion(region); - final View[] children = mChildren; - final int count = mChildrenCount; + // Instead of naively traversing the view tree, we have to traverse according to the Z + // order here. We need to go with the same order as dispatchDraw(). + // One example is that after surfaceView punch a hole, we will still allow other views drawn + // on top of that hole. In this case, those other views should be able to cut the + // transparent region into smaller area. + final int childrenCount = mChildrenCount; boolean noneOfTheChildrenAreTransparent = true; - for (int i = 0; i < count; i++) { - final View child = children[i]; - if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE || child.getAnimation() != null) { - if (!child.gatherTransparentRegion(region)) { - noneOfTheChildrenAreTransparent = false; + if (childrenCount > 0) { + final ArrayList preorderedList = buildOrderedChildList(); + final boolean customOrder = preorderedList == null + && isChildrenDrawingOrderEnabled(); + final View[] children = mChildren; + for (int i = 0; i < childrenCount; i++) { + final int childIndex = getAndVerifyPreorderedIndex(childrenCount, i, customOrder); + final View child = getAndVerifyPreorderedView(preorderedList, children, childIndex); + if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE || child.getAnimation() != null) { + if (!child.gatherTransparentRegion(region)) { + noneOfTheChildrenAreTransparent = false; + } } } + if (preorderedList != null) preorderedList.clear(); } return meOpaque || noneOfTheChildrenAreTransparent; } diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index e7c613a0ca406e72d445e304854d6ae19a9adace..f07b1d38557bc460d0bbe4f9ac8f50fa61485492 100755 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -2167,7 +2167,12 @@ public final class ViewRootImpl implements ViewParent, } if (changedVisibility || regainedFocus) { - host.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); + // Toasts are presented as notifications - don't present them as windows as well + boolean isToast = (mWindowAttributes == null) ? false + : (mWindowAttributes.type == WindowManager.LayoutParams.TYPE_TOAST); + if (!isToast) { + host.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); + } } mFirst = false; @@ -5524,9 +5529,11 @@ public final class ViewRootImpl implements ViewParent, if (what == DragEvent.ACTION_DRAG_EXITED) { // A direct EXITED event means that the window manager knows we've just crossed // a window boundary, so the current drag target within this one must have - // just been exited. Send it the usual notifications and then we're done - // for now. - mView.dispatchDragEvent(event); + // just been exited. Send the EXITED notification to the current drag view, if any. + if (View.sCascadedDragDrop) { + mView.dispatchDragEnterExitInPreN(event); + } + setDragFocus(null, event); } else { // For events with a [screen] location, translate into window coordinates if ((what == DragEvent.ACTION_DRAG_LOCATION) || (what == DragEvent.ACTION_DROP)) { @@ -5549,6 +5556,12 @@ public final class ViewRootImpl implements ViewParent, // Now dispatch the drag/drop event boolean result = mView.dispatchDragEvent(event); + if (what == DragEvent.ACTION_DRAG_LOCATION && !event.mEventHandlerWasCalled) { + // If the LOCATION event wasn't delivered to any handler, no view now has a drag + // focus. + setDragFocus(null, event); + } + // If we changed apparent drag target, tell the OS about it if (prevDragView != mCurrentDragView) { try { @@ -5576,6 +5589,7 @@ public final class ViewRootImpl implements ViewParent, // When the drag operation ends, reset drag-related state if (what == DragEvent.ACTION_DRAG_ENDED) { + mCurrentDragView = null; setLocalDragState(null); mAttachInfo.mDragToken = null; if (mAttachInfo.mDragSurface != null) { @@ -5635,10 +5649,33 @@ public final class ViewRootImpl implements ViewParent, return mLastTouchSource; } - public void setDragFocus(View newDragTarget) { - if (mCurrentDragView != newDragTarget) { - mCurrentDragView = newDragTarget; + public void setDragFocus(View newDragTarget, DragEvent event) { + if (mCurrentDragView != newDragTarget && !View.sCascadedDragDrop) { + // Send EXITED and ENTERED notifications to the old and new drag focus views. + + final float tx = event.mX; + final float ty = event.mY; + final int action = event.mAction; + // Position should not be available for ACTION_DRAG_ENTERED and ACTION_DRAG_EXITED. + event.mX = 0; + event.mY = 0; + + if (mCurrentDragView != null) { + event.mAction = DragEvent.ACTION_DRAG_EXITED; + mCurrentDragView.callDragEventHandler(event); + } + + if (newDragTarget != null) { + event.mAction = DragEvent.ACTION_DRAG_ENTERED; + newDragTarget.callDragEventHandler(event); + } + + event.mAction = action; + event.mX = tx; + event.mY = ty; } + + mCurrentDragView = newDragTarget; } private AudioManager getAudioManager() { diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index 14f9fcc3c2e62a5d572685e361b0addb186159af..0d3b453ce1837c2577799c07345a9a2d4fa13684 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -1784,14 +1784,18 @@ public interface WindowManager extends ViewManager { public CharSequence accessibilityTitle; /** - * Sets a timeout in milliseconds before which the window will be removed + * Sets a timeout in milliseconds before which the window will be hidden * by the window manager. Useful for transient notifications like toasts * so we don't have to rely on client cooperation to ensure the window - * is removed. Must be specified at window creation time. + * is hidden. Must be specified at window creation time. Note that apps + * are not prepared to handle their windows being removed without their + * explicit request and may try to interact with the removed window + * resulting in undefined behavior and crashes. Therefore, we do hide + * such windows to prevent them from overlaying other apps. * * @hide */ - public long removeTimeoutMilliseconds = -1; + public long hideTimeoutMilliseconds = -1; public LayoutParams() { super(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); @@ -1927,7 +1931,7 @@ public interface WindowManager extends ViewManager { out.writeInt(needsMenuKey); out.writeInt(accessibilityIdOfAnchor); TextUtils.writeToParcel(accessibilityTitle, out, parcelableFlags); - out.writeLong(removeTimeoutMilliseconds); + out.writeLong(hideTimeoutMilliseconds); } public static final Parcelable.Creator CREATOR @@ -1981,7 +1985,7 @@ public interface WindowManager extends ViewManager { needsMenuKey = in.readInt(); accessibilityIdOfAnchor = in.readInt(); accessibilityTitle = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); - removeTimeoutMilliseconds = in.readLong(); + hideTimeoutMilliseconds = in.readLong(); } @SuppressWarnings({"PointlessBitwiseExpression"}) @@ -2203,7 +2207,7 @@ public interface WindowManager extends ViewManager { } // This can't change, it's only set at window creation time. - removeTimeoutMilliseconds = o.removeTimeoutMilliseconds; + hideTimeoutMilliseconds = o.hideTimeoutMilliseconds; return changes; } diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index 8269be29dcc323caee66037998cedd8233a43b2e..8d4ae1927905354845cb8d91c8f9567734a1c32f 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -508,6 +508,11 @@ public interface WindowManagerPolicy { */ void getStackBounds(int stackId, Rect outBounds); + /** + * Overrides all currently playing app animations with {@param a}. + */ + void overridePlayingAppAnimationsLw(Animation a); + void addSystemUIVisibilityFlag(int flags); } @@ -1302,6 +1307,16 @@ public interface WindowManagerPolicy { */ public int adjustSystemUiVisibilityLw(int visibility); + /** + * Called by System UI to notify of changes to the visibility of Recents. + */ + public void setRecentsVisibilityLw(boolean visible); + + /** + * Called by System UI to notify of changes to the visibility of PIP. + */ + public void setTvPipVisibilityLw(boolean visible); + /** * Specifies whether there is an on-screen navigation bar separate from the status bar. */ diff --git a/core/java/android/view/inputmethod/InputConnection.java b/core/java/android/view/inputmethod/InputConnection.java index 07910b60df3fd0b872149783057a36264de56348..71c1d624976b8c03a77b81c0e2802a0dd30c6475 100644 --- a/core/java/android/view/inputmethod/InputConnection.java +++ b/core/java/android/view/inputmethod/InputConnection.java @@ -43,12 +43,14 @@ import android.view.KeyEvent; * in {@link android.os.Build.VERSION_CODES#HONEYCOMB}. *
  • {@link #requestCursorUpdates(int)}, which was introduced in * {@link android.os.Build.VERSION_CODES#LOLLIPOP}.
  • - *
  • {@link #deleteSurroundingTextInCodePoints(int, int)}}, which + *
  • {@link #deleteSurroundingTextInCodePoints(int, int)}, which * was introduced in {@link android.os.Build.VERSION_CODES#N}.
  • - *
  • {@link #getHandler()}}, which was introduced in + *
  • {@link #getHandler()}, which was introduced in * {@link android.os.Build.VERSION_CODES#N}.
  • - *
  • {@link #closeConnection()}}, which was introduced in + *
  • {@link #closeConnection()}, which was introduced in * {@link android.os.Build.VERSION_CODES#N}.
  • + *
  • {@link #commitContent(InputContentInfo, int, Bundle)}, which was + * introduced in {@link android.os.Build.VERSION_CODES#N_MR1}.
  • * * *

    Implementing an IME or an editor

    @@ -858,32 +860,35 @@ public interface InputConnection { android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION; // 0x00000001 /** - * Called by the input method to commit a content such as PNG image to the editor. + * Called by the input method to commit content such as a PNG image to the editor. * - *

    In order to avoid variety of compatibility issues, this focuses on a simple use case, - * where we expect editors and IMEs work cooperatively as follows:

    + *

    In order to avoid a variety of compatibility issues, this focuses on a simple use case, + * where editors and IMEs are expected to work cooperatively as follows:

    *
      - *
    • Editor must keep {@link EditorInfo#contentMimeTypes} to be {@code null} if it does + *
    • Editor must keep {@link EditorInfo#contentMimeTypes} equal to {@code null} if it does * not support this method at all.
    • *
    • Editor can ignore this request when the MIME type specified in - * {@code inputContentInfo} does not match to any of {@link EditorInfo#contentMimeTypes}. + * {@code inputContentInfo} does not match any of {@link EditorInfo#contentMimeTypes}. *
    • - *
    • Editor can ignore the cursor position when inserting the provided context.
    • + *
    • Editor can ignore the cursor position when inserting the provided content.
    • *
    • Editor can return {@code true} asynchronously, even before it starts loading the * content.
    • - *
    • Editor should provide a way to delete the content inserted by this method, or revert - * the effect caused by this method.
    • + *
    • Editor should provide a way to delete the content inserted by this method or to + * revert the effect caused by this method.
    • *
    • IME should not call this method when there is any composing text, in case calling - * this method causes focus change.
    • + * this method causes a focus change. *
    • IME should grant a permission for the editor to read the content. See * {@link EditorInfo#packageName} about how to obtain the package name of the editor.
    • *
    * * @param inputContentInfo Content to be inserted. - * @param flags {@code 0} or {@link #INPUT_CONTENT_GRANT_READ_URI_PERMISSION}. + * @param flags {@link #INPUT_CONTENT_GRANT_READ_URI_PERMISSION} if the content provider + * allows {@link android.R.styleable#AndroidManifestProvider_grantUriPermissions + * grantUriPermissions} or {@code 0} if the application does not need to call + * {@link InputContentInfo#requestPermission()}. * @param opts optional bundle data. This can be {@code null}. - * @return {@code true} if this request is accepted by the application, no matter if the request - * is already handled or still being handled in background. + * @return {@code true} if this request is accepted by the application, whether the request + * is already handled or still being handled in background, {@code false} otherwise. */ public boolean commitContent(@NonNull InputContentInfo inputContentInfo, int flags, @Nullable Bundle opts); diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java index c0c8e64aacc8bdfee29ee40feca670cd48e717ab..2e9cbf20607bcd5a9b4db4ec74c07cd333aaf6b4 100644 --- a/core/java/android/view/inputmethod/InputMethodManager.java +++ b/core/java/android/view/inputmethod/InputMethodManager.java @@ -2056,12 +2056,10 @@ public final class InputMethodManager { * have any input method subtype. */ public InputMethodSubtype getCurrentInputMethodSubtype() { - synchronized (mH) { - try { - return mService.getCurrentInputMethodSubtype(); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + try { + return mService.getCurrentInputMethodSubtype(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } } diff --git a/core/java/android/widget/DatePicker.java b/core/java/android/widget/DatePicker.java index 8613f9989abcc76d9837899a51f43aab854df4e2..54818a1f7a6ccdc554e8052ab21092f74bf15453 100644 --- a/core/java/android/widget/DatePicker.java +++ b/core/java/android/widget/DatePicker.java @@ -18,7 +18,9 @@ package android.widget; import com.android.internal.R; +import android.annotation.IntDef; import android.annotation.Nullable; +import android.annotation.TestApi; import android.annotation.Widget; import android.content.Context; import android.content.res.Configuration; @@ -32,6 +34,8 @@ import android.util.SparseArray; import android.view.View; import android.view.accessibility.AccessibilityEvent; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.Locale; /** @@ -75,11 +79,36 @@ import java.util.Locale; */ @Widget public class DatePicker extends FrameLayout { - private static final int MODE_SPINNER = 1; - private static final int MODE_CALENDAR = 2; + /** + * Presentation mode for the Holo-style date picker that uses a set of + * {@link android.widget.NumberPicker}s. + * + * @see #getMode() + * @hide Visible for testing only. + */ + @TestApi + public static final int MODE_SPINNER = 1; + + /** + * Presentation mode for the Material-style date picker that uses a + * calendar. + * + * @see #getMode() + * @hide Visible for testing only. + */ + @TestApi + public static final int MODE_CALENDAR = 2; + + /** @hide */ + @IntDef({MODE_SPINNER, MODE_CALENDAR}) + @Retention(RetentionPolicy.SOURCE) + public @interface DatePickerMode {} private final DatePickerDelegate mDelegate; + @DatePickerMode + private final int mMode; + /** * The callback used to indicate the user changed the date. */ @@ -114,11 +143,20 @@ public class DatePicker extends FrameLayout { final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DatePicker, defStyleAttr, defStyleRes); - final int mode = a.getInt(R.styleable.DatePicker_datePickerMode, MODE_SPINNER); + final boolean isDialogMode = a.getBoolean(R.styleable.DatePicker_dialogMode, false); + final int requestedMode = a.getInt(R.styleable.DatePicker_datePickerMode, MODE_SPINNER); final int firstDayOfWeek = a.getInt(R.styleable.DatePicker_firstDayOfWeek, 0); a.recycle(); - switch (mode) { + if (requestedMode == MODE_CALENDAR && isDialogMode) { + // You want MODE_CALENDAR? YOU CAN'T HANDLE MODE_CALENDAR! Well, + // maybe you can depending on your screen size. Let's check... + mMode = context.getResources().getInteger(R.integer.date_picker_mode); + } else { + mMode = requestedMode; + } + + switch (mMode) { case MODE_CALENDAR: mDelegate = createCalendarUIDelegate(context, attrs, defStyleAttr, defStyleRes); break; @@ -144,6 +182,18 @@ public class DatePicker extends FrameLayout { defStyleRes); } + /** + * @return the picker's presentation mode, one of {@link #MODE_CALENDAR} or + * {@link #MODE_SPINNER} + * @attr ref android.R.styleable#DatePicker_datePickerMode + * @hide Visible for testing only. + */ + @DatePickerMode + @TestApi + public int getMode() { + return mMode; + } + /** * Initialize the state. If the provided values designate an inconsistent * date the values are normalized before updating the spinners. diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java index aa67c8215b0481198d90f937f0bcb3535a3ab326..4d405c5a86276762c4c84ab48570828d90d41d07 100644 --- a/core/java/android/widget/ImageView.java +++ b/core/java/android/widget/ImageView.java @@ -467,6 +467,14 @@ public class ImageView extends View { * {@link #setImageBitmap(android.graphics.Bitmap)} and * {@link android.graphics.BitmapFactory} instead.

    * + *

    On devices running SDK < 24, this method will fail to + * apply correct density scaling to images loaded from + * {@link ContentResolver#SCHEME_CONTENT content} and + * {@link ContentResolver#SCHEME_FILE file} schemes. Applications running + * on devices with SDK >= 24 MUST specify the + * {@code targetSdkVersion} in their manifest as 24 or above for density + * scaling to be applied to images loaded from these schemes.

    + * * @param uri the Uri of an image, or {@code null} to clear the content */ @android.view.RemotableViewMethod(asyncImpl="setImageURIAsync") @@ -1441,7 +1449,9 @@ public class ImageView extends View { /** * Returns the alpha that will be applied to the drawable of this ImageView. * - * @return the alpha that will be applied to the drawable of this ImageView + * @return the alpha value that will be applied to the drawable of this + * ImageView (between 0 and 255 inclusive, with 0 being transparent and + * 255 being opaque) * * @see #setImageAlpha(int) */ @@ -1452,7 +1462,8 @@ public class ImageView extends View { /** * Sets the alpha value that should be applied to the image. * - * @param alpha the alpha value that should be applied to the image + * @param alpha the alpha value that should be applied to the image (between + * 0 and 255 inclusive, with 0 being transparent and 255 being opaque) * * @see #getImageAlpha() */ diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java index c3ddec787bfa4569f260641befd6ab2982e70a6f..25580fd2496e5a8aed18701cd5ba6d98862ebd94 100644 --- a/core/java/android/widget/NumberPicker.java +++ b/core/java/android/widget/NumberPicker.java @@ -16,6 +16,8 @@ package android.widget; +import com.android.internal.R; + import android.annotation.CallSuper; import android.annotation.IntDef; import android.annotation.Widget; @@ -29,10 +31,12 @@ import android.graphics.Paint.Align; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Bundle; +import android.text.Editable; import android.text.InputFilter; import android.text.InputType; import android.text.Spanned; import android.text.TextUtils; +import android.text.TextWatcher; import android.text.method.NumberKeyListener; import android.util.AttributeSet; import android.util.SparseArray; @@ -52,9 +56,6 @@ import android.view.animation.DecelerateInterpolator; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; -import com.android.internal.R; -import libcore.icu.LocaleData; - import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; @@ -62,6 +63,8 @@ import java.util.Collections; import java.util.List; import java.util.Locale; +import libcore.icu.LocaleData; + /** * A widget that enables the user to select a number from a predefined range. * There are two flavors of this widget and which one is presented to the user @@ -1991,7 +1994,7 @@ public class NumberPicker extends LinearLayout { removeCallbacks(mChangeCurrentByOneFromLongPressCommand); } if (mSetSelectionCommand != null) { - removeCallbacks(mSetSelectionCommand); + mSetSelectionCommand.cancel(); } if (mBeginSoftInputOnLongPressCommand != null) { removeCallbacks(mBeginSoftInputOnLongPressCommand); @@ -2033,18 +2036,14 @@ public class NumberPicker extends LinearLayout { } /** - * Posts an {@link SetSelectionCommand} from the given selectionStart - * to selectionEnd. + * Posts a {@link SetSelectionCommand} from the given + * {@code selectionStart} to {@code selectionEnd}. */ private void postSetSelectionCommand(int selectionStart, int selectionEnd) { if (mSetSelectionCommand == null) { - mSetSelectionCommand = new SetSelectionCommand(); - } else { - removeCallbacks(mSetSelectionCommand); + mSetSelectionCommand = new SetSelectionCommand(mInputText); } - mSetSelectionCommand.mSelectionStart = selectionStart; - mSetSelectionCommand.mSelectionEnd = selectionEnd; - post(mSetSelectionCommand); + mSetSelectionCommand.post(selectionStart, selectionEnd); } /** @@ -2090,6 +2089,12 @@ public class NumberPicker extends LinearLayout { @Override public CharSequence filter( CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { + // We don't know what the output will be, so always cancel any + // pending set selection command. + if (mSetSelectionCommand != null) { + mSetSelectionCommand.cancel(); + } + if (mDisplayedValues == null) { CharSequence filtered = super.filter(source, start, end, dest, dstart, dend); if (filtered == null) { @@ -2237,12 +2242,39 @@ public class NumberPicker extends LinearLayout { /** * Command for setting the input text selection. */ - class SetSelectionCommand implements Runnable { - private int mSelectionStart; + private static class SetSelectionCommand implements Runnable { + private final EditText mInputText; + private int mSelectionStart; private int mSelectionEnd; + /** Whether this runnable is currently posted. */ + private boolean mPosted; + + public SetSelectionCommand(EditText inputText) { + mInputText = inputText; + } + + public void post(int selectionStart, int selectionEnd) { + mSelectionStart = selectionStart; + mSelectionEnd = selectionEnd; + + if (!mPosted) { + mInputText.post(this); + mPosted = true; + } + } + + public void cancel() { + if (mPosted) { + mInputText.removeCallbacks(this); + mPosted = false; + } + } + + @Override public void run() { + mPosted = false; mInputText.setSelection(mSelectionStart, mSelectionEnd); } } diff --git a/core/java/android/widget/PopupWindow.java b/core/java/android/widget/PopupWindow.java index 6432f703f2ba4abc26ea67714b38f65bcf12db0a..9b89491ce408c39ae73a788c185322f208d29c30 100644 --- a/core/java/android/widget/PopupWindow.java +++ b/core/java/android/widget/PopupWindow.java @@ -193,6 +193,8 @@ public class PopupWindow { private int mAnimationStyle = ANIMATION_STYLE_DEFAULT; + private int mGravity = Gravity.NO_GRAVITY; + private static final int[] ABOVE_ANCHOR_STATE_SET = new int[] { com.android.internal.R.attr.state_above_anchor }; @@ -1141,15 +1143,11 @@ public class PopupWindow { mIsShowing = true; mIsDropdown = false; + mGravity = gravity; final WindowManager.LayoutParams p = createPopupLayoutParams(token); preparePopup(p); - // Only override the default if some gravity was specified. - if (gravity != Gravity.NO_GRAVITY) { - p.gravity = gravity; - } - p.x = x; p.y = y; @@ -1394,8 +1392,8 @@ public class PopupWindow { } private int computeGravity() { - int gravity = Gravity.START | Gravity.TOP; - if (mClipToScreen || mClippingEnabled) { + int gravity = mGravity == Gravity.NO_GRAVITY ? Gravity.START | Gravity.TOP : mGravity; + if (mIsDropdown && (mClipToScreen || mClippingEnabled)) { gravity |= Gravity.DISPLAY_CLIP_VERTICAL; } return gravity; @@ -1547,7 +1545,7 @@ public class PopupWindow { } // Let the window manager know to align the top to y. - outParams.gravity = Gravity.LEFT | Gravity.TOP; + outParams.gravity = computeGravity(); outParams.width = width; outParams.height = height; @@ -1760,11 +1758,22 @@ public class PopupWindow { */ public int getMaxAvailableHeight( @NonNull View anchor, int yOffset, boolean ignoreBottomDecorations) { - final Rect displayFrame = new Rect(); + Rect displayFrame = null; + final Rect visibleDisplayFrame = new Rect(); + + anchor.getWindowVisibleDisplayFrame(visibleDisplayFrame); if (ignoreBottomDecorations) { + // In the ignore bottom decorations case we want to + // still respect all other decorations so we use the inset visible + // frame on the top right and left and take the bottom + // value from the full frame. + displayFrame = new Rect(); anchor.getWindowDisplayFrame(displayFrame); + displayFrame.top = visibleDisplayFrame.top; + displayFrame.right = visibleDisplayFrame.right; + displayFrame.left = visibleDisplayFrame.left; } else { - anchor.getWindowVisibleDisplayFrame(displayFrame); + displayFrame = visibleDisplayFrame; } final int[] anchorPos = mTmpDrawingLocation; diff --git a/core/java/android/widget/ProgressBar.java b/core/java/android/widget/ProgressBar.java index 3c967acdfc5588105f604d7744d7d4da00a945b4..1f379c94cc03a3680aadea00cb4750b842dc5994 100644 --- a/core/java/android/widget/ProgressBar.java +++ b/core/java/android/widget/ProgressBar.java @@ -22,6 +22,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; import android.content.res.ColorStateList; +import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Canvas; @@ -230,7 +231,7 @@ public class ProgressBar extends View { private Drawable mCurrentDrawable; private ProgressTintInfo mProgressTintInfo; - Bitmap mSampleTile; + int mSampleWidth = 0; private boolean mNoInvalidate; private Interpolator mInterpolator; private RefreshProgressRunnable mRefreshProgressRunnable; @@ -505,15 +506,14 @@ public class ProgressBar extends View { } if (drawable instanceof BitmapDrawable) { - final BitmapDrawable bitmap = (BitmapDrawable) drawable; - final Bitmap tileBitmap = bitmap.getBitmap(); - if (mSampleTile == null) { - mSampleTile = tileBitmap; - } - - final BitmapDrawable clone = (BitmapDrawable) bitmap.getConstantState().newDrawable(); + final Drawable.ConstantState cs = drawable.getConstantState(); + final BitmapDrawable clone = (BitmapDrawable) cs.newDrawable(getResources()); clone.setTileModeXY(Shader.TileMode.REPEAT, Shader.TileMode.CLAMP); + if (mSampleWidth <= 0) { + mSampleWidth = clone.getIntrinsicWidth(); + } + if (clip) { return new ClipDrawable(clone, Gravity.LEFT, ClipDrawable.HORIZONTAL); } else { diff --git a/core/java/android/widget/RatingBar.java b/core/java/android/widget/RatingBar.java index 3ad05b5e7c01f9c428671470a4a74bf589e7eba1..62dd90fddcd0c94eb89575948f4daaebb3f30b1e 100644 --- a/core/java/android/widget/RatingBar.java +++ b/core/java/android/widget/RatingBar.java @@ -281,10 +281,8 @@ public class RatingBar extends AbsSeekBar { protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); - if (mSampleTile != null) { - // TODO: Once ProgressBar's TODOs are gone, this can be done more - // cleanly than mSampleTile - final int width = mSampleTile.getWidth() * mNumStars; + if (mSampleWidth > 0) { + final int width = mSampleWidth * mNumStars; setMeasuredDimension(resolveSizeAndState(width, widthMeasureSpec, 0), getMeasuredHeight()); } diff --git a/core/java/android/widget/SearchView.java b/core/java/android/widget/SearchView.java index 5878cad2f9a34845193f4b3c5e2903669f58711f..9139361eda7c9cb42d3eea973fc3a2004041241c 100644 --- a/core/java/android/widget/SearchView.java +++ b/core/java/android/widget/SearchView.java @@ -816,9 +816,11 @@ public class SearchView extends LinearLayout implements CollapsibleActionView { switch (heightMode) { case MeasureSpec.AT_MOST: - case MeasureSpec.UNSPECIFIED: height = Math.min(getPreferredHeight(), height); break; + case MeasureSpec.UNSPECIFIED: + height = getPreferredHeight(); + break; } heightMode = MeasureSpec.EXACTLY; diff --git a/core/java/android/widget/Switch.java b/core/java/android/widget/Switch.java index c4a17715896c1b3ed89b01eb4a9346eefbdc5186..a01d65a1df202806d99389d3f598fb03f90c8455 100644 --- a/core/java/android/widget/Switch.java +++ b/core/java/android/widget/Switch.java @@ -65,6 +65,9 @@ import com.android.internal.R; * {@link #setSwitchTextAppearance(android.content.Context, int) switchTextAppearance} and * the related setSwitchTypeface() methods control that of the thumb. * + *

    {@link android.support.v7.widget.SwitchCompat} is a version of + * the Switch widget which runs on devices back to API 7.

    + * *

    See the Toggle Buttons * guide.

    * diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index d3cb7425fe3584c17cd8746e60ef2fadd13b4648..f8daa8823d2125371a65536f92f63c93f40c2831 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -3234,6 +3234,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * Sets the text color for all the states (normal, selected, * focused) to be this color. * + * @param color A color value in the form 0xAARRGGBB. + * Do not pass a resource ID. To get a color value from a resource ID, call + * {@link android.support.v4.content.ContextCompat#getColor(Context, int) getColor}. + * * @see #setTextColor(ColorStateList) * @see #getTextColors() * diff --git a/core/java/android/widget/TimePicker.java b/core/java/android/widget/TimePicker.java index f2fc617ccc33ea607576f423755e73eb4a4e14d8..a1c854bd8f639c3621c1f6677f180773b8c6adf2 100644 --- a/core/java/android/widget/TimePicker.java +++ b/core/java/android/widget/TimePicker.java @@ -16,20 +16,24 @@ package android.widget; +import com.android.internal.R; + +import android.annotation.IntDef; +import android.annotation.IntRange; import android.annotation.NonNull; -import android.annotation.Nullable; +import android.annotation.TestApi; import android.annotation.Widget; import android.content.Context; -import android.content.res.Configuration; import android.content.res.TypedArray; import android.os.Parcel; import android.os.Parcelable; -import android.os.Parcelable.Creator; import android.util.AttributeSet; +import android.util.MathUtils; import android.view.View; import android.view.accessibility.AccessibilityEvent; -import com.android.internal.R; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.Locale; import libcore.icu.LocaleData; @@ -45,11 +49,36 @@ import libcore.icu.LocaleData; */ @Widget public class TimePicker extends FrameLayout { - private static final int MODE_SPINNER = 1; - private static final int MODE_CLOCK = 2; + /** + * Presentation mode for the Holo-style time picker that uses a set of + * {@link android.widget.NumberPicker}s. + * + * @see #getMode() + * @hide Visible for testing only. + */ + @TestApi + public static final int MODE_SPINNER = 1; + + /** + * Presentation mode for the Material-style time picker that uses a clock + * face. + * + * @see #getMode() + * @hide Visible for testing only. + */ + @TestApi + public static final int MODE_CLOCK = 2; + + /** @hide */ + @IntDef({MODE_SPINNER, MODE_CLOCK}) + @Retention(RetentionPolicy.SOURCE) + public @interface TimePickerMode {} private final TimePickerDelegate mDelegate; + @TimePickerMode + private final int mMode; + /** * The callback interface used to indicate the time has been adjusted. */ @@ -80,10 +109,19 @@ public class TimePicker extends FrameLayout { final TypedArray a = context.obtainStyledAttributes( attrs, R.styleable.TimePicker, defStyleAttr, defStyleRes); - final int mode = a.getInt(R.styleable.TimePicker_timePickerMode, MODE_SPINNER); + final boolean isDialogMode = a.getBoolean(R.styleable.TimePicker_dialogMode, false); + final int requestedMode = a.getInt(R.styleable.TimePicker_timePickerMode, MODE_SPINNER); a.recycle(); - switch (mode) { + if (requestedMode == MODE_CLOCK && isDialogMode) { + // You want MODE_CLOCK? YOU CAN'T HANDLE MODE_CLOCK! Well, maybe + // you can depending on your screen size. Let's check... + mMode = context.getResources().getInteger(R.integer.time_picker_mode); + } else { + mMode = requestedMode; + } + + switch (mMode) { case MODE_CLOCK: mDelegate = new TimePickerClockDelegate( this, context, attrs, defStyleAttr, defStyleRes); @@ -96,14 +134,26 @@ public class TimePicker extends FrameLayout { } } + /** + * @return the picker's presentation mode, one of {@link #MODE_CLOCK} or + * {@link #MODE_SPINNER} + * @attr ref android.R.styleable#TimePicker_timePickerMode + * @hide Visible for testing only. + */ + @TimePickerMode + @TestApi + public int getMode() { + return mMode; + } + /** * Sets the currently selected hour using 24-hour time. * * @param hour the hour to set, in the range (0-23) * @see #getHour() */ - public void setHour(int hour) { - mDelegate.setHour(hour); + public void setHour(@IntRange(from = 0, to = 23) int hour) { + mDelegate.setHour(MathUtils.constrain(hour, 0, 23)); } /** @@ -117,13 +167,13 @@ public class TimePicker extends FrameLayout { } /** - * Sets the currently selected minute.. + * Sets the currently selected minute. * * @param minute the minute to set, in the range (0-59) * @see #getMinute() */ - public void setMinute(int minute) { - mDelegate.setMinute(minute); + public void setMinute(@IntRange(from = 0, to = 59) int minute) { + mDelegate.setMinute(MathUtils.constrain(minute, 0, 59)); } /** @@ -137,8 +187,9 @@ public class TimePicker extends FrameLayout { } /** - * Sets the current hour. + * Sets the currently selected hour using 24-hour time. * + * @param currentHour the hour to set, in the range (0-23) * @deprecated Use {@link #setHour(int)} */ @Deprecated @@ -147,33 +198,34 @@ public class TimePicker extends FrameLayout { } /** - * @return the current hour in the range (0-23) + * @return the currently selected hour, in the range (0-23) * @deprecated Use {@link #getHour()} */ @NonNull @Deprecated public Integer getCurrentHour() { - return mDelegate.getHour(); + return getHour(); } /** - * Set the current minute (0-59). + * Sets the currently selected minute. * + * @param currentMinute the minute to set, in the range (0-59) * @deprecated Use {@link #setMinute(int)} */ @Deprecated public void setCurrentMinute(@NonNull Integer currentMinute) { - mDelegate.setMinute(currentMinute); + setMinute(currentMinute); } /** - * @return the current minute + * @return the currently selected minute, in the range (0-59) * @deprecated Use {@link #getMinute()} */ @NonNull @Deprecated public Integer getCurrentMinute() { - return mDelegate.getMinute(); + return getMinute(); } /** @@ -256,10 +308,10 @@ public class TimePicker extends FrameLayout { * for the real behavior. */ interface TimePickerDelegate { - void setHour(int hour); + void setHour(@IntRange(from = 0, to = 23) int hour); int getHour(); - void setMinute(int minute); + void setMinute(@IntRange(from = 0, to = 59) int minute); int getMinute(); void setIs24Hour(boolean is24Hour); diff --git a/core/java/android/widget/Toast.java b/core/java/android/widget/Toast.java index 77626754264f1931b2fa63e2cd5b53d938edacac..a400d90c64c5afe446e30c1d785030cc4e6e791f 100644 --- a/core/java/android/widget/Toast.java +++ b/core/java/android/widget/Toast.java @@ -25,6 +25,8 @@ import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.PixelFormat; import android.os.Handler; +import android.os.IBinder; +import android.os.Message; import android.os.RemoteException; import android.os.ServiceManager; import android.util.Log; @@ -326,13 +328,6 @@ public class Toast { } private static class TN extends ITransientNotification.Stub { - final Runnable mShow = new Runnable() { - @Override - public void run() { - handleShow(); - } - }; - final Runnable mHide = new Runnable() { @Override public void run() { @@ -343,7 +338,13 @@ public class Toast { }; private final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams(); - final Handler mHandler = new Handler(); + final Handler mHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + IBinder token = (IBinder) msg.obj; + handleShow(token); + } + }; int mGravity; int mX, mY; @@ -379,9 +380,9 @@ public class Toast { * schedule handleShow into the right thread */ @Override - public void show() { + public void show(IBinder windowToken) { if (localLOGV) Log.v(TAG, "SHOW: " + this); - mHandler.post(mShow); + mHandler.obtainMessage(0, windowToken).sendToTarget(); } /** @@ -393,7 +394,7 @@ public class Toast { mHandler.post(mHide); } - public void handleShow() { + public void handleShow(IBinder windowToken) { if (localLOGV) Log.v(TAG, "HANDLE SHOW: " + this + " mView=" + mView + " mNextView=" + mNextView); if (mView != mNextView) { @@ -422,8 +423,9 @@ public class Toast { mParams.verticalMargin = mVerticalMargin; mParams.horizontalMargin = mHorizontalMargin; mParams.packageName = packageName; - mParams.removeTimeoutMilliseconds = mDuration == + mParams.hideTimeoutMilliseconds = mDuration == Toast.LENGTH_LONG ? LONG_DURATION_TIMEOUT : SHORT_DURATION_TIMEOUT; + mParams.token = windowToken; if (mView.getParent() != null) { if (localLOGV) Log.v(TAG, "REMOVE! " + mView + " in " + this); mWM.removeView(mView); @@ -458,7 +460,7 @@ public class Toast { // the view isn't yet added, so let's try not to crash. if (mView.getParent() != null) { if (localLOGV) Log.v(TAG, "REMOVE! " + mView + " in " + this); - mWM.removeView(mView); + mWM.removeViewImmediate(mView); } mView = null; diff --git a/core/java/android/widget/VideoView.java b/core/java/android/widget/VideoView.java index f084db2d1589b4092ed80da574e4c1775aa3f01e..b973324dee8c9e7577d011f8b7dcc1ff6f639f40 100644 --- a/core/java/android/widget/VideoView.java +++ b/core/java/android/widget/VideoView.java @@ -70,46 +70,49 @@ import java.util.Vector; */ public class VideoView extends SurfaceView implements MediaPlayerControl, SubtitleController.Anchor { - private String TAG = "VideoView"; - // settable by the client - private Uri mUri; - private Map mHeaders; + private static final String TAG = "VideoView"; // all possible internal states - private static final int STATE_ERROR = -1; - private static final int STATE_IDLE = 0; - private static final int STATE_PREPARING = 1; - private static final int STATE_PREPARED = 2; - private static final int STATE_PLAYING = 3; - private static final int STATE_PAUSED = 4; + private static final int STATE_ERROR = -1; + private static final int STATE_IDLE = 0; + private static final int STATE_PREPARING = 1; + private static final int STATE_PREPARED = 2; + private static final int STATE_PLAYING = 3; + private static final int STATE_PAUSED = 4; private static final int STATE_PLAYBACK_COMPLETED = 5; + private final Vector> mPendingSubtitleTracks = new Vector<>(); + + // settable by the client + private Uri mUri; + private Map mHeaders; + // mCurrentState is a VideoView object's current state. // mTargetState is the state that a method caller intends to reach. // For instance, regardless the VideoView object's current state, // calling pause() intends to bring the object to a target state // of STATE_PAUSED. private int mCurrentState = STATE_IDLE; - private int mTargetState = STATE_IDLE; + private int mTargetState = STATE_IDLE; // All the stuff we need for playing and showing a video private SurfaceHolder mSurfaceHolder = null; private MediaPlayer mMediaPlayer = null; - private int mAudioSession; - private int mVideoWidth; - private int mVideoHeight; - private int mSurfaceWidth; - private int mSurfaceHeight; + private int mAudioSession; + private int mVideoWidth; + private int mVideoHeight; + private int mSurfaceWidth; + private int mSurfaceHeight; private MediaController mMediaController; private OnCompletionListener mOnCompletionListener; private MediaPlayer.OnPreparedListener mOnPreparedListener; - private int mCurrentBufferPercentage; + private int mCurrentBufferPercentage; private OnErrorListener mOnErrorListener; - private OnInfoListener mOnInfoListener; - private int mSeekWhenPrepared; // recording the seek position while preparing - private boolean mCanPause; - private boolean mCanSeekBack; - private boolean mCanSeekForward; + private OnInfoListener mOnInfoListener; + private int mSeekWhenPrepared; // recording the seek position while preparing + private boolean mCanPause; + private boolean mCanSeekBack; + private boolean mCanSeekForward; /** Subtitle rendering widget overlaid on top of the video. */ private RenderingWidget mSubtitleWidget; @@ -118,13 +121,11 @@ public class VideoView extends SurfaceView private RenderingWidget.OnChangedListener mSubtitlesChangedListener; public VideoView(Context context) { - super(context); - initVideoView(); + this(context, null); } public VideoView(Context context, AttributeSet attrs) { this(context, attrs, 0); - initVideoView(); } public VideoView(Context context, AttributeSet attrs, int defStyleAttr) { @@ -133,7 +134,19 @@ public class VideoView extends SurfaceView public VideoView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); - initVideoView(); + + mVideoWidth = 0; + mVideoHeight = 0; + + getHolder().addCallback(mSHCallback); + getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); + + setFocusable(true); + setFocusableInTouchMode(true); + requestFocus(); + + mCurrentState = STATE_IDLE; + mTargetState = STATE_IDLE; } @Override @@ -209,19 +222,6 @@ public class VideoView extends SurfaceView return getDefaultSize(desiredSize, measureSpec); } - private void initVideoView() { - mVideoWidth = 0; - mVideoHeight = 0; - getHolder().addCallback(mSHCallback); - getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); - setFocusable(true); - setFocusableInTouchMode(true); - requestFocus(); - mPendingSubtitleTracks = new Vector>(); - mCurrentState = STATE_IDLE; - mTargetState = STATE_IDLE; - } - /** * Sets video path. * @@ -294,8 +294,6 @@ public class VideoView extends SurfaceView } } - private Vector> mPendingSubtitleTracks; - public void stopPlayback() { if (mMediaPlayer != null) { mMediaPlayer.stop(); diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index 0a4ac0d44db4b83e94dd42aa9aa945612d5131c1..1e26c92dd7644bbdc89430a0723aad6e7ef18fc2 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -1469,7 +1469,7 @@ public class ResolverActivity extends Activity { boolean found = false; // Only loop to the end of into as it was before we started; no dupes in from. for (int j = 0; j < intoCount; j++) { - final ResolvedComponentInfo rci = into.get(i); + final ResolvedComponentInfo rci = into.get(j); if (isSameResolvedComponent(newInfo, rci)) { found = true; rci.add(intent, newInfo); diff --git a/core/java/com/android/internal/app/ResolverComparator.java b/core/java/com/android/internal/app/ResolverComparator.java index 03a3a3821f6a92181c077002c464057cb41d3e4f..4d4c7ceb16550b299e155f03b7fa447f3ea4a158 100644 --- a/core/java/com/android/internal/app/ResolverComparator.java +++ b/core/java/com/android/internal/app/ResolverComparator.java @@ -157,7 +157,10 @@ class ResolverComparator implements Comparator { // We want to put the one targeted to another user at the end of the dialog. if (lhs.targetUserId != UserHandle.USER_CURRENT) { - return 1; + return rhs.targetUserId != UserHandle.USER_CURRENT ? 0 : 1; + } + if (rhs.targetUserId != UserHandle.USER_CURRENT) { + return -1; } if (mHttp) { diff --git a/core/java/com/android/internal/app/SuggestedLocaleAdapter.java b/core/java/com/android/internal/app/SuggestedLocaleAdapter.java index a4b5a8e6595c891f142679be1d2650d229f8e9e5..cb2b0191b8831830367d3491a978be8ffa97a670 100644 --- a/core/java/com/android/internal/app/SuggestedLocaleAdapter.java +++ b/core/java/com/android/internal/app/SuggestedLocaleAdapter.java @@ -145,7 +145,11 @@ public class SuggestedLocaleAdapter extends BaseAdapter implements Filterable { if (itemType == TYPE_HEADER_SUGGESTED) { textView.setText(R.string.language_picker_section_suggested); } else { - textView.setText(R.string.language_picker_section_all); + if (mCountryMode) { + textView.setText(R.string.region_picker_section_all); + } else { + textView.setText(R.string.language_picker_section_all); + } } textView.setTextLocale(Locale.getDefault()); break; diff --git a/core/java/com/android/internal/graphics/drawable/AnimationScaleListDrawable.java b/core/java/com/android/internal/graphics/drawable/AnimationScaleListDrawable.java new file mode 100644 index 0000000000000000000000000000000000000000..62f18eac4aa4be83add35620b3ca7e0e05f0ea7c --- /dev/null +++ b/core/java/com/android/internal/graphics/drawable/AnimationScaleListDrawable.java @@ -0,0 +1,254 @@ +/* + * Copyright (C) 2016 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.internal.graphics.drawable; + +import android.animation.ValueAnimator; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.content.res.Resources; +import android.content.res.Resources.Theme; +import android.content.res.TypedArray; +import android.graphics.drawable.Animatable; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.DrawableContainer; +import android.util.AttributeSet; + +import com.android.internal.R; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.IOException; + +/** + * An internal DrawableContainer class, used to draw different things depending on animation scale. + * i.e: animation scale can be 0 in battery saver mode. + * This class contains 2 drawable, one is animatable, the other is static. When animation scale is + * not 0, the animatable drawable will the drawn. Otherwise, the static drawable will be drawn. + *

    This class implements Animatable since ProgressBar can pick this up similarly as an + * AnimatedVectorDrawable. + *

    It can be defined in an XML file with the {@code } + * element. + */ +public class AnimationScaleListDrawable extends DrawableContainer implements Animatable { + private static final String TAG = "AnimationScaleListDrawable"; + private AnimationScaleListState mAnimationScaleListState; + private boolean mMutated; + + public AnimationScaleListDrawable() { + this(null, null); + } + + private AnimationScaleListDrawable(@Nullable AnimationScaleListState state, + @Nullable Resources res) { + // Every scale list drawable has its own constant state. + final AnimationScaleListState newState = new AnimationScaleListState(state, this, res); + setConstantState(newState); + onStateChange(getState()); + } + + /** + * Set the current drawable according to the animation scale. If scale is 0, then pick the + * static drawable, otherwise, pick the animatable drawable. + */ + @Override + protected boolean onStateChange(int[] stateSet) { + final boolean changed = super.onStateChange(stateSet); + int idx = mAnimationScaleListState.getCurrentDrawableIndexBasedOnScale(); + return selectDrawable(idx) || changed; + } + + + @Override + public void inflate(@NonNull Resources r, @NonNull XmlPullParser parser, + @NonNull AttributeSet attrs, @Nullable Theme theme) + throws XmlPullParserException, IOException { + final TypedArray a = obtainAttributes(r, theme, attrs, + R.styleable.AnimationScaleListDrawable); + updateDensity(r); + a.recycle(); + + inflateChildElements(r, parser, attrs, theme); + + onStateChange(getState()); + } + + /** + * Inflates child elements from XML. + */ + private void inflateChildElements(@NonNull Resources r, @NonNull XmlPullParser parser, + @NonNull AttributeSet attrs, @Nullable Theme theme) + throws XmlPullParserException, IOException { + final AnimationScaleListState state = mAnimationScaleListState; + final int innerDepth = parser.getDepth() + 1; + int type; + int depth; + while ((type = parser.next()) != XmlPullParser.END_DOCUMENT + && ((depth = parser.getDepth()) >= innerDepth + || type != XmlPullParser.END_TAG)) { + if (type != XmlPullParser.START_TAG) { + continue; + } + + if (depth > innerDepth || !parser.getName().equals("item")) { + continue; + } + + // Either pick up the android:drawable attribute. + final TypedArray a = obtainAttributes(r, theme, attrs, + R.styleable.AnimationScaleListDrawableItem); + Drawable dr = a.getDrawable(R.styleable.AnimationScaleListDrawableItem_drawable); + a.recycle(); + + // Or parse the child element under . + if (dr == null) { + while ((type = parser.next()) == XmlPullParser.TEXT) { + } + if (type != XmlPullParser.START_TAG) { + throw new XmlPullParserException( + parser.getPositionDescription() + + ": tag requires a 'drawable' attribute or " + + "child tag defining a drawable"); + } + dr = Drawable.createFromXmlInner(r, parser, attrs, theme); + } + + state.addDrawable(dr); + } + } + + @Override + public Drawable mutate() { + if (!mMutated && super.mutate() == this) { + mAnimationScaleListState.mutate(); + mMutated = true; + } + return this; + } + + @Override + public void clearMutated() { + super.clearMutated(); + mMutated = false; + } + + @Override + public void start() { + Drawable dr = getCurrent(); + if (dr != null && dr instanceof Animatable) { + ((Animatable) dr).start(); + } + } + + @Override + public void stop() { + Drawable dr = getCurrent(); + if (dr != null && dr instanceof Animatable) { + ((Animatable) dr).stop(); + } + } + + @Override + public boolean isRunning() { + boolean result = false; + Drawable dr = getCurrent(); + if (dr != null && dr instanceof Animatable) { + result = ((Animatable) dr).isRunning(); + } + return result; + } + + static class AnimationScaleListState extends DrawableContainerState { + int[] mThemeAttrs = null; + // The index of the last static drawable. + int mStaticDrawableIndex = -1; + // The index of the last animatable drawable. + int mAnimatableDrawableIndex = -1; + + AnimationScaleListState(AnimationScaleListState orig, AnimationScaleListDrawable owner, + Resources res) { + super(orig, owner, res); + + if (orig != null) { + // Perform a shallow copy and rely on mutate() to deep-copy. + mThemeAttrs = orig.mThemeAttrs; + + mStaticDrawableIndex = orig.mStaticDrawableIndex; + mAnimatableDrawableIndex = orig.mAnimatableDrawableIndex; + } + + } + + void mutate() { + mThemeAttrs = mThemeAttrs != null ? mThemeAttrs.clone() : null; + } + + /** + * Add the drawable into the container. + * This class only keep track one animatable drawable, and one static. If there are multiple + * defined in the XML, then pick the last one. + */ + int addDrawable(Drawable drawable) { + final int pos = addChild(drawable); + if (drawable instanceof Animatable) { + mAnimatableDrawableIndex = pos; + } else { + mStaticDrawableIndex = pos; + } + return pos; + } + + @Override + public Drawable newDrawable() { + return new AnimationScaleListDrawable(this, null); + } + + @Override + public Drawable newDrawable(Resources res) { + return new AnimationScaleListDrawable(this, res); + } + + @Override + public boolean canApplyTheme() { + return mThemeAttrs != null || super.canApplyTheme(); + } + + public int getCurrentDrawableIndexBasedOnScale() { + if (ValueAnimator.getDurationScale() == 0) { + return mStaticDrawableIndex; + } + return mAnimatableDrawableIndex; + } + } + + @Override + public void applyTheme(@NonNull Theme theme) { + super.applyTheme(theme); + + onStateChange(getState()); + } + + @Override + protected void setConstantState(@NonNull DrawableContainerState state) { + super.setConstantState(state); + + if (state instanceof AnimationScaleListState) { + mAnimationScaleListState = (AnimationScaleListState) state; + } + } +} + diff --git a/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java b/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..cf1bf62cdeb2e4f83e24304027085eb67df75625 --- /dev/null +++ b/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2016 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.internal.hardware; + +import com.android.internal.R; + +import android.content.Context; +import android.provider.Settings; +import android.text.TextUtils; + +public class AmbientDisplayConfiguration { + + private final Context mContext; + + public AmbientDisplayConfiguration(Context context) { + mContext = context; + } + + public boolean enabled(int user) { + return pulseOnNotificationEnabled(user) + || pulseOnPickupEnabled(user) + || pulseOnDoubleTapEnabled(user); + } + + public boolean available() { + return pulseOnNotificationAvailable() || pulseOnPickupAvailable() + || pulseOnDoubleTapAvailable(); + } + + public boolean pulseOnNotificationEnabled(int user) { + return boolSetting(Settings.Secure.DOZE_ENABLED, user) && pulseOnNotificationAvailable(); + } + + public boolean pulseOnNotificationAvailable() { + return ambientDisplayAvailable(); + } + + public boolean pulseOnPickupEnabled(int user) { + return boolSetting(Settings.Secure.DOZE_PULSE_ON_PICK_UP, user) + && pulseOnPickupAvailable(); + } + + public boolean pulseOnPickupAvailable() { + return mContext.getResources().getBoolean(R.bool.config_dozePulsePickup) + && ambientDisplayAvailable(); + } + + public boolean pulseOnDoubleTapEnabled(int user) { + return boolSetting(Settings.Secure.DOZE_PULSE_ON_DOUBLE_TAP, user) + && pulseOnDoubleTapAvailable(); + } + + public boolean pulseOnDoubleTapAvailable() { + return !TextUtils.isEmpty(doubleTapSensorType()) && ambientDisplayAvailable(); + } + + public String doubleTapSensorType() { + return mContext.getResources().getString(R.string.config_dozeDoubleTapSensorType); + } + + public String ambientDisplayComponent() { + return mContext.getResources().getString(R.string.config_dozeComponent); + } + + private boolean ambientDisplayAvailable() { + return !TextUtils.isEmpty(ambientDisplayComponent()); + } + + private boolean boolSetting(String name, int user) { + return Settings.Secure.getIntForUser(mContext.getContentResolver(), name, 1, user) != 0; + } + +} diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 2538d60f1924836ed10604744075ed53350a27d8..3b3344e7d9346f6dca44edb3be0d24a39d45c968 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -10727,7 +10727,7 @@ public class BatteryStatsImpl extends BatteryStats { } int NW = in.readInt(); - if (NW > 100) { + if (NW > (MAX_WAKELOCKS_PER_UID+1)) { throw new ParcelFormatException("File corrupt: too many wake locks " + NW); } for (int iw = 0; iw < NW; iw++) { @@ -10736,7 +10736,7 @@ public class BatteryStatsImpl extends BatteryStats { } int NS = in.readInt(); - if (NS > 100) { + if (NS > (MAX_WAKELOCKS_PER_UID+1)) { throw new ParcelFormatException("File corrupt: too many syncs " + NS); } for (int is = 0; is < NS; is++) { @@ -10745,7 +10745,7 @@ public class BatteryStatsImpl extends BatteryStats { } int NJ = in.readInt(); - if (NJ > 100) { + if (NJ > (MAX_WAKELOCKS_PER_UID+1)) { throw new ParcelFormatException("File corrupt: too many job timers " + NJ); } for (int ij = 0; ij < NJ; ij++) { diff --git a/core/java/com/android/internal/os/ProcessCpuTracker.java b/core/java/com/android/internal/os/ProcessCpuTracker.java index b7e57187108671eff54c79031e481f943b00bf89..e46dfc4e0cb65102193a195141548c20809d23ec 100644 --- a/core/java/com/android/internal/os/ProcessCpuTracker.java +++ b/core/java/com/android/internal/os/ProcessCpuTracker.java @@ -39,6 +39,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Date; +import java.util.List; import java.util.StringTokenizer; public class ProcessCpuTracker { @@ -177,6 +178,11 @@ public class ProcessCpuTracker { private byte[] mBuffer = new byte[4096]; + public interface FilterStats { + /** Which stats to pick when filtering */ + boolean needed(Stats stats); + } + public static class Stats { public final int pid; public final int uid; @@ -695,6 +701,18 @@ public class ProcessCpuTracker { return mProcStats.get(index); } + final public List getStats(FilterStats filter) { + final ArrayList statses = new ArrayList<>(mProcStats.size()); + final int N = mProcStats.size(); + for (int p = 0; p < N; p++) { + Stats stats = mProcStats.get(p); + if (filter.needed(stats)) { + statses.add(stats); + } + } + return statses; + } + final public int countWorkingStats() { buildWorkingProcs(); return mWorkingProcs.size(); diff --git a/core/java/com/android/internal/policy/BackdropFrameRenderer.java b/core/java/com/android/internal/policy/BackdropFrameRenderer.java index 619303f34c32e732c2a4d3de284542cbdd8cd819..1abb59b006dd97382faabbeb7b7154e103495df7 100644 --- a/core/java/com/android/internal/policy/BackdropFrameRenderer.java +++ b/core/java/com/android/internal/policy/BackdropFrameRenderer.java @@ -110,12 +110,15 @@ public class BackdropFrameRenderer extends Thread implements Choreographer.Frame int statusBarColor, int navigationBarColor) { mDecorView = decorView; mResizingBackgroundDrawable = resizingBackgroundDrawable != null + && resizingBackgroundDrawable.getConstantState() != null ? resizingBackgroundDrawable.getConstantState().newDrawable() : null; mCaptionBackgroundDrawable = captionBackgroundDrawableDrawable != null + && captionBackgroundDrawableDrawable.getConstantState() != null ? captionBackgroundDrawableDrawable.getConstantState().newDrawable() : null; mUserCaptionBackgroundDrawable = userCaptionBackgroundDrawable != null + && userCaptionBackgroundDrawable.getConstantState() != null ? userCaptionBackgroundDrawable.getConstantState().newDrawable() : null; if (mCaptionBackgroundDrawable == null) { diff --git a/core/java/com/android/internal/policy/EmergencyAffordanceManager.java b/core/java/com/android/internal/policy/EmergencyAffordanceManager.java new file mode 100644 index 0000000000000000000000000000000000000000..eb75bd4974342d05b3557fbb7d0286d5a3730f41 --- /dev/null +++ b/core/java/com/android/internal/policy/EmergencyAffordanceManager.java @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2016 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.internal.policy; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; +import android.os.UserHandle; +import android.provider.Settings; + +/** + * A class that manages emergency affordances and enables immediate calling to emergency services + */ +public class EmergencyAffordanceManager { + + public static final boolean ENABLED = true; + + /** + * Global setting override with the number to call with the emergency affordance. + * @hide + */ + private static final String EMERGENCY_CALL_NUMBER_SETTING = "emergency_affordance_number"; + + /** + * Global setting, whether the emergency affordance should be shown regardless of device state. + * The value is a boolean (1 or 0). + * @hide + */ + private static final String FORCE_EMERGENCY_AFFORDANCE_SETTING = "force_emergency_affordance"; + + private final Context mContext; + + public EmergencyAffordanceManager(Context context) { + mContext = context; + } + + /** + * perform an emergency call. + */ + public final void performEmergencyCall() { + performEmergencyCall(mContext); + } + + private static Uri getPhoneUri(Context context) { + String number = context.getResources().getString( + com.android.internal.R.string.config_emergency_call_number); + if (Build.IS_DEBUGGABLE) { + String override = Settings.Global.getString( + context.getContentResolver(), EMERGENCY_CALL_NUMBER_SETTING); + if (override != null) { + number = override; + } + } + return Uri.fromParts("tel", number, null); + } + + private static void performEmergencyCall(Context context) { + Intent intent = new Intent(Intent.ACTION_CALL_EMERGENCY); + intent.setData(getPhoneUri(context)); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivityAsUser(intent, UserHandle.CURRENT); + } + + /** + * @return whether emergency affordance should be active. + */ + public boolean needsEmergencyAffordance() { + if (!ENABLED) { + return false; + } + if (forceShowing()) { + return true; + } + return isEmergencyAffordanceNeeded(); + } + + private boolean isEmergencyAffordanceNeeded() { + return Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.EMERGENCY_AFFORDANCE_NEEDED, 0) != 0; + } + + + private boolean forceShowing() { + return Settings.Global.getInt(mContext.getContentResolver(), + FORCE_EMERGENCY_AFFORDANCE_SETTING, 0) != 0; + } +} diff --git a/core/java/com/android/internal/policy/IKeyguardService.aidl b/core/java/com/android/internal/policy/IKeyguardService.aidl index 83d75fba80f9ade4f40b9eab79f75800f585986e..e51ad3f737b8ecb73f824e9d710b42a65e500491 100644 --- a/core/java/com/android/internal/policy/IKeyguardService.aidl +++ b/core/java/com/android/internal/policy/IKeyguardService.aidl @@ -28,8 +28,9 @@ oneway interface IKeyguardService { * FLAG_SHOW_ON_LOCK_SCREEN. * * @param isOccluded Whether the Keyguard is occluded by another window. + * @param animate Whether to play an animation for the state change. */ - void setOccluded(boolean isOccluded); + void setOccluded(boolean isOccluded, boolean animate); void addStateMonitorCallback(IKeyguardStateCallback callback); void verifyUnlock(IKeyguardExitCallback callback); diff --git a/core/java/com/android/internal/policy/PhoneFallbackEventHandler.java b/core/java/com/android/internal/policy/PhoneFallbackEventHandler.java index 2cb9c250d2d171666397bb19ee2ad79faad5f648..fb0edea398cee25efbe6cc4bcd792fd3677ea0be 100644 --- a/core/java/com/android/internal/policy/PhoneFallbackEventHandler.java +++ b/core/java/com/android/internal/policy/PhoneFallbackEventHandler.java @@ -150,6 +150,7 @@ public class PhoneFallbackEventHandler implements FallbackEventHandler { sendCloseSystemWindows(); // Broadcast an intent that the Camera button was longpressed Intent intent = new Intent(Intent.ACTION_CAMERA_BUTTON, null); + intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); intent.putExtra(Intent.EXTRA_KEY_EVENT, event); mContext.sendOrderedBroadcastAsUser(intent, UserHandle.CURRENT_OR_SELF, null, null, null, 0, null, null); diff --git a/core/java/com/android/internal/util/WakeupMessage.java b/core/java/com/android/internal/util/WakeupMessage.java index 7d222c74ac3beb246d1c3eb6a8b689ace04a8c30..46098c58108f6d00080b80c4e0c8d9cd31997669 100644 --- a/core/java/com/android/internal/util/WakeupMessage.java +++ b/core/java/com/android/internal/util/WakeupMessage.java @@ -108,7 +108,7 @@ public class WakeupMessage implements AlarmManager.OnAlarmListener { } if (stillScheduled) { Message msg = mHandler.obtainMessage(mCmd, mArg1, mArg2, mObj); - mHandler.handleMessage(msg); + mHandler.dispatchMessage(msg); msg.recycle(); } } diff --git a/core/java/com/android/internal/view/IInputConnectionWrapper.java b/core/java/com/android/internal/view/IInputConnectionWrapper.java index 644c7e90f8b024a0ddf41d36ca28db926b7ce988..4f7b106a83fed6305833924c82d17ce522055c14 100644 --- a/core/java/com/android/internal/view/IInputConnectionWrapper.java +++ b/core/java/com/android/internal/view/IInputConnectionWrapper.java @@ -580,7 +580,13 @@ public abstract class IInputConnectionWrapper extends IInputContext.Stub { return; } if (grantUriPermission) { - inputContentInfo.requestPermission(); + try { + inputContentInfo.requestPermission(); + } catch (Exception e) { + Log.e(TAG, "InputConnectionInfo.requestPermission() failed", e); + args.callback.setCommitContentResult(false, args.seq); + return; + } } final boolean result = ic.commitContent(inputContentInfo, flags, (Bundle) args.arg2); diff --git a/core/java/com/android/internal/widget/AlertDialogLayout.java b/core/java/com/android/internal/widget/AlertDialogLayout.java index 891c920af33646c1732453ae84707a77c07558ad..9bf094891f3bbbcd81b9b76e34bdfaae7e81f9d1 100644 --- a/core/java/com/android/internal/widget/AlertDialogLayout.java +++ b/core/java/com/android/internal/widget/AlertDialogLayout.java @@ -20,7 +20,9 @@ import android.annotation.AttrRes; import android.annotation.Nullable; import android.annotation.StyleRes; import android.content.Context; +import android.graphics.drawable.Drawable; import android.util.AttributeSet; +import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; @@ -265,4 +267,92 @@ public class AlertDialogLayout extends LinearLayout { return 0; } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + final int paddingLeft = mPaddingLeft; + + // Where right end of child should go + final int width = right - left; + final int childRight = width - mPaddingRight; + + // Space available for child + final int childSpace = width - paddingLeft - mPaddingRight; + + final int totalLength = getMeasuredHeight(); + final int count = getChildCount(); + final int gravity = getGravity(); + final int majorGravity = gravity & Gravity.VERTICAL_GRAVITY_MASK; + final int minorGravity = gravity & Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK; + + int childTop; + switch (majorGravity) { + case Gravity.BOTTOM: + // totalLength contains the padding already + childTop = mPaddingTop + bottom - top - totalLength; + break; + + // totalLength contains the padding already + case Gravity.CENTER_VERTICAL: + childTop = mPaddingTop + (bottom - top - totalLength) / 2; + break; + + case Gravity.TOP: + default: + childTop = mPaddingTop; + break; + } + + final Drawable dividerDrawable = getDividerDrawable(); + final int dividerHeight = dividerDrawable == null ? + 0 : dividerDrawable.getIntrinsicHeight(); + + for (int i = 0; i < count; i++) { + final View child = getChildAt(i); + if (child != null && child.getVisibility() != GONE) { + final int childWidth = child.getMeasuredWidth(); + final int childHeight = child.getMeasuredHeight(); + + final LinearLayout.LayoutParams lp = + (LinearLayout.LayoutParams) child.getLayoutParams(); + + int layoutGravity = lp.gravity; + if (layoutGravity < 0) { + layoutGravity = minorGravity; + } + final int layoutDirection = getLayoutDirection(); + final int absoluteGravity = Gravity.getAbsoluteGravity( + layoutGravity, layoutDirection); + + final int childLeft; + switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) { + case Gravity.CENTER_HORIZONTAL: + childLeft = paddingLeft + ((childSpace - childWidth) / 2) + + lp.leftMargin - lp.rightMargin; + break; + + case Gravity.RIGHT: + childLeft = childRight - childWidth - lp.rightMargin; + break; + + case Gravity.LEFT: + default: + childLeft = paddingLeft + lp.leftMargin; + break; + } + + if (hasDividerBeforeChildAt(i)) { + childTop += dividerHeight; + } + + childTop += lp.topMargin; + setChildFrame(child, childLeft, childTop, childWidth, childHeight); + childTop += childHeight + lp.bottomMargin; + } + } + } + + private void setChildFrame(View child, int left, int top, int width, int height) { + child.layout(left, top, left + width, top + height); + } } diff --git a/core/java/com/android/internal/widget/ImageFloatingTextView.java b/core/java/com/android/internal/widget/ImageFloatingTextView.java index 926ebd158b50feda1e642bdefc3eeebf86486776..358be604f84724aaed280425515d9fc72db3f3a5 100644 --- a/core/java/com/android/internal/widget/ImageFloatingTextView.java +++ b/core/java/com/android/internal/widget/ImageFloatingTextView.java @@ -40,6 +40,9 @@ public class ImageFloatingTextView extends TextView { /** Number of lines from the top to indent */ private int mIndentLines; + /** Resolved layout direction */ + private int mResolvedDirection = LAYOUT_DIRECTION_UNDEFINED; + public ImageFloatingTextView(Context context) { this(context, null); } @@ -82,7 +85,7 @@ public class ImageFloatingTextView extends TextView { margins[i] = endMargin; } } - if (getLayoutDirection() == LAYOUT_DIRECTION_RTL) { + if (mResolvedDirection == LAYOUT_DIRECTION_RTL) { builder.setIndents(margins, null); } else { builder.setIndents(null, margins); @@ -91,6 +94,19 @@ public class ImageFloatingTextView extends TextView { return builder.build(); } + @Override + public void onRtlPropertiesChanged(int layoutDirection) { + super.onRtlPropertiesChanged(layoutDirection); + + if (layoutDirection != mResolvedDirection && isLayoutDirectionResolved()) { + mResolvedDirection = layoutDirection; + if (mIndentLines > 0) { + // Invalidate layout. + setHint(getHint()); + } + } + } + @RemotableViewMethod public void setHasImage(boolean hasImage) { setNumIndentLines(hasImage ? 2 : 0); diff --git a/core/java/com/android/server/BootReceiver.java b/core/java/com/android/server/BootReceiver.java index fbc51cdca6c222a2802c3eaa0a4a3e5bebd11bba..5a50fbfd52778262c1e4f0a45a2041b7bf03f3be 100644 --- a/core/java/com/android/server/BootReceiver.java +++ b/core/java/com/android/server/BootReceiver.java @@ -79,6 +79,9 @@ public class BootReceiver extends BroadcastReceiver { private static final String LOG_FILES_FILE = "log-files.xml"; private static final AtomicFile sFile = new AtomicFile(new File( Environment.getDataSystemDirectory(), LOG_FILES_FILE)); + private static final String LAST_HEADER_FILE = "last-header.txt"; + private static final File lastHeaderFile = new File( + Environment.getDataSystemDirectory(), LAST_HEADER_FILE); @Override public void onReceive(final Context context, Intent intent) { @@ -113,9 +116,17 @@ public class BootReceiver extends BroadcastReceiver { Downloads.removeAllDownloadsByPackage(context, OLD_UPDATER_PACKAGE, OLD_UPDATER_CLASS); } - private void logBootEvents(Context ctx) throws IOException { - final DropBoxManager db = (DropBoxManager) ctx.getSystemService(Context.DROPBOX_SERVICE); - final String headers = new StringBuilder(512) + private String getPreviousBootHeaders() { + try { + return FileUtils.readTextFile(lastHeaderFile, 0, null); + } catch (IOException e) { + Slog.e(TAG, "Error reading " + lastHeaderFile, e); + return null; + } + } + + private String getCurrentBootHeaders() throws IOException { + return new StringBuilder(512) .append("Build: ").append(Build.FINGERPRINT).append("\n") .append("Hardware: ").append(Build.BOARD).append("\n") .append("Revision: ") @@ -125,6 +136,31 @@ public class BootReceiver extends BroadcastReceiver { .append("Kernel: ") .append(FileUtils.readTextFile(new File("/proc/version"), 1024, "...\n")) .append("\n").toString(); + } + + + private String getBootHeadersToLogAndUpdate() throws IOException { + final String oldHeaders = getPreviousBootHeaders(); + final String newHeaders = getCurrentBootHeaders(); + + try { + FileUtils.stringToFile(lastHeaderFile, newHeaders); + } catch (IOException e) { + Slog.e(TAG, "Error writing " + lastHeaderFile, e); + } + + if (oldHeaders == null) { + // If we failed to read the old headers, use the current headers + // but note this in the headers so we know + return "isPrevious: false\n" + newHeaders; + } + + return "isPrevious: true\n" + oldHeaders; + } + + private void logBootEvents(Context ctx) throws IOException { + final DropBoxManager db = (DropBoxManager) ctx.getSystemService(Context.DROPBOX_SERVICE); + final String headers = getBootHeadersToLogAndUpdate(); final String bootReason = SystemProperties.get("ro.boot.bootreason", null); String recovery = RecoverySystem.handleAftermath(ctx); diff --git a/core/java/com/android/server/backup/AccountManagerBackupHelper.java b/core/java/com/android/server/backup/AccountManagerBackupHelper.java new file mode 100644 index 0000000000000000000000000000000000000000..39b18c0f2c16e8f0288f1c58357fef4e3c32ea63 --- /dev/null +++ b/core/java/com/android/server/backup/AccountManagerBackupHelper.java @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2016 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.server.backup; + +import android.accounts.AccountManagerInternal; +import android.app.backup.BlobBackupHelper; +import android.os.UserHandle; +import android.util.Slog; +import com.android.server.LocalServices; + +/** + * Helper for handling backup of account manager specific state. + */ +public class AccountManagerBackupHelper extends BlobBackupHelper { + private static final String TAG = "AccountsBackup"; + private static final boolean DEBUG = false; + + // current schema of the backup state blob + private static final int STATE_VERSION = 1; + + // key under which the account access grant state blob is committed to backup + private static final String KEY_ACCOUNT_ACCESS_GRANTS = "account_access_grants"; + + public AccountManagerBackupHelper() { + super(STATE_VERSION, KEY_ACCOUNT_ACCESS_GRANTS); + } + + @Override + protected byte[] getBackupPayload(String key) { + AccountManagerInternal am = LocalServices.getService(AccountManagerInternal.class); + if (DEBUG) { + Slog.d(TAG, "Handling backup of " + key); + } + try { + switch (key) { + case KEY_ACCOUNT_ACCESS_GRANTS: { + return am.backupAccountAccessPermissions(UserHandle.USER_SYSTEM); + } + + default: { + Slog.w(TAG, "Unexpected backup key " + key); + } + } + } catch (Exception e) { + Slog.e(TAG, "Unable to store payload " + key); + } + + return new byte[0]; + } + + @Override + protected void applyRestoredPayload(String key, byte[] payload) { + AccountManagerInternal am = LocalServices.getService(AccountManagerInternal.class); + if (DEBUG) { + Slog.d(TAG, "Handling restore of " + key); + } + try { + switch (key) { + case KEY_ACCOUNT_ACCESS_GRANTS: { + am.restoreAccountAccessPermissions(payload, UserHandle.USER_SYSTEM); + } break; + + default: { + Slog.w(TAG, "Unexpected restore key " + key); + } + } + } catch (Exception e) { + Slog.w(TAG, "Unable to restore key " + key); + } + } +} diff --git a/core/java/com/android/server/backup/SystemBackupAgent.java b/core/java/com/android/server/backup/SystemBackupAgent.java index 9d296fa194005947e751123e4143daf12fce4597..537565185d9b41ea74b137356c3d8210fdd67e4a 100644 --- a/core/java/com/android/server/backup/SystemBackupAgent.java +++ b/core/java/com/android/server/backup/SystemBackupAgent.java @@ -49,6 +49,7 @@ public class SystemBackupAgent extends BackupAgentHelper { private static final String PERMISSION_HELPER = "permissions"; private static final String USAGE_STATS_HELPER = "usage_stats"; private static final String SHORTCUT_MANAGER_HELPER = "shortcut_manager"; + private static final String ACCOUNT_MANAGER_HELPER = "account_manager"; // These paths must match what the WallpaperManagerService uses. The leaf *_FILENAME // are also used in the full-backup file format, so must not change unless steps are @@ -82,6 +83,7 @@ public class SystemBackupAgent extends BackupAgentHelper { addHelper(PERMISSION_HELPER, new PermissionBackupHelper()); addHelper(USAGE_STATS_HELPER, new UsageStatsBackupHelper(this)); addHelper(SHORTCUT_MANAGER_HELPER, new ShortcutBackupHelper()); + addHelper(ACCOUNT_MANAGER_HELPER, new AccountManagerBackupHelper()); super.onBackup(oldState, data, newState); } @@ -111,6 +113,7 @@ public class SystemBackupAgent extends BackupAgentHelper { addHelper(PERMISSION_HELPER, new PermissionBackupHelper()); addHelper(USAGE_STATS_HELPER, new UsageStatsBackupHelper(this)); addHelper(SHORTCUT_MANAGER_HELPER, new ShortcutBackupHelper()); + addHelper(ACCOUNT_MANAGER_HELPER, new AccountManagerBackupHelper()); try { super.onRestore(data, appVersionCode, newState); diff --git a/core/jni/android/graphics/pdf/PdfEditor.cpp b/core/jni/android/graphics/pdf/PdfEditor.cpp index d2d39cd0b286eccbc245a47ae02059e4b31c522d..0468b644862dbecc13c659057e1795e1f1aaafb9 100644 --- a/core/jni/android/graphics/pdf/PdfEditor.cpp +++ b/core/jni/android/graphics/pdf/PdfEditor.cpp @@ -52,11 +52,9 @@ static struct { } gRectClassInfo; // Also used in PdfRenderer.cpp -Mutex sPdfiumLock; int sUnmatchedPdfiumInitRequestCount = 0; static void initializeLibraryIfNeeded() { - Mutex::Autolock _l(sPdfiumLock); if (sUnmatchedPdfiumInitRequestCount == 0) { FPDF_InitLibrary(); } @@ -64,7 +62,6 @@ static void initializeLibraryIfNeeded() { } static void destroyLibraryIfNeeded() { - Mutex::Autolock _l(sPdfiumLock); sUnmatchedPdfiumInitRequestCount--; if (sUnmatchedPdfiumInitRequestCount == 0) { FPDF_DestroyLibrary(); diff --git a/core/jni/android/graphics/pdf/PdfRenderer.cpp b/core/jni/android/graphics/pdf/PdfRenderer.cpp index 71bec7845fd7163fb4f57a51e4d5d218adb2230c..43550ac9ed72bdc5bf7acd5aa2943cfeaf2ebdc1 100644 --- a/core/jni/android/graphics/pdf/PdfRenderer.cpp +++ b/core/jni/android/graphics/pdf/PdfRenderer.cpp @@ -44,11 +44,9 @@ static struct { } gPointClassInfo; // See PdfEditor.cpp -extern Mutex sPdfiumLock; extern int sUnmatchedPdfiumInitRequestCount; static void initializeLibraryIfNeeded() { - Mutex::Autolock _l(sPdfiumLock); if (sUnmatchedPdfiumInitRequestCount == 0) { FPDF_InitLibrary(); } @@ -56,7 +54,6 @@ static void initializeLibraryIfNeeded() { } static void destroyLibraryIfNeeded() { - Mutex::Autolock _l(sPdfiumLock); sUnmatchedPdfiumInitRequestCount--; if (sUnmatchedPdfiumInitRequestCount == 0) { FPDF_DestroyLibrary(); diff --git a/core/jni/android_database_CursorWindow.cpp b/core/jni/android_database_CursorWindow.cpp index bb09d001037daf02c4cdc7246650c34135cc97a9..e96613b7d45b96b29e746b805586594d02220f13 100644 --- a/core/jni/android_database_CursorWindow.cpp +++ b/core/jni/android_database_CursorWindow.cpp @@ -16,6 +16,7 @@ #undef LOG_TAG #define LOG_TAG "CursorWindow" +#define LOG_NDEBUG 0 #include #include @@ -30,6 +31,11 @@ #include #include #include +#include +#include + +#undef LOG_NDEBUG +#define LOG_NDEBUG 1 #include #include "android_os_Parcel.h" @@ -61,6 +67,22 @@ static void throwUnknownTypeException(JNIEnv * env, jint type) { jniThrowException(env, "java/lang/IllegalStateException", msg.string()); } +static int getFdCount() { + char fdpath[PATH_MAX]; + int count = 0; + snprintf(fdpath, PATH_MAX, "/proc/%d/fd", getpid()); + DIR *dir = opendir(fdpath); + if (dir != NULL) { + struct dirent *dirent; + while ((dirent = readdir(dir))) { + count++; + } + count -= 2; // discount "." and ".." + closedir(dir); + } + return count; +} + static jlong nativeCreate(JNIEnv* env, jclass clazz, jstring nameObj, jint cursorWindowSize) { String8 name; const char* nameStr = env->GetStringUTFChars(nameObj, NULL); @@ -85,7 +107,8 @@ static jlong nativeCreateFromParcel(JNIEnv* env, jclass clazz, jobject parcelObj CursorWindow* window; status_t status = CursorWindow::createFromParcel(parcel, &window); if (status || !window) { - ALOGE("Could not create CursorWindow from Parcel due to error %d.", status); + ALOGE("Could not create CursorWindow from Parcel due to error %d, process fd count=%d", + status, getFdCount()); return 0; } diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp index dcc8b23d996b00ec1cc50931a0b71be02e3280c4..c5c2442caeb73f4db04692e897a3498c4797a2c6 100644 --- a/core/jni/android_hardware_Camera.cpp +++ b/core/jni/android_hardware_Camera.cpp @@ -372,9 +372,15 @@ void JNICameraContext::postDataTimestamp(nsecs_t timestamp, int32_t msgType, con } void JNICameraContext::postRecordingFrameHandleTimestamp(nsecs_t, native_handle_t* handle) { - // This is not needed at app layer. This should not be called because JNICameraContext cannot - // start video recording. - mCamera->releaseRecordingFrameHandle(handle); + // Video buffers are not needed at app layer so just return the video buffers here. + // This may be called when stagefright just releases camera but there are still outstanding + // video buffers. + if (mCamera != nullptr) { + mCamera->releaseRecordingFrameHandle(handle); + } else { + native_handle_close(handle); + native_handle_delete(handle); + } } void JNICameraContext::postMetadata(JNIEnv *env, int32_t msgType, camera_frame_metadata_t *metadata) diff --git a/core/jni/android_hardware_location_ContextHubService.cpp b/core/jni/android_hardware_location_ContextHubService.cpp index 9515a0e336aa5109bc22eb19b50906e7555843e6..8eb39e1aac580e7651a6ccc87424ce868b900243 100644 --- a/core/jni/android_hardware_location_ContextHubService.cpp +++ b/core/jni/android_hardware_location_ContextHubService.cpp @@ -26,6 +26,10 @@ #include #include #include + +// TOOD: On master, alphabetize these and move into this +// grouping. +#include #include #include @@ -34,11 +38,12 @@ #include "JNIHelp.h" #include "core_jni_helpers.h" -static constexpr int OS_APP_ID = -1; +static constexpr jint OS_APP_ID = -1; +static constexpr jint INVALID_APP_ID = -2; static constexpr uint64_t ALL_APPS = UINT64_C(0xFFFFFFFFFFFFFFFF); -static constexpr int MIN_APP_ID = 1; -static constexpr int MAX_APP_ID = 128; +static constexpr jint MIN_APP_ID = 1; +static constexpr jint MAX_APP_ID = 128; static constexpr size_t MSG_HEADER_SIZE = 4; static constexpr size_t HEADER_FIELD_MSG_TYPE = 0; @@ -50,6 +55,10 @@ static constexpr size_t HEADER_FIELD_LOAD_APP_ID_LO = MSG_HEADER_SIZE; static constexpr size_t HEADER_FIELD_LOAD_APP_ID_HI = MSG_HEADER_SIZE + 1; static constexpr size_t MSG_HEADER_SIZE_LOAD_APP = MSG_HEADER_SIZE + 2; +// Monotonically increasing clock we use to determine if we can cancel +// a transaction. +using std::chrono::steady_clock; + namespace android { namespace { @@ -102,10 +111,21 @@ struct context_hub_info_s { struct app_instance_info_s { uint64_t truncName; // Possibly truncated name for logging uint32_t hubHandle; // Id of the hub this app is on - int instanceId; // system wide unique instance id - assigned + jint instanceId; // system wide unique instance id - assigned struct hub_app_info appInfo; // returned from the HAL }; + +// If a transaction takes longer than this, we'll allow it to be +// canceled by a new transaction. Note we do _not_ automatically +// cancel a transaction after this much time. We can have a +// legal transaction which takes longer than this amount of time, +// as long as no other new transactions are attempted after this +// time has expired. +// TODO(b/31105001): Establish a clean timing approach for all +// of our HAL interactions. +constexpr auto kMinTransactionCancelTime = std::chrono::seconds(29); + /* * TODO(ashutoshj): From original code review: * @@ -147,14 +167,15 @@ struct txnManager_s { std::mutex m; // mutex for manager hub_messages_e txnIdentifier; // What are we doing void *txnData; // Details + steady_clock::time_point firstTimeTxnCanBeCanceled; }; struct contextHubServiceDb_s { int initialized; context_hub_info_s hubInfo; jniInfo_s jniInfo; - std::queue freeIds; - std::unordered_map appInstances; + std::queue freeIds; + std::unordered_map appInstances; txnManager_s txnManager; }; @@ -176,25 +197,40 @@ static int addTxn(hub_messages_e txnIdentifier, void *txnData) { std::lock_guardlock(mgr->m); mgr->txnPending = true; + mgr->firstTimeTxnCanBeCanceled = steady_clock::now() + + kMinTransactionCancelTime; mgr->txnData = txnData; mgr->txnIdentifier = txnIdentifier; return 0; } -static int closeTxn() { +// Only call this if you hold the db.txnManager.m lock. +static void closeTxnUnlocked() { txnManager_s *mgr = &db.txnManager; - std::lock_guardlock(mgr->m); mgr->txnPending = false; free(mgr->txnData); mgr->txnData = nullptr; +} +static int closeTxn() { + std::lock_guardlock(db.txnManager.m); + closeTxnUnlocked(); return 0; } +// If a transaction has been pending for longer than +// kMinTransactionCancelTime, this call will "cancel" that +// transaction and return that there are none pending. static bool isTxnPending() { txnManager_s *mgr = &db.txnManager; std::lock_guardlock(mgr->m); + if (mgr->txnPending) { + if (steady_clock::now() >= mgr->firstTimeTxnCanBeCanceled) { + ALOGW("Transaction canceled"); + closeTxnUnlocked(); + } + } return mgr->txnPending; } @@ -259,16 +295,17 @@ static int get_hub_id_for_hub_handle(int hubHandle) { } } -static int get_hub_handle_for_app_instance(int id) { +static int get_hub_handle_for_app_instance(jint id) { if (!db.appInstances.count(id)) { - ALOGD("%s: Cannot find app for app instance %d", __FUNCTION__, id); + ALOGD("%s: Cannot find app for app instance %" PRId32, + __FUNCTION__, id); return -1; } return db.appInstances[id].hubHandle; } -static int get_hub_id_for_app_instance(int id) { +static int get_hub_id_for_app_instance(jint id) { int hubHandle = get_hub_handle_for_app_instance(id); if (hubHandle < 0) { @@ -278,7 +315,7 @@ static int get_hub_id_for_app_instance(int id) { return db.hubInfo.hubs[hubHandle].hub_id; } -static int get_app_instance_for_app_id(uint64_t app_id) { +static jint get_app_instance_for_app_id(uint64_t app_id) { auto end = db.appInstances.end(); for (auto current = db.appInstances.begin(); current != end; ++current) { if (current->second.appInfo.app_name.id == app_id) { @@ -289,9 +326,10 @@ static int get_app_instance_for_app_id(uint64_t app_id) { return -1; } -static int set_dest_app(hub_message_t *msg, int id) { +static int set_dest_app(hub_message_t *msg, jint id) { if (!db.appInstances.count(id)) { - ALOGD("%s: Cannot find app for app instance %d", __FUNCTION__, id); + ALOGD("%s: Cannot find app for app instance %" PRId32, + __FUNCTION__, id); return -1; } @@ -299,11 +337,15 @@ static int set_dest_app(hub_message_t *msg, int id) { return 0; } -static void query_hub_for_apps(uint64_t appId, uint32_t hubHandle) { +static void query_hub_for_apps(uint32_t hubHandle) { hub_message_t msg; query_apps_request_t queryMsg; - queryMsg.app_name.id = NANOAPP_VENDOR_ALL_APPS; + // TODO(b/30835598): When we're able to tell which request our + // response matches, then we should allow this to be more + // targetted, instead of always being every app in the + // system. + queryMsg.app_name.id = ALL_APPS; msg.message_type = CONTEXT_HUB_QUERY_APPS; msg.message_len = sizeof(queryMsg); @@ -316,13 +358,13 @@ static void query_hub_for_apps(uint64_t appId, uint32_t hubHandle) { } } -static void sendQueryForApps(uint64_t appId) { +static void sendQueryForApps() { for (int i = 0; i < db.hubInfo.numHubs; i++ ) { - query_hub_for_apps(appId, i); + query_hub_for_apps(i); } } -static int return_id(int id) { +static int return_id(jint id) { // Note : This method is not thread safe. // id returned is guaranteed to be in use if (id >= 0) { @@ -333,9 +375,9 @@ static int return_id(int id) { return -1; } -static int generate_id() { +static jint generate_id() { // Note : This method is not thread safe. - int retVal = -1; + jint retVal = -1; if (!db.freeIds.empty()) { retVal = db.freeIds.front(); @@ -346,23 +388,14 @@ static int generate_id() { } -static int add_app_instance(const hub_app_info *appInfo, uint32_t hubHandle, - int appInstanceHandle, JNIEnv *env) { - - ALOGI("Loading App"); - +static jint add_app_instance(const hub_app_info *appInfo, uint32_t hubHandle, + jint appInstanceHandle, JNIEnv *env) { // Not checking if the apps are indeed distinct app_instance_info_s entry; assert(appInfo); - if (db.appInstances.count(appInstanceHandle) == 0) { - appInstanceHandle = generate_id(); - if (appInstanceHandle < 0) { - ALOGE("Cannot find resources to add app instance %d", - appInstanceHandle); - return -1; - } - } + const char *action = + (db.appInstances.count(appInstanceHandle) == 0) ? "Added" : "Updated"; entry.appInfo = *appInfo; @@ -372,42 +405,49 @@ static int add_app_instance(const hub_app_info *appInfo, uint32_t hubHandle, db.appInstances[appInstanceHandle] = entry; - // Finally - let the service know of this app instance + // Finally - let the service know of this app instance, to populate + // the Java cache. env->CallIntMethod(db.jniInfo.jContextHubService, db.jniInfo.contextHubServiceAddAppInstance, hubHandle, entry.instanceId, entry.truncName, entry.appInfo.version); - ALOGW("Added App 0x%" PRIx64 " on hub Handle %" PRId32 - " as appInstance %d", entry.truncName, + ALOGI("%s App 0x%" PRIx64 " on hub Handle %" PRId32 + " as appInstance %" PRId32, action, entry.truncName, entry.hubHandle, appInstanceHandle); return appInstanceHandle; } -int delete_app_instance(int id, JNIEnv *env) { - if (!db.appInstances.count(id)) { - ALOGW("Cannot find App id : %d", id); - return -1; - } +int delete_app_instance(jint id, JNIEnv *env) { + bool fullyDeleted = true; + if (db.appInstances.count(id)) { + db.appInstances.erase(id); + } else { + ALOGW("Cannot delete App id (%" PRId32 ") from the JNI C++ cache", id); + fullyDeleted = false; + } return_id(id); - db.appInstances.erase(id); - if (env->CallIntMethod(db.jniInfo.jContextHubService, + + if ((env == nullptr) || + (env->CallIntMethod(db.jniInfo.jContextHubService, db.jniInfo.contextHubServiceDeleteAppInstance, - id) != 0) { - ALOGW("Could not delete App id : %d", id); - return -1; + id) != 0)) { + ALOGW("Cannot delete App id (%" PRId32 ") from Java cache", id); + fullyDeleted = false; } - ALOGI("Deleted App id : %d", id); - - return 0; + if (fullyDeleted) { + ALOGI("Deleted App id : %" PRId32, id); + return 0; + } + return -1; } static int startLoadAppTxn(uint64_t appId, int hubHandle) { app_instance_info_s *txnInfo = (app_instance_info_s *)malloc(sizeof(app_instance_info_s)); - int instanceId = generate_id(); + jint instanceId = generate_id(); if (!txnInfo || instanceId < 0) { return_id(instanceId); @@ -432,8 +472,8 @@ static int startLoadAppTxn(uint64_t appId, int hubHandle) { return 0; } -static int startUnloadAppTxn(uint32_t appInstanceHandle) { - uint32_t *txnData = (uint32_t *) malloc(sizeof(uint32_t)); +static int startUnloadAppTxn(jint appInstanceHandle) { + jint *txnData = (jint *) malloc(sizeof(jint)); if (!txnData) { ALOGW("Cannot allocate memory to start unload transaction"); return -1; @@ -454,7 +494,6 @@ static void initContextHubService() { int err = 0; db.hubInfo.hubs = nullptr; db.hubInfo.numHubs = 0; - int i; err = hw_get_module(CONTEXT_HUB_MODULE_ID, (hw_module_t const**)(&db.hubInfo.contextHubModule)); @@ -465,7 +504,7 @@ static void initContextHubService() { } // Prep for storing app info - for(i = MIN_APP_ID; i <= MAX_APP_ID; i++) { + for (jint i = MIN_APP_ID; i <= MAX_APP_ID; i++) { db.freeIds.push(i); } @@ -485,7 +524,7 @@ static void initContextHubService() { return; } - for (i = 0; i < db.hubInfo.numHubs; i++) { + for (int i = 0; i < db.hubInfo.numHubs; i++) { db.hubInfo.cookies[i] = db.hubInfo.hubs[i].hub_id; ALOGI("Subscribing to hubHandle %d with OS App name %" PRIu64, i, db.hubInfo.hubs[i].os_app_name.id); if (db.hubInfo.contextHubModule->subscribe_messages(db.hubInfo.hubs[i].hub_id, @@ -495,7 +534,7 @@ static void initContextHubService() { } } - sendQueryForApps(ALL_APPS); + sendQueryForApps(); } else { ALOGW("No Context Hub Module present"); } @@ -539,21 +578,70 @@ int handle_query_apps_response(const uint8_t *msg, int msgLen, return -1; } - int numApps = msgLen/sizeof(hub_app_info); - hub_app_info info; + int numApps = msgLen / sizeof(hub_app_info); const hub_app_info *unalignedInfoAddr = (const hub_app_info*)msg; - for (int i = 0; i < numApps; i++, unalignedInfoAddr++) { - memcpy(&info, unalignedInfoAddr, sizeof(info)); + // We use this information to sync our JNI and Java caches of nanoapp info. + // We want to accomplish two things here: + // 1) Remove entries from our caches which are stale, and pertained to + // apps no longer running on Context Hub. + // 2) Populate our caches with the latest information of all these apps. + + // We make a couple of assumptions here: + // A) The JNI and Java caches are in sync with each other (this isn't + // necessarily true; any failure of a single call into Java land to + // update its cache will leave that cache in a bad state. For NYC, + // we're willing to tolerate this for now). + // B) The total number of apps is relatively small, so horribly inefficent + // algorithms aren't too painful. + // C) We're going to call this relatively infrequently, so its inefficency + // isn't a big impact. + + + // (1). Looking for stale cache entries. Yes, this is O(N^2). See + // assumption (B). Per assumption (A), it is sufficient to iterate + // over just the JNI cache. + auto end = db.appInstances.end(); + for (auto current = db.appInstances.begin(); current != end; ) { + app_instance_info_s cache_entry = current->second; + // We perform our iteration here because if we call + // delete_app_instance() below, it will erase() this entry. + current++; + bool entryIsStale = true; + for (int i = 0; i < numApps; i++) { + // We use memcmp since this could be unaligned. + if (memcmp(&unalignedInfoAddr[i].app_name.id, + &cache_entry.appInfo.app_name.id, + sizeof(cache_entry.appInfo.app_name.id)) == 0) { + // We found a match; this entry is current. + entryIsStale = false; + break; + } + } + if (entryIsStale) { + delete_app_instance(cache_entry.instanceId, env); + } + } + + // (2). Update our caches with the latest. + for (int i = 0; i < numApps; i++) { + hub_app_info query_info; + memcpy(&query_info, &unalignedInfoAddr[i], sizeof(query_info)); // We will only have one instance of the app // TODO : Change this logic once we support multiple instances of the same app - int appInstance = get_app_instance_for_app_id(info.app_name.id); - add_app_instance(&info, hubHandle, appInstance, env); + jint appInstance = get_app_instance_for_app_id(query_info.app_name.id); + if (appInstance == -1) { + // This is a previously unknown app, let's allocate an "id" for it. + appInstance = generate_id(); + } + add_app_instance(&query_info, hubHandle, appInstance, env); } return 0; } +// TODO(b/30807327): Do not use raw bytes for additional data. Use the +// JNI interfaces for the appropriate types. static void passOnOsResponse(uint32_t hubHandle, uint32_t msgType, status_response_t *rsp, int8_t *additionalData, size_t additionalDataLen) { @@ -584,7 +672,32 @@ static void passOnOsResponse(uint32_t hubHandle, uint32_t msgType, header[HEADER_FIELD_HUB_HANDLE] = hubHandle; header[HEADER_FIELD_APP_INSTANCE] = OS_APP_ID; - msg[0] = rsp->result; + // Due to API constraints, at the moment we can't change the fact that + // we're changing our 4-byte response to a 1-byte value. But we can prevent + // the possible change in sign (and thus meaning) that would happen from + // a naive cast. Further, we can log when we're losing part of the value. + // TODO(b/30918279): Don't truncate this result. + int8_t truncatedResult; + bool neededToTruncate; + if (rsp->result < INT8_MIN) { + neededToTruncate = true; + truncatedResult = INT8_MIN; + } else if (rsp->result > INT8_MAX) { + neededToTruncate = true; + truncatedResult = INT8_MAX; + } else { + neededToTruncate = false; + // Since this value fits within an int8_t, this is a safe cast which + // won't change the value or sign. + truncatedResult = static_cast(rsp->result); + } + if (neededToTruncate) { + ALOGW("Response from Context Hub truncated. Value was %" PRId32 + ", but giving Java layer %" PRId8, + rsp->result, (int)truncatedResult); + } + + msg[0] = truncatedResult; if (additionalData) { memcpy(&msg[1], additionalData, additionalDataLen); @@ -603,6 +716,8 @@ static void passOnOsResponse(uint32_t hubHandle, uint32_t msgType, env->CallIntMethod(db.jniInfo.jContextHubService, db.jniInfo.contextHubServiceMsgReceiptCallback, jheader, jmsg); + env->DeleteLocalRef(jmsg); + env->DeleteLocalRef(jheader); delete[] msg; } @@ -613,7 +728,13 @@ void closeUnloadTxn(bool success) { if (success && fetchTxnData(&txnId, &txnData) == 0 && txnId == CONTEXT_HUB_UNLOAD_APP) { - db.appInstances.erase(*(uint32_t *)txnData); + JNIEnv *env; + if ((db.jniInfo.vm)->AttachCurrentThread(&env, nullptr) != JNI_OK) { + ALOGW("Could not attach to JVM !"); + env = nullptr; + } + jint handle = *reinterpret_cast(txnData); + delete_app_instance(handle, env); } else { ALOGW("Could not unload the app successfully ! success %d, txnData %p", success, txnData); } @@ -621,7 +742,7 @@ void closeUnloadTxn(bool success) { closeTxn(); } -void closeLoadTxn(bool success, int *appInstanceHandle) { +static bool closeLoadTxn(bool success, jint *appInstanceHandle) { void *txnData; hub_messages_e txnId; @@ -635,13 +756,22 @@ void closeLoadTxn(bool success, int *appInstanceHandle) { add_app_instance(&info->appInfo, info->hubHandle, info->instanceId, env); } else { ALOGW("Could not attach to JVM !"); + success = false; } - sendQueryForApps(info->appInfo.app_name.id); + // While we just called add_app_instance above, our info->appInfo was + // incomplete (for example, the 'version' is hardcoded to -1). So we + // trigger an additional query to the CHRE, so we'll be able to get + // all the app "info", and have our JNI and Java caches with the + // full information. + sendQueryForApps(); } else { ALOGW("Could not load the app successfully ! Unexpected failure"); + *appInstanceHandle = INVALID_APP_ID; + success = false; } closeTxn(); + return success; } static bool isValidOsStatus(const uint8_t *msg, size_t msgLen, @@ -663,23 +793,6 @@ static bool isValidOsStatus(const uint8_t *msg, size_t msgLen, return true; } -static void invalidateNanoApps(uint32_t hubHandle) { - JNIEnv *env; - - if ((db.jniInfo.vm)->AttachCurrentThread(&env, nullptr) != JNI_OK) { - ALOGW("Could not attach to JVM !"); - } - - auto end = db.appInstances.end(); - for (auto current = db.appInstances.begin(); current != end; ) { - app_instance_info_s info = current->second; - current++; - if (info.hubHandle == hubHandle) { - delete_app_instance(info.instanceId, env); - } - } -} - static int handle_os_message(uint32_t msgType, uint32_t hubHandle, const uint8_t *msg, int msgLen) { int retVal = -1; @@ -697,8 +810,27 @@ static int handle_os_message(uint32_t msgType, uint32_t hubHandle, case CONTEXT_HUB_UNLOAD_APP: if (isValidOsStatus(msg, msgLen, &rsp)) { if (msgType == CONTEXT_HUB_LOAD_APP) { - int appInstanceHandle; - closeLoadTxn(rsp.result == 0, &appInstanceHandle); + jint appInstanceHandle = INVALID_APP_ID; + bool appRunningOnHub = (rsp.result == 0); + if (!(closeLoadTxn(appRunningOnHub, &appInstanceHandle))) { + if (appRunningOnHub) { + // Now we're in an odd situation. Our nanoapp + // is up and running on the Context Hub. However, + // something went wrong in our Service code so that + // we're not able to properly track this nanoapp + // in our Service code. If we tell the Java layer + // things are good, it's a lie because the handle + // we give them will fail when used with the Service. + // If we tell the Java layer this failed, it's kind + // of a lie as well, since this nanoapp is running. + // + // We leave a more robust fix for later, and for + // now just tell the user things have failed. + // + // TODO(b/30835981): Make this situation better. + rsp.result = -1; + } + } passOnOsResponse(hubHandle, msgType, &rsp, (int8_t *)(&appInstanceHandle), sizeof(appInstanceHandle)); } else if (msgType == CONTEXT_HUB_UNLOAD_APP) { @@ -728,8 +860,7 @@ static int handle_os_message(uint32_t msgType, uint32_t hubHandle, ALOGW("Context Hub handle %d restarted", hubHandle); closeTxn(); passOnOsResponse(hubHandle, msgType, &rsp, nullptr, 0); - invalidateNanoApps(hubHandle); - query_hub_for_apps(ALL_APPS, hubHandle); + query_hub_for_apps(hubHandle); retVal = 0; } break; @@ -778,7 +909,7 @@ int context_hub_callback(uint32_t hubId, if (messageType < CONTEXT_HUB_TYPE_PRIVATE_MSG_BASE) { handle_os_message(messageType, hubHandle, (uint8_t*) msg->message, msg->message_len); } else { - int appHandle = get_app_instance_for_app_id(msg->app_name.id); + jint appHandle = get_app_instance_for_app_id(msg->app_name.id); if (appHandle < 0) { ALOGE("Filtering out message due to invalid App Instance."); } else { @@ -1051,7 +1182,8 @@ static jint nativeSendMessage(JNIEnv *env, jobject instance, jintArray header_, ALOGD("Asking HAL to remove app"); retVal = db.hubInfo.contextHubModule->send_message(hubId, &msg); } else { - ALOGD("Could not find app instance %d on hubHandle %d, setAddress %d", + ALOGD("Could not find app instance %" PRId32 " on hubHandle %" PRId32 + ", setAddress %d", header[HEADER_FIELD_APP_INSTANCE], header[HEADER_FIELD_HUB_HANDLE], (int)setAddressSuccess); @@ -1060,7 +1192,8 @@ static jint nativeSendMessage(JNIEnv *env, jobject instance, jintArray header_, if (retVal != 0) { ALOGD("Send Message failure - %d", retVal); if (msgType == CONTEXT_HUB_LOAD_APP) { - closeLoadTxn(false, nullptr); + jint ignored; + closeLoadTxn(false, &ignored); } else if (msgType == CONTEXT_HUB_UNLOAD_APP) { closeUnloadTxn(false); } diff --git a/core/jni/android_view_RenderNode.cpp b/core/jni/android_view_RenderNode.cpp index b0028e1b6f5b4ca813d6256582da87ec72318107..1bad5f8ce456520ff059e979eff41a464de09c30 100644 --- a/core/jni/android_view_RenderNode.cpp +++ b/core/jni/android_view_RenderNode.cpp @@ -721,9 +721,9 @@ static const JNINativeMethod gMethods[] = { int register_android_view_RenderNode(JNIEnv* env) { jclass clazz = FindClassOrDie(env, "android/view/SurfaceView"); gSurfaceViewPositionUpdateMethod = GetMethodIDOrDie(env, clazz, - "updateWindowPositionRT", "(JIIII)V"); + "updateWindowPosition_renderWorker", "(JIIII)V"); gSurfaceViewPositionLostMethod = GetMethodIDOrDie(env, clazz, - "windowPositionLostRT", "(J)V"); + "windowPositionLost_uiRtSync", "(J)V"); clazz = FindClassOrDie(env, "android/view/RenderNode"); gOnRenderNodeDetached = GetMethodIDOrDie(env, clazz, "onRenderNodeDetached", "()V"); diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp index 21e4d2fb229fb9493069bcad256d8dad34325bed..a0c62c366285032ec1cb23f5c2db46cff6c23d81 100644 --- a/core/jni/android_view_Surface.cpp +++ b/core/jni/android_view_Surface.cpp @@ -487,6 +487,11 @@ static jint nativeSetScalingMode(JNIEnv *env, jclass clazz, jlong nativeObject, return surface->setScalingMode(scalingMode); } +static jint nativeForceScopedDisconnect(JNIEnv *env, jclass clazz, jlong nativeObject) { + Surface* surface = reinterpret_cast(nativeObject); + return surface->disconnect(-1, IGraphicBufferProducer::DisconnectMode::AllLocal); +} + namespace uirenderer { using namespace android::uirenderer::renderthread; @@ -564,6 +569,7 @@ static const JNINativeMethod gSurfaceMethods[] = { {"nativeGetHeight", "(J)I", (void*)nativeGetHeight }, {"nativeGetNextFrameNumber", "(J)J", (void*)nativeGetNextFrameNumber }, {"nativeSetScalingMode", "(JI)I", (void*)nativeSetScalingMode }, + {"nativeForceScopedDisconnect", "(J)I", (void*)nativeForceScopedDisconnect}, // HWUI context {"nHwuiCreate", "(JJ)J", (void*) hwui::create }, diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 0d8a95c9bcd338f517baf25398fe91dc31d725f7..73b3f52f078b9be0a9ff2101ef99f5e2f825cb5e 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -371,7 +371,12 @@ static void nativeSetDisplaySurface(JNIEnv* env, jclass clazz, if (sur != NULL) { bufferProducer = sur->getIGraphicBufferProducer(); } - SurfaceComposerClient::setDisplaySurface(token, bufferProducer); + status_t err = SurfaceComposerClient::setDisplaySurface(token, + bufferProducer); + if (err != NO_ERROR) { + doThrowIAE(env, "Illegal Surface, could not enable async mode. Was this" + " Surface created with singleBufferMode?"); + } } static void nativeSetDisplayLayerStack(JNIEnv* env, jclass clazz, diff --git a/core/jni/fd_utils-inl.h b/core/jni/fd_utils-inl.h index 37e01ba07ab2dc3da82b3c88208ec5199141bf0c..84252c019a6a290588baf96522517d05a5c4bb2f 100644 --- a/core/jni/fd_utils-inl.h +++ b/core/jni/fd_utils-inl.h @@ -52,7 +52,6 @@ static const char* kPathWhitelist[] = { "/dev/null", "/dev/socket/zygote", "/dev/socket/zygote_secondary", - "/system/etc/event-log-tags", "/sys/kernel/debug/tracing/trace_marker", "/system/framework/framework-res.apk", "/dev/urandom", diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index b624305e519bc8f7161e65acf6481de3ac13b7a4..13d1391a519fb5e9ed4035e168560fc022ab62b3 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -150,6 +150,8 @@ android:name="android.bluetooth.headset.profile.action.AUDIO_STATE_CHANGED" /> + + @@ -201,6 +204,8 @@ + + @@ -413,6 +418,8 @@ + + @@ -1330,6 +1337,7 @@ android:protectionLevel="dangerous" android:description="@string/permdesc_getAccounts" android:label="@string/permlab_getAccounts" /> + @@ -1659,7 +1667,7 @@ + android:protectionLevel="signature|setup" /> + + + + + \ No newline at end of file diff --git a/core/res/res/color/hint_foreground_material_dark.xml b/core/res/res/color/hint_foreground_material_dark.xml index 77883d975c7529716e4d408c235f1cef806967b8..5cc955952524424cfab802067f4b541331fc835a 100644 --- a/core/res/res/color/hint_foreground_material_dark.xml +++ b/core/res/res/color/hint_foreground_material_dark.xml @@ -15,6 +15,10 @@ --> + diff --git a/core/res/res/color/hint_foreground_material_light.xml b/core/res/res/color/hint_foreground_material_light.xml index 99168fdc29627b64d37f70372f647e50bd06bc1d..f7465e0e513970b885efb15d1329f85911786683 100644 --- a/core/res/res/color/hint_foreground_material_light.xml +++ b/core/res/res/color/hint_foreground_material_light.xml @@ -15,6 +15,10 @@ --> + diff --git a/core/res/res/drawable-hdpi/vpn_connected.png b/core/res/res/drawable-hdpi/vpn_connected.png index c3547e8557444e33792b51f5868615d956f9d4b1..e05e76ffc2751dbb644d4d51848722296061d331 100644 Binary files a/core/res/res/drawable-hdpi/vpn_connected.png and b/core/res/res/drawable-hdpi/vpn_connected.png differ diff --git a/core/res/res/drawable-hdpi/vpn_disconnected.png b/core/res/res/drawable-hdpi/vpn_disconnected.png index 10a9065cabdd2a1f6d63b946ffb002972c05097f..3508984b20991d82e144c24a6725e4e670d9fa58 100644 Binary files a/core/res/res/drawable-hdpi/vpn_disconnected.png and b/core/res/res/drawable-hdpi/vpn_disconnected.png differ diff --git a/core/res/res/drawable-mdpi/vpn_connected.png b/core/res/res/drawable-mdpi/vpn_connected.png index 7e167f84dfa4b288628da0a42419948ec73cc140..f7ac2a184834f81a6b8a91a01b63f0c16f092a58 100644 Binary files a/core/res/res/drawable-mdpi/vpn_connected.png and b/core/res/res/drawable-mdpi/vpn_connected.png differ diff --git a/core/res/res/drawable-mdpi/vpn_disconnected.png b/core/res/res/drawable-mdpi/vpn_disconnected.png index a08c42a2702a3ebcbd4e7497110de1656291d63a..9db4199d026269a4cb35a9178082d3e6c3b8f914 100644 Binary files a/core/res/res/drawable-mdpi/vpn_disconnected.png and b/core/res/res/drawable-mdpi/vpn_disconnected.png differ diff --git a/core/res/res/drawable-nodpi/vpn_connected.xml b/core/res/res/drawable-nodpi/vpn_connected.xml new file mode 100644 index 0000000000000000000000000000000000000000..22a4a6cb4c6baf91315dcfbafe83e29f302cebf2 --- /dev/null +++ b/core/res/res/drawable-nodpi/vpn_connected.xml @@ -0,0 +1,24 @@ + + + + diff --git a/core/res/res/drawable-nodpi/vpn_disconnected.xml b/core/res/res/drawable-nodpi/vpn_disconnected.xml new file mode 100644 index 0000000000000000000000000000000000000000..22a4a6cb4c6baf91315dcfbafe83e29f302cebf2 --- /dev/null +++ b/core/res/res/drawable-nodpi/vpn_disconnected.xml @@ -0,0 +1,24 @@ + + + + diff --git a/core/res/res/drawable-xhdpi/vpn_connected.png b/core/res/res/drawable-xhdpi/vpn_connected.png index 1f46be2cea5d125b9324c9aa12522a6798719767..a8761c90af2d7ba8c43016e574dd429db8beb5cf 100644 Binary files a/core/res/res/drawable-xhdpi/vpn_connected.png and b/core/res/res/drawable-xhdpi/vpn_connected.png differ diff --git a/core/res/res/drawable-xhdpi/vpn_disconnected.png b/core/res/res/drawable-xhdpi/vpn_disconnected.png index 847d3f52701ff3e60657eb03d92f343e1f957b47..7118918ec6d52b0156642c561b8541194e6b50a2 100644 Binary files a/core/res/res/drawable-xhdpi/vpn_disconnected.png and b/core/res/res/drawable-xhdpi/vpn_disconnected.png differ diff --git a/core/res/res/drawable-xxhdpi/vpn_connected.png b/core/res/res/drawable-xxhdpi/vpn_connected.png index ea4930c4f420ca9676bef448a65e0114d3f61bef..16b1e4e2467b03b4f60cd07541eb615b0581c7d9 100644 Binary files a/core/res/res/drawable-xxhdpi/vpn_connected.png and b/core/res/res/drawable-xxhdpi/vpn_connected.png differ diff --git a/core/res/res/drawable-xxhdpi/vpn_disconnected.png b/core/res/res/drawable-xxhdpi/vpn_disconnected.png index 4cd0dd4a0226e64404ba071b65690b890b8b83f4..a0258186067c604a31b9bb4a1f4ecf1e8ff02ea0 100644 Binary files a/core/res/res/drawable-xxhdpi/vpn_disconnected.png and b/core/res/res/drawable-xxhdpi/vpn_disconnected.png differ diff --git a/core/res/res/drawable/emergency_icon.xml b/core/res/res/drawable/emergency_icon.xml new file mode 100644 index 0000000000000000000000000000000000000000..b2ffa2b4481c7a1fbb695d717fc52f7387ed2e07 --- /dev/null +++ b/core/res/res/drawable/emergency_icon.xml @@ -0,0 +1,40 @@ + + + + + + + + + diff --git a/core/res/res/drawable/ic_check_circle_24px.xml b/core/res/res/drawable/ic_check_circle_24px.xml index 066a8a73644b0693d03a95597fd2109b998f03bc..e9af9e49a5dd313000e496006522b07edc68c92b 100644 --- a/core/res/res/drawable/ic_check_circle_24px.xml +++ b/core/res/res/drawable/ic_check_circle_24px.xml @@ -18,9 +18,6 @@ Copyright (C) 2015 The Android Open Source Project android:height="24.0dp" android:viewportWidth="24.0" android:viewportHeight="24.0"> - diff --git a/core/res/res/drawable/ic_collapse_notification.xml b/core/res/res/drawable/ic_collapse_notification.xml index 603c159c0abc310a971f733b0ce6e8ecbbe2ed50..124e99e3a4bb709eb949379ccb29e7f87e3f47e8 100644 --- a/core/res/res/drawable/ic_collapse_notification.xml +++ b/core/res/res/drawable/ic_collapse_notification.xml @@ -22,7 +22,4 @@ Copyright (C) 2015 The Android Open Source Project - diff --git a/core/res/res/drawable/ic_expand_more_48dp.xml b/core/res/res/drawable/ic_expand_more_48dp.xml index 11323e3b0f7c5dab3e9055989906dd8b0ebbcbaf..5a71669428b571728c6b42bd5198120c5238a78b 100644 --- a/core/res/res/drawable/ic_expand_more_48dp.xml +++ b/core/res/res/drawable/ic_expand_more_48dp.xml @@ -21,7 +21,4 @@ Copyright (C) 2015 The Android Open Source Project - diff --git a/core/res/res/drawable/ic_expand_notification.xml b/core/res/res/drawable/ic_expand_notification.xml index db7d3ebbbc2198bfbdf8d0997cd02d560af03123..847e3269398d25505106e4e2dae9bfed71042ade 100644 --- a/core/res/res/drawable/ic_expand_notification.xml +++ b/core/res/res/drawable/ic_expand_notification.xml @@ -22,7 +22,4 @@ Copyright (C) 2015 The Android Open Source Project - diff --git a/core/res/res/drawable/ic_feedback.xml b/core/res/res/drawable/ic_feedback.xml index b2d1cb80c9c1742baea72254237bd6166a192e28..365863da31e210ea737e155f5b9f5be332a5d907 100644 --- a/core/res/res/drawable/ic_feedback.xml +++ b/core/res/res/drawable/ic_feedback.xml @@ -18,9 +18,6 @@ Copyright (C) 2016 The Android Open Source Project android:height="24.0dp" android:viewportWidth="24.0" android:viewportHeight="24.0"> - diff --git a/core/res/res/drawable/ic_more_items.xml b/core/res/res/drawable/ic_more_items.xml index 5fdcdcef7317d51aef0c0ce6ad810a7e2d0e0e54..0ec754c5c7c9d0b581433ffe66687ba17b3adac1 100644 --- a/core/res/res/drawable/ic_more_items.xml +++ b/core/res/res/drawable/ic_more_items.xml @@ -24,6 +24,5 @@ android:fillColor="#000000" android:pathData="M3 13h2v-2H3v2zm0 4h2v-2H3v2zm0-8h2V7H3v2zm4 4h14v-2H7v2zm0 4h14v-2H7v2zM7 7v2h14V7H7z" /> - + \ No newline at end of file diff --git a/core/res/res/drawable/ic_refresh.xml b/core/res/res/drawable/ic_refresh.xml index 1f671684861fbc7ffcacea938e53963dec71976e..1297407fbb8b8d8219c6727db72cb79759582348 100644 --- a/core/res/res/drawable/ic_refresh.xml +++ b/core/res/res/drawable/ic_refresh.xml @@ -21,7 +21,4 @@ Copyright (C) 2016 The Android Open Source Project - diff --git a/core/res/res/drawable/ic_schedule.xml b/core/res/res/drawable/ic_schedule.xml index 899dc821844e47b109012cd9e93e8e99253b943a..55d54b139ae07e3e3d320323a17e5d4dc59478d6 100644 --- a/core/res/res/drawable/ic_schedule.xml +++ b/core/res/res/drawable/ic_schedule.xml @@ -21,9 +21,6 @@ Copyright (C) 2016 The Android Open Source Project - diff --git a/core/res/res/drawable/perm_group_calendar.xml b/core/res/res/drawable/perm_group_calendar.xml index 4dc7b37dbf254ce5fa89b3b513d787eece017300..85a783e49497408847cb5449bd8a6891b74ee408 100644 --- a/core/res/res/drawable/perm_group_calendar.xml +++ b/core/res/res/drawable/perm_group_calendar.xml @@ -24,6 +24,5 @@ android:fillColor="#000000" android:pathData="M17 12h-5v5h5v-5zM16 1v2H8V1H6v2H5c-1.11 0-1.99 .9 -1.99 2L3 19c0 1.1 .89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2h-1V1h-2zm3 18H5V8h14v11z" /> - + \ No newline at end of file diff --git a/core/res/res/drawable/perm_group_camera.xml b/core/res/res/drawable/perm_group_camera.xml index 741a40e2891dceb640ccc4284e3ffe0095515fe3..61903a55361f4a10df0b8270df73a638449cc415 100644 --- a/core/res/res/drawable/perm_group_camera.xml +++ b/core/res/res/drawable/perm_group_camera.xml @@ -28,6 +28,4 @@ android:pathData="M9 2L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1 .9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2h-3.17L15 2H9zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z" /> - \ No newline at end of file diff --git a/core/res/res/drawable/perm_group_contacts.xml b/core/res/res/drawable/perm_group_contacts.xml index d698fd1735deb16bcd5fd8a51422ea9b640e6f35..8f9dc3e0d178eebaef6b89cad045f541832da80b 100644 --- a/core/res/res/drawable/perm_group_contacts.xml +++ b/core/res/res/drawable/perm_group_contacts.xml @@ -20,8 +20,6 @@ android:viewportWidth="24" android:viewportHeight="24"> - - \ No newline at end of file diff --git a/core/res/res/drawable/perm_group_microphone.xml b/core/res/res/drawable/perm_group_microphone.xml index c565d203caa42254a5666b6f3103dba7d4189e5a..d494e67c63ad5bdc86a9146cf56d143f302f2625 100644 --- a/core/res/res/drawable/perm_group_microphone.xml +++ b/core/res/res/drawable/perm_group_microphone.xml @@ -25,6 +25,4 @@ android:pathData="M12 14c1.66 0 2.99-1.34 2.99-3L15 5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3zm5.3-3c0 3-2.54 5.1-5.3 5.1S6.7 14 6.7 11H5c0 3.41 2.72 6.23 6 6.72V21h2v-3.28c3.28-.48 6-3.3 6-6.72h-1.7z" /> - \ No newline at end of file diff --git a/core/res/res/drawable/perm_group_phone_calls.xml b/core/res/res/drawable/perm_group_phone_calls.xml index a64789433608c764bac61cbf1c9f648af28b5a02..324d8649270342c3cf1fe43c08d36a62f0da1420 100644 --- a/core/res/res/drawable/perm_group_phone_calls.xml +++ b/core/res/res/drawable/perm_group_phone_calls.xml @@ -19,9 +19,6 @@ android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> - - - \ No newline at end of file diff --git a/core/res/res/drawable/perm_group_storage.xml b/core/res/res/drawable/perm_group_storage.xml index 477270d202e6cb02e4cb4a7c36e6970daa51c074..1ff169350d40e9b3b8415846c863f8e9fbba64e8 100644 --- a/core/res/res/drawable/perm_group_storage.xml +++ b/core/res/res/drawable/perm_group_storage.xml @@ -24,6 +24,4 @@ android:fillColor="#000000" android:pathData="M10 4H4c-1.1 0-1.99 .9 -1.99 2L2 18c0 1.1 .9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z" /> - \ No newline at end of file diff --git a/core/res/res/drawable/progress_indeterminate_anim_large_material.xml b/core/res/res/drawable/progress_indeterminate_anim_large_material.xml new file mode 100644 index 0000000000000000000000000000000000000000..560ec5af508f4159fa8d92ba1a2d213f42408ac2 --- /dev/null +++ b/core/res/res/drawable/progress_indeterminate_anim_large_material.xml @@ -0,0 +1,26 @@ + + + + + + + + diff --git a/core/res/res/drawable/progress_indeterminate_anim_medium_material.xml b/core/res/res/drawable/progress_indeterminate_anim_medium_material.xml new file mode 100644 index 0000000000000000000000000000000000000000..fbea22f443e1a569d046380b75ad6c1874934311 --- /dev/null +++ b/core/res/res/drawable/progress_indeterminate_anim_medium_material.xml @@ -0,0 +1,27 @@ + + + + + + + + + \ No newline at end of file diff --git a/core/res/res/drawable/progress_large_material.xml b/core/res/res/drawable/progress_large_material.xml index 526f9141d716da234b86d7646fd15fc6da55d9d4..ee82e35d00f5fec117ea41c99c41010d8ad07a9d 100644 --- a/core/res/res/drawable/progress_large_material.xml +++ b/core/res/res/drawable/progress_large_material.xml @@ -13,16 +13,8 @@ See the License for the specific language governing permissions and limitations under the License. --> - - - - - - - - + + + + diff --git a/core/res/res/drawable/progress_medium_material.xml b/core/res/res/drawable/progress_medium_material.xml index cc35816c9c3c61ebf5443ebf497163bba6ec651b..5c9260069e5d0eb617fe67e446df48bac590ee80 100644 --- a/core/res/res/drawable/progress_medium_material.xml +++ b/core/res/res/drawable/progress_medium_material.xml @@ -13,15 +13,8 @@ See the License for the specific language governing permissions and limitations under the License. --> - - - - - - - \ No newline at end of file + + + + diff --git a/core/res/res/drawable/progress_small_material.xml b/core/res/res/drawable/progress_small_material.xml index c6e43801cdf76c6d3ada4f50131265821e10105a..cec9d9565183dca04332aba123edc441f87560ba 100644 --- a/core/res/res/drawable/progress_small_material.xml +++ b/core/res/res/drawable/progress_small_material.xml @@ -13,16 +13,17 @@ See the License for the specific language governing permissions and limitations under the License. --> - - - - - - - - + + + + + + + + + diff --git a/core/res/res/drawable/progress_static_material.xml b/core/res/res/drawable/progress_static_material.xml new file mode 100644 index 0000000000000000000000000000000000000000..b078fa93a15579ff0f1f9060e2ad9f76e9455de4 --- /dev/null +++ b/core/res/res/drawable/progress_static_material.xml @@ -0,0 +1,25 @@ + + + + diff --git a/core/res/res/layout-sw600dp/date_picker_dialog.xml b/core/res/res/layout-sw600dp/date_picker_dialog.xml index 5e3ca14dd96caf82320a5e53d733ffd476eb83b7..cd6af463b8ff41b0af50c0a1f50af7eb102e3ffd 100644 --- a/core/res/res/layout-sw600dp/date_picker_dialog.xml +++ b/core/res/res/layout-sw600dp/date_picker_dialog.xml @@ -22,4 +22,4 @@ android:layout_height="wrap_content" android:spinnersShown="true" android:calendarViewShown="true" - android:datePickerMode="@integer/date_picker_mode" /> + android:dialogMode="true" /> diff --git a/core/res/res/layout/date_picker_dialog.xml b/core/res/res/layout/date_picker_dialog.xml index 8f36e95a15c68c5c7fdda81df927384a92118667..32a7360b3c3bf399bb58cd37065a061fac442366 100644 --- a/core/res/res/layout/date_picker_dialog.xml +++ b/core/res/res/layout/date_picker_dialog.xml @@ -22,4 +22,4 @@ android:layout_height="wrap_content" android:spinnersShown="true" android:calendarViewShown="false" - android:datePickerMode="@integer/date_picker_mode" /> + android:dialogMode="true" /> diff --git a/core/res/res/layout/time_picker_dialog.xml b/core/res/res/layout/time_picker_dialog.xml index d1f3902bd2d2864989b74563812ccc252b04f48c..ada18d16adb8b2ce386a265bd986cb59a47fada9 100644 --- a/core/res/res/layout/time_picker_dialog.xml +++ b/core/res/res/layout/time_picker_dialog.xml @@ -22,4 +22,4 @@ android:layout_gravity="center_horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:timePickerMode="@integer/time_picker_mode" /> + android:dialogMode="true" /> diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index bd92ab6fee3f4c9835a53da099f7e42669d8f0b7..4b59f21ec69a7d3c60b0fa394b3b5f5fb1ab1b4a 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -214,6 +214,7 @@ "Foonopsies" "Skermslot" "Sit af" + "Noodgeval" "Foutverslag" "Neem foutverslag" "Dit sal inligting oor die huidige toestand van jou toestel insamel om as \'n e-posboodskap te stuur. Dit sal \'n tydjie neem vandat die foutverslag begin is totdat dit reg is om gestuur te word; wees asseblief geduldig." @@ -1076,6 +1077,17 @@ "Wi-Fi het geen internettoegang nie" "Tik vir opsies" + "Het oorgeskakel na %1$s" + "Toestel gebruik %1$s wanneer %2$s geen internetverbinding het nie. Heffings kan geld." + "Het oorgeskakel van %1$s na %2$s" + + "sellulêre data" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "\'n onbekende netwerktipe" "Kon nie aan Wi-Fikoppel nie" " het \'n swak internetverbinding." "Laat verbinding toe?" @@ -1153,7 +1165,6 @@ "Tik om taal en uitleg te kies" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "kandidate" "Berei tans %s voor" "Kyk tans vir foute" "Nuwe %s bespeur" @@ -1232,8 +1243,9 @@ "Gekoppel aan %s. Tik om die netwerk te bestuur." "Altydaan-VPN koppel tans..." "Altydaan-VPN gekoppel" + "Altydaan-VPN is ontkoppel" "Altydaan-VPN-fout" - "Tik om op te stel" + "Tik om op te stel" "Kies lêer" "Geen lêer gekies nie" "Stel terug" @@ -1317,7 +1329,7 @@ "%s-USB-datastokkie" "USB-berging" "Redigeer" - "Dataverbruik-waarskuwing" + "Datagebruik-opletberig" "Tik om gebruik en instellings te bekyk." "2G-3G-datalimiet bereik" "4G-datalimiet bereik" @@ -1636,6 +1648,7 @@ "Voer taalnaam in" "Voorgestel" "Alle tale" + "Allle streke" "Soek" "Werkmodus is AF" "Stel werkprofiel in staat om te werk, insluitend programme, agtergrondsinkronisering en verwante kenmerke." diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 98fcebbeed1674963b222eac1b107044bc2e634c..54bddc753e3b78bf7cefa064bacb4b5dbf5ea77c 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -214,6 +214,7 @@ "የስልክ አማራጮች" "ማያ ቆልፍ" "ኃይል አጥፋ" + "ድንገተኛ አደጋ" "የሳንካ ሪፖርት" "የሳንካ ሪፖርት ውሰድ" "ይሄ እንደ የኢሜይል መልዕክት አድርጎ የሚልከውን ስለመሣሪያዎ የአሁኑ ሁኔታ መረጃ ይሰበስባል። የሳንካ ሪፖርቱን ከመጀመር ጀምሮ እስኪላክ ድረስ ትንሽ ጊዜ ይወስዳል፤ እባክዎ ይታገሱ።" @@ -1076,6 +1077,17 @@ "Wi-Fi በይነመረብ መዳረሻ የለውም" "ለአማራጮች መታ ያድርጉ" + "ወደ %1$s ተቀይሯል" + "%2$s ምንም ዓይነት የበይነመረብ ግንኙነት በማይኖረው ጊዜ መሣሪያዎች %1$sን ይጠቀማሉ። ክፍያዎች ተፈጻሚ ሊሆኑ ይችላሉ።" + "ከ%1$s ወደ %2$s ተቀይሯል" + + "የተንቀሳቃሽ ስልክ ውሂብ" + "Wi-Fi" + "ብሉቱዝ" + "ኤተርኔት" + "VPN" + + "አንድ ያልታወቀ አውታረ መረብ ዓይነት" "ወደ Wi-Fi ለማያያዝ አልተቻለም" " ደካማ የበይነመረብ ግንኙነት ኣለው።" "ግንኙነት ይፈቀድ?" @@ -1153,7 +1165,6 @@ "ቋንቋ እና አቀማመጥን ለመምረጥ መታ ያድርጉ" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "ዕጩዎች" "%sን በማዘጋጀት ላይ" "ስህተቶች ካሉ በመፈተሽ ላይ" "አዲስ %s ተገኝቷል" @@ -1232,8 +1243,9 @@ "ለ%s የተገናኘ። አውታረመረቡን ለማደራጀት ሁለቴ ንካ።" "ሁልጊዜ የበራ VPN በመገናኘት ላይ…" "ሁልጊዜ የበራ VPN ተገናኝቷል" + "ሁልጊዜ የበራ የVPN ግንኙነት ተቋርጧል" "ሁልጊዜ የበራ VPN ስህተት" - "ለማዋቀር መታ ያድርጉ" + "ለማዋቀር መታ ያድርጉ" "ፋይል ምረጥ" "ምንም ፋይል አልተመረጠም" "ዳግም አስጀምር" @@ -1317,7 +1329,7 @@ "የ%s ዩኤስቢ አንጻፊ" "የUSB ማከማቻ" "አርትዕ" - "የውሂብ አጠቃቀም ማስጠንቀቂየ" + "የውሂብ አጠቃቀም ማንቂያ" "አጠቃቀምን እና ቅንብሮችን ለማየት መታ ያድርጉ።" "የ2ጂ-3ጂ ውሂብ ገደብ ላይ ተደርሷል" "የ4ጂ ውሂብ ገደብ ላይ ተደርሷል" @@ -1636,6 +1648,7 @@ "የቋንቋ ስም ይተይቡ" "የተጠቆሙ" "ሁሉም ቋንቋዎች" + "ሁሉም ክልሎች" "ፈልግ" "የሥራ ሁነታ ጠፍቷል" "መተግበሪያዎችን፣ የበስተጀርባ ሥምረት እና ተዛማጅ ባሕሪዎችን ጨምሮ የሥራ መገለጫ እንዲሰራ ይፍቀዱ።" diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 32df247ef4aae5a0e10f2b393253fc10ab0e5049..493170bf7c0c9b8731083b2e0fed599d882d4a03 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -222,6 +222,7 @@ "خيارات الهاتف" "تأمين الشاشة" "إيقاف التشغيل" + "الطوارئ" "تقرير الأخطاء" "إعداد تقرير بالأخطاء" "سيجمع هذا معلومات حول حالة جهازك الحالي لإرسالها كرسالة إلكترونية، ولكنه سيستغرق وقتًا قليلاً من بدء عرض تقرير بالأخطاء. وحتى يكون جاهزًا للإرسال، الرجاء الانتظار." @@ -1045,7 +1046,7 @@ "إجراءات النص" "مساحة التخزين منخفضة" "قد لا تعمل بعض وظائف النظام" - "ليست هناك سعة تخزينية كافية للنظام. تأكد من أنه لديك مساحة خالية تبلغ ۲۵۰ ميغابايت وأعد التشغيل." + "ليست هناك سعة تخزينية كافية للنظام. تأكد من أنه لديك مساحة خالية تبلغ ٢٥٠ ميغابايت وأعد التشغيل." "%1$s قيد التشغيل" "انقر للحصول على مزيد من المعلومات أو لإيقاف التطبيق." "موافق" @@ -1176,6 +1177,17 @@ "‏شبكة Wi-Fi غير متصلة بالإنترنت" "انقر للحصول على الخيارات." + "تم التبديل إلى %1$s" + "يستخدم الجهاز %1$s عندما لا يتوفر اتصال بالإنترنت في شبكة %2$s، ويمكن أن يتم فرض رسوم مقابل ذلك." + "تم التبديل من %1$s إلى %2$s" + + "بيانات شبكة الجوّال" + "Wi-Fi" + "بلوتوث" + "إيثرنت" + "‏شبكة ظاهرية خاصة (VPN)" + + "نوع شبكة غير معروف" "‏تعذر الاتصال بـ Wi-Fi" " لديها اتصال إنترنت رديء." "هل تريد السماح بالاتصال؟" @@ -1253,7 +1265,6 @@ "انقر لاختيار لغة وتنسيق" " أ ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي" " 0123456789 أ ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي" - "العناصر المرشحة" "جارٍ تحضير %s" "جارٍ التحقق من الأخطاء" "تم اكتشاف %s جديدة" @@ -1332,8 +1343,9 @@ "تم الاتصال بـ %s. انقر لإدارة الشبكة." "‏جارٍ الاتصال بشبكة ظاهرية خاصة (VPN) دائمة التشغيل..." "‏تم الاتصال بشبكة ظاهرية خاصة (VPN) دائمة التشغيل" + "‏تم فصل الشبكة الظاهرية الخاصة (VPN) دائمة التشغيل" "‏خطأ بشبكة ظاهرية خاصة (VPN) دائمة التشغيل" - "انقر للتهيئة." + "انقر للإعداد." "اختيار ملف" "لم يتم اختيار أي ملف" "إعادة تعيين" @@ -1421,7 +1433,7 @@ "‏محرك أقراص USB من %s" "‏وحدة تخزين USB" "تعديل" - "تحذير استخدام البيانات" + "تنبيه استخدام البيانات" "انقر لعرض الاستخدام والإعدادات." "‏تم بلوغ حد بيانات اتصال 2G-3G" "‏تم بلوغ حد بيانات اتصال 4G" @@ -1780,6 +1792,7 @@ "اكتب اسم اللغة" "المقترحة" "جميع اللغات" + "كل المناطق" "البحث" "وضع العمل معطَّل" "السماح باستخدام الملف الشخصي للعمل، بما في ذلك التطبيقات ومزامنة الخلفية والميزات ذات الصلة." diff --git a/core/res/res/values-az-rAZ/strings.xml b/core/res/res/values-az-rAZ/strings.xml index b1ed7dd3a0d7f23c865236e11d02baf9c8b6ffc8..7c3f2a44eef0e5e27770f4c8211a38f2ad3dc2b4 100644 --- a/core/res/res/values-az-rAZ/strings.xml +++ b/core/res/res/values-az-rAZ/strings.xml @@ -214,6 +214,7 @@ "Telefon seçimləri" "Ekran kilidi" "Söndür" + "Təcili" "Baq hesabatı" "Baqı xəbər verin" "Bu, sizin hazırkı cihaz durumu haqqında məlumat toplayacaq ki, elektron məktub şəklində göndərsin. Baq raportuna başlamaq üçün bir az vaxt lazım ola bilər, bir az səbr edin." @@ -1076,6 +1077,17 @@ "Wi-Fi-ın İnternetə girişi yoxdur" "Seçimlər üçün tıklayın" + "%1$s şəbəkə növünə keçirildi" + "%2$s şəbəkəsinin İnternetə çıxışı olmadıqda, cihaz %1$s şəbəkəsini istifadə edir. Ödəniş tətbiq oluna bilər." + "%1$s şəbəkəsindən %2$s şəbəkəsinə keçirildi" + + "mobil data" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "naməlum şəbəkə növü" "Wi-Fi\'a qoşulmaq alınmadı" " internet bağlantısı keyfiyyətsizdir." "Bağlantıya icazə verilsin?" @@ -1153,7 +1165,6 @@ "Dil və tərtibatı seçmək üçün tıklayın" " ABCÇDEƏFGĞHXIİJKQLMNOÖPRSŞTUÜVYZ" " 0123456789ABCÇDEƏFGĞHİIJKLMNOÖPQRSŞTUÜVWXYZ" - "namizədlər" "%s hazırlanır" "Səhvlər yoxlanılır" "Yeni %s aşkarlandı" @@ -1232,8 +1243,9 @@ "%s sessiyaya qoşulun. Şəbəkəni idarə etmək üçün tıklayın." "Həmişə aktiv VPN bağlanır..." "VPN bağlantısı həmişə aktiv" + "Həmişə aktiv VPN bağlantısı kəsildi" "Həmişə aktiv VPN xətası" - "Konfiqurasiya üçün tıklayın" + "Quraşdırmaq üçün tıklayın" "Fayl seçin" "Heç bir fayl seçilməyib" "Sıfırlayın" @@ -1317,7 +1329,7 @@ "%s USB drayv" "USB yaddaş" "Düzəliş edin" - "Data istifadə xəbərdarlığı" + "Data istifadə siqnalı" "İstifadə və ayarları görmək üçün tıklayın." "2G-3G data limitinə çatdı" "4G data limitinə çatdı" @@ -1636,6 +1648,7 @@ "Dil adını daxil edin" "Təklif edilmiş" "Bütün dillər" + "Bütün bölgələr" "Axtarın" "İş rejimi DEAKTİVDİR" "Tətbiq, arxa fon sinxronizasiyası və digər əlaqədar xüsusiyyətlər daxil olmaqla iş profilinin fəaliyyətinə icazə verin." diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index ad74e2e152868c6d30b0c07eb63489ecca7c201d..50e1327f4a9cdff58ec23e94b46cff5dacf4e7a0 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -152,7 +152,7 @@ "Nije moguće potvrditi autentičnost." "Potvrda identiteta preko proksi servera nije uspela." "Nije moguće povezati se sa serverom." - "Nije moguće komunicirati sa serverom. Pokušajte ponovo kasnije." + "Nije moguće komunicirati sa serverom. Probajte ponovo kasnije." "Veza sa serverom je istekla." "Stranica sadrži previše veza za preusmeravanje sa servera." "Protokol nije podržan." @@ -160,7 +160,7 @@ "Stranicu nije moguće otvoriti zato što je URL adresa nevažeća." "Nije moguće pristupiti datoteci." "Nije moguće pronaći traženu datoteku." - "Previše zahteva se obrađuje. Pokušajte ponovo kasnije." + "Previše zahteva se obrađuje. Probajte ponovo kasnije." "Greška pri prijavljivanju za %1$s" "Sinhronizacija" "Sinhronizacija" @@ -216,6 +216,7 @@ "Opcije telefona" "Zaključaj ekran" "Isključi" + "Hitni poziv" "Izveštaj o grešci" "Napravi izveštaj o grešci" "Ovim će se prikupiti informacije o trenutnom stanju uređaja kako bi bile poslate u poruci e-pošte. Od započinjanja izveštaja o grešci do trenutka za njegovo slanje proći će neko vreme; budite strpljivi." @@ -256,9 +257,9 @@ "Skladište" "pristupa slikama, medijima i datotekama na uređaju" "Mikrofon" - "snima audio snimke" + "snima audio" "Kamera" - "snima slike i video snimke" + "snima slike i video" "Telefon" "upućuje telefonske pozive i upravlja njima" "Senzori za telo" @@ -439,19 +440,19 @@ "Dozvoljava aplikaciji da aktivira metode za dodavanje i brisanje šablona otisaka prstiju koji će se koristiti." "koristi hardver za otiske prstiju" "Dozvoljava aplikaciji da koristi hardver za otiske prstiju radi potvrde autentičnosti" - "Otkriven je delimični otisak prsta. Pokušajte ponovo." - "Nije uspela obrada otiska prsta. Pokušajte ponovo." + "Otkriven je delimični otisak prsta. Probajte ponovo." + "Nije uspela obrada otiska prsta. Probajte ponovo." "Senzor za otiske prstiju je prljav. Očistite ga i pokušajte ponovo." - "Prebrzo ste pomerili prst. Pokušajte ponovo." - "Previše sporo ste pomerili prst. Pokušajte ponovo." + "Prebrzo ste pomerili prst. Probajte ponovo." + "Previše sporo ste pomerili prst. Probajte ponovo." "Hardver za otiske prstiju nije dostupan." "Nije moguće sačuvati otisak prsta. Uklonite neki od postojećih otisaka prstiju." - "Vremensko ograničenje za otisak prsta je isteklo. Pokušajte ponovo." + "Vremensko ograničenje za otisak prsta je isteklo. Probajte ponovo." "Radnja sa otiskom prsta je otkazana." - "Previše pokušaja. Pokušajte ponovo kasnije." - "Pokušajte ponovo." + "Previše pokušaja. Probajte ponovo kasnije." + "Probajte ponovo." "Prst %d" @@ -679,8 +680,8 @@ "Hitne službe" "Nazad na poziv" "Tačno!" - "Pokušajte ponovo" - "Pokušajte ponovo" + "Probajte ponovo" + "Probajte ponovo" "Otključaj za sve funkcije i podatke" "Premašen je najveći dozvoljeni broj pokušaja Otključavanja licem" "Nema SIM kartice" @@ -704,19 +705,19 @@ "Pogledajte Korisnički vodič ili kontaktirajte Korisničku podršku." "SIM kartica je zaključana." "Otključavanje SIM kartice…" - "%1$d puta ste nepravilno nacrtali šablon za otključavanje. \n\nPokušajte ponovo za %2$d sekunde(i)." - "%1$d puta ste pogrešno uneli lozinku. \n\nPokušajte ponovo za %2$d sekunde(i)." - "%1$d puta ste pogrešno uneli PIN. \n\nPokušajte ponovo za %2$d sekunde(i)." - "%1$d puta ste netačno uneli šablon za otključavanje. Nakon još %2$d nesupešna(ih) pokušaja, od vas će biti zatraženo da otključate tablet pomoću podataka za prijavljivanje na Google.\n\n Pokušajte ponovo za %3$d sekunde(i)." - "Neispravno ste nacrtali šablon za otključavanje %1$d puta. Posle još %2$d neuspešna(ih) pokušaja od vas će biti zatraženo da otključate TV pomoću podataka za prijavljivanje na Google.\n\n Pokušajte ponovo za %3$d sek." - "%1$d puta ste netačno uneli šablon za otključavanje. Nakon još %2$d nesupešna(ih) pokušaja, od vas će biti zatraženo da otključate telefon pomoću podataka za prijavljivanje na Google.\n\n Pokušajte ponovo za %3$d sekunde(i)." + "%1$d puta ste nepravilno nacrtali šablon za otključavanje. \n\nProbajte ponovo za %2$d sekunde(i)." + "%1$d puta ste pogrešno uneli lozinku. \n\nProbajte ponovo za %2$d sekunde(i)." + "%1$d puta ste pogrešno uneli PIN. \n\nProbajte ponovo za %2$d sekunde(i)." + "%1$d puta ste netačno uneli šablon za otključavanje. Nakon još %2$d nesupešna(ih) pokušaja, od vas će biti zatraženo da otključate tablet pomoću podataka za prijavljivanje na Google.\n\n Probajte ponovo za %3$d sekunde(i)." + "Neispravno ste nacrtali šablon za otključavanje %1$d puta. Posle još %2$d neuspešna(ih) pokušaja od vas će biti zatraženo da otključate TV pomoću podataka za prijavljivanje na Google.\n\n Probajte ponovo za %3$d sek." + "%1$d puta ste netačno uneli šablon za otključavanje. Nakon još %2$d nesupešna(ih) pokušaja, od vas će biti zatraženo da otključate telefon pomoću podataka za prijavljivanje na Google.\n\n Probajte ponovo za %3$d sekunde(i)." "Nepravilno ste pokušali da otključate tablet %1$d puta. Nakon još neuspešnih pokušaja (%2$d) tablet će biti resetovan na fabrička podešavanja i svi korisnički podaci će biti izgubljeni." "Pokušali ste da otključate TV netačno %1$d puta. Posle još %2$d neuspešna(ih) pokušaja TV će biti resetovan na podrazumevana fabrička podešavanja i svi korisnički podaci će biti izgubljeni." "Neispravno ste pokušali da otključate telefon %1$d puta. Nakon još neuspešnih pokušaja (%2$d) telefon će biti resetovan na fabrička podešavanja i svi korisnički podaci će biti izgubljeni." "Neispravno ste pokušali da otključate tablet %d puta. Tablet će sada biti vraćen na podrazumevana fabrička podešavanja." "Pokušali ste da otključate TV netačno %d puta. TV će sada biti resetovan na podrazumevana fabrička podešavanja." "Neispravno ste pokušali da otključate telefon %d puta. Telefon će sada biti vraćen na podrazumevana fabrička podešavanja." - "Pokušajte ponovo za %d sekunde(i)." + "Probajte ponovo za %d sekunde(i)." "Zaboravili ste šablon?" "Otključavanje naloga" "Previše pokušaja unosa šablona" @@ -1101,6 +1102,17 @@ "Wi-Fi nema pristup internetu" "Dodirnite za opcije" + "Prešli ste na tip mreže %1$s" + "Uređaj koristi tip mreže %1$s kada tip mreže %2$s nema pristup internetu. Možda će se naplaćivati troškovi." + "Prešli ste sa tipa mreže %1$s na tip mreže %2$s" + + "mobilni podaci" + "Wi-Fi" + "Bluetooth" + "Eternet" + "VPN" + + "nepoznat tip mreže" "Nije moguće povezati sa Wi-Fi mrežom" " ima lošu internet vezu." "Želite li da dozvolite povezivanje?" @@ -1172,13 +1184,12 @@ "DELI" "ODBIJ" "Promenite tastaturu" - "Zadrži ga na ekranu dok je fizička tastatura aktivna" + "Zadrži je na ekranu dok je fizička tastatura aktivna" "Prikaži virtuelnu tastaturu" "Konfigurišite fizičku tastaturu" "Dodirnite da biste izabrali jezik i raspored" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "kandidati" "%s se priprema" "Proverava se da li postoje greške" "Novi uređaj %s je otkriven" @@ -1257,8 +1268,9 @@ "Povezano sa sesijom %s. Dodirnite da biste upravljali mrežom." "Povezivanje stalno uključenog VPN-a..." "Stalno uključeni VPN je povezan" + "Veza sa stalno uključenim VPN-om je prekinuta" "Greška stalno uključenog VPN-a" - "Dodirnite da biste konfigurisali" + "Dodirnite da biste podesili" "Odaberi datoteku" "Nije izabrana nijedna datoteka" "Ponovo postavi" @@ -1343,7 +1355,7 @@ "%s USB disk" "USB memorija" "Izmeni" - "Upozorenje o potrošnji podataka" + "Obaveštenje o potrošnji podataka" "Dodirnite za potrošnju i podešavanja." "Nema više 2G-3G podataka" "Nema više 4G podataka" @@ -1409,7 +1421,7 @@ "Pogrešan šablon" "Pogrešna lozinka" "Pogrešan PIN" - "Pokušajte ponovo za %1$d sekunde(i)." + "Probajte ponovo za %1$d sekunde(i)." "Nacrtajte šablon" "Unesite PIN SIM kartice" "Unesite PIN" @@ -1431,18 +1443,18 @@ "Nevažeće korisničko ime ili lozinka." "Zaboravili ste korisničko ime ili lozinku?\nPosetite adresu ""google.com/accounts/recovery""." "Provera naloga…" - "Uneli ste netačni PIN %1$d puta. \n\nPokušajte ponovo za %2$d sekunde(i)." - "Uneli ste netačnu lozinku %1$d puta. \n\nPokušajte ponovo za %2$d sekunde(i)." - "Nacrtali ste šablon za otključavanje netačno %1$d puta. \n\nPokušajte ponovo za %2$d sekunde(i)." + "Uneli ste netačni PIN %1$d puta. \n\nProbajte ponovo za %2$d sekunde(i)." + "Uneli ste netačnu lozinku %1$d puta. \n\nProbajte ponovo za %2$d sekunde(i)." + "Nacrtali ste šablon za otključavanje netačno %1$d puta. \n\nProbajte ponovo za %2$d sekunde(i)." "Pokušali ste da otključate tablet netačno %1$d puta. Nakon još %2$d neuspešna(ih) pokušaja tablet će biti resetovan na fabrička podešavanja i svi korisnički podaci će biti izgubljeni." "Pokušali ste da otključate TV netačno %1$d puta. Posle još %2$d neuspešna(ih) pokušaja TV će biti resetovan na podrazumevana fabrička podešavanja i svi korisnički podaci će biti izgubljeni." "Pokušali ste da otključate telefon netačno %1$d puta. Posle još %2$d neuspešna(ih) pokušaja telefon će biti resetovan na fabrička podešavanja i svi korisnički podaci će biti izgubljeni." "Pokušali ste da otključate tablet netačno %d puta. Tablet će sada biti vraćen na podrazumevana fabrička podešavanja." "Pokušali ste da otključate TV netačno %d puta. TV će sada biti resetovan na podrazumevana fabrička podešavanja." "Pokušali ste da otključate telefon netačno %d puta. Telefon će sada biti vraćen na podrazumevana fabrička podešavanja." - "Nacrtali ste šablon za otključavanje netačno %1$d puta. Posle još %2$d neuspešna(ih) pokušaja, od vas će biti zatraženo da otključate tablet pomoću naloga e-pošte.\n\nPokušajte ponovo za %3$d sekunde(i)." - "Neispravno ste nacrtali šablon za otključavanje %1$d puta. Posle još %2$d neuspešna(ih) pokušaja, od vas će biti zatraženo da otključate TV pomoću naloga e-pošte.\n\n Pokušajte ponovo za %3$d sek." - "Nacrtali ste šablon za otključavanje netačno %1$d puta. Posle još %2$d neuspešna(ih) pokušaja, od vas će biti zatraženo da otključate telefon pomoću naloga e-pošte.\n\nPokušajte ponovo za %3$d sekunde(i)." + "Nacrtali ste šablon za otključavanje netačno %1$d puta. Posle još %2$d neuspešna(ih) pokušaja, od vas će biti zatraženo da otključate tablet pomoću naloga e-pošte.\n\nProbajte ponovo za %3$d sekunde(i)." + "Neispravno ste nacrtali šablon za otključavanje %1$d puta. Posle još %2$d neuspešna(ih) pokušaja, od vas će biti zatraženo da otključate TV pomoću naloga e-pošte.\n\n Probajte ponovo za %3$d sek." + "Nacrtali ste šablon za otključavanje netačno %1$d puta. Posle još %2$d neuspešna(ih) pokušaja, od vas će biti zatraženo da otključate telefon pomoću naloga e-pošte.\n\nProbajte ponovo za %3$d sekunde(i)." " – " "Ukloni" "Želite da pojačate zvuk iznad preporučenog nivoa?\n\nSlušanje glasne muzike duže vreme može da vam ošteti sluh." @@ -1553,14 +1565,14 @@ "Novi PIN" "Potvrdite novi PIN" "Napravite PIN za izmenu ograničenja" - "PIN-ovi se ne podudaraju. Pokušajte ponovo." + "PIN-ovi se ne podudaraju. Probajte ponovo." "PIN je prekratak. Mora da sadrži najmanje 4 cifre." - Pokušajte ponovo za %d sekundu - Pokušajte ponovo za %d sekunde - Pokušajte ponovo za %d sekundi + Probajte ponovo za %d sekundu + Probajte ponovo za %d sekunde + Probajte ponovo za %d sekundi - "Pokušajte ponovo kasnije" + "Probajte ponovo kasnije" "Prikazuje se ceo ekran" "Da biste izašli, prevucite nadole odozgo." "Važi" @@ -1672,6 +1684,7 @@ "Unesite naziv jezika" "Predloženi" "Svi jezici" + "Svi regioni" "Pretraži" "Režim za Work je ISKLJUČEN" "Dozvoljava profilu za Work da funkcioniše, uključujući aplikacije, sinhronizaciju u pozadini i srodne funkcije." diff --git a/core/res/res/values-be-rBY/strings.xml b/core/res/res/values-be-rBY/strings.xml index 237820c69c218c512e74753341cd9c2ff21376f9..cadc0bc9ebd4b86df56b03809cb411b0d62950ca 100644 --- a/core/res/res/values-be-rBY/strings.xml +++ b/core/res/res/values-be-rBY/strings.xml @@ -218,6 +218,7 @@ "Параметры тэлефона" "Блакіроўка экрана" "Выключыць" + "SOS-выклік" "Справаздача пра памылкі" "Справаздача пра памылку" "Будзе збiрацца iнфармацыя пра бягучы стан прылады, якая будзе адпраўляцца на электронную пошту. Стварэнне справаздачы пра памылкi зойме некаторы час." @@ -1126,6 +1127,17 @@ "У Wi-Fi няма доступу да Інтэрнэту" "Дакраніцеся, каб убачыць параметры" + "Выкананы пераход да %1$s" + "Прылада выкарыстоўвае %1$s, калі ў %2$s няма доступу да інтэрнэту. Можа спаганяцца дадатковая плата." + "Выкананы пераход з %1$s да %2$s" + + "сотавая перадача даных" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "невядомы тып сеткі" "Немагчыма падключыцца да Wi-Fi" " дрэннае падключэнне да Інтэрнэту." "Дазволіць падключэнне?" @@ -1203,7 +1215,6 @@ "Дакраніцеся, каб выбраць мову і раскладку" " АБВГДЕЁЖЗІЙКЛМНОПРСТУЎФХЦЧШ\'ЫЬЭЮЯ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "кандыдат." "Падрыхтоўка %s" "Праверка на наяўнасць памылак" "Выяўлены новы носьбіт %s" @@ -1282,8 +1293,9 @@ "Падлучаны да %s. Націсніце, каб кiраваць сеткай." "Падключэнне заўсёды ўключанага VPN..." "Заўсёды ўключаны i падключаны VPN" + "Заўсёды ўключаны VPN адключаны" "Памылка заўсёды ўключанага VPN" - "Дакраніцеся, каб сканфігураваць" + "Дакраніцеся, каб наладзіць" "Выберыце файл" "Файл не выбраны" "Скінуць" @@ -1369,7 +1381,7 @@ "USB-дыск %s" "USB-назапашвальнік" "Рэдагаваць" - "Папярэджанне выкарыстання дадзеных" + "Абвестка аб выкарыстанні трафіка" "Прагляд выкарыстання і налад." "Дасягнуты ліміт трафіку 2G-3G" "Дасягнуты ліміт трафіку 4G" @@ -1708,6 +1720,7 @@ "Увядзіце назву мовы" "Прапанаваныя" "Усе мовы" + "Усе рэгіёны" "Шукаць" "Рэжым працы АДКЛЮЧАНЫ" "Дазволіць функцыянаванне працоўнага профілю, у тым ліку праграм, фонавай сінхранізацыі і звязаных з імі функцый." diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 098a1a5662a6ba097824ad347ad2f59a023b7afa..4d8915b46202cfe67f083a24f87f302044e18dac 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -214,6 +214,7 @@ "Опции на телефона" "Заключване на екрана" "Изключване" + "Спешно обаждане" "Сигнал за програмна грешка" "Сигнал за програмна грешка" "По този начин ще се събере информация за текущото състояние на устройството ви, която да се изпрати като имейл съобщение. След стартирането на процеса ще мине известно време, докато сигналът за програмна грешка бъде готов за подаване. Моля, имайте търпение." @@ -1076,6 +1077,17 @@ "Wi-Fi мрежата няма достъп до интернет" "Докоснете за опции" + "Превключи се към %1$s" + "Устройството използва %1$s, когато %2$s няма достъп до интернет. Възможно е да бъдете таксувани." + "Превключи се от %1$s към %2$s" + + "мобилни данни" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "виртуална частна мрежа (VPN)" + + "неизвестен тип мрежа" "Не можа да се свърже с Wi-Fi" " има лоша връзка с интернет." "Да се разреши ли връзката?" @@ -1153,7 +1165,6 @@ "Докоснете, за да изберете език и подредба" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "кандидати" "%s: Подготвя се" "Проверява се за грешки" "Открито е ново хранилище (%s)" @@ -1232,8 +1243,9 @@ "Свързана с/ъс %s. Докоснете, за да управлявате мрежата." "Установява се връзка с винаги включената виртуална частна мрежа (VPN)…" "Установена е връзка с винаги включената виртуална частна мрежа (VPN)" + "Няма връзка с винаги включената виртуална частна мрежа (VPN)" "Грешка във винаги включената виртуална частна мрежа (VPN)" - "Докоснете, за да конфигурирате" + "Докоснете, за да настроите" "Избор на файл" "Няма избран файл" "Повторно задаване" @@ -1317,7 +1329,7 @@ "USB устройство от %s" "USB хранилище" "Редактиране" - "Предупрежд. за ползване на данни" + "Сигнал за преноса на данни" "Пренос и настройки: Докоснете за преглед." "Достигнат лимит за 2G/3G данните" "Достигнат лимит за 4G данните" @@ -1636,6 +1648,7 @@ "Въведете име на език" "Предложени" "Всички езици" + "Всички региони" "Търсене" "Работният режим е ИЗКЛЮЧЕН" "Разрешаване на функционирането на служебния потребителски профил, включително приложенията, синхронизирането на заден план и свързаните функции." diff --git a/core/res/res/values-bn-rBD/strings.xml b/core/res/res/values-bn-rBD/strings.xml index c9e921a481952594b413b6651b60beaebd79f2c3..8d893e53a91cdf3855ee8e7c6382c73b71dafe35 100644 --- a/core/res/res/values-bn-rBD/strings.xml +++ b/core/res/res/values-bn-rBD/strings.xml @@ -214,8 +214,9 @@ "ফোন বিকল্পগুলি" "স্ক্রীণ লক" "পাওয়ার বন্ধ করুন" + "জরুরী" "ত্রুটির প্রতিবেদন" - "ত্রুটির প্রতিবেদন করুন" + "ত্রুটির অভিযোগ করুন" "এটি একটি ই-মেল বার্তা পাঠানোর জন্য আপনার ডিভাইসের বর্তমান অবস্থা সম্পর্কে তথ্য সংগ্রহ করবে৷ ত্রুটির প্রতিবেদন শুরুর সময় থেকে এটি পাঠানোর জন্য প্রস্তুত হতে কিছুটা সময় নেবে; দয়া করে ধৈর্য রাখুন৷" "ইন্টারেক্টিভ প্রতিবেদন" "বেশিরভাগ পরিস্থিতিতে এটিকে ব্যবহার করুন৷ এটি আপনাকে প্রতিবেদনের কাজ কতটা হয়েছে তার উপর নজর রাখতে দেয়, সমস্যাটির সম্পর্কে আরো অনেক কিছু লিখতে দেয় এবং স্ক্রীনশটগুলি নিতে দেয়৷ এটি হয়ত প্রতিবেদন করতে খুব বেশি সময় নেয় এমনকি কম-ব্যবহৃত বিভাগগুলি সরিয়ে দিতে পারে৷" @@ -1007,7 +1008,7 @@ "%1$s সাড়া দিচ্ছে না" "%1$s প্রক্রিয়া সাড়া দিচ্ছে না" "ঠিক আছে" - "প্রতিবেদন করুন" + "অভিযোগ করুন" "অপেক্ষা করুন" "পৃষ্ঠাটি কোনো পতিক্রিয়া করছে না৷\n\nআপনি কি এটিকে বন্ধ করতে চান?" "অ্যাপ্লিকেশানকে পুনঃনির্দেশিত করা হয়েছে" @@ -1076,6 +1077,17 @@ "ওয়াই-ফাই -তে কোনো ইন্টারনেট অ্যাক্সেস নেই" "বিকল্পগুলির জন্য আলতো চাপুন" + "%1$s এ পাল্টানো হয়েছে" + "যখন %2$s এর কোনো ইন্টারনেট অ্যাক্সেস থাকে না তখন ডিভাইস %1$s ব্যবহার করে৷ চার্জ লাগতে পারে৷" + "%1$s থেকে %2$s এ পাল্টানো হয়েছে" + + "সেলুলার ডেটা" + "Wi-Fi" + "Bluetooth" + "ইথারনেট" + "VPN" + + "এই নেটওয়ার্কের প্রকার অজানা" "ওয়াই-ফাই এর সাথে সংযোগ করা যায়নি" " একটি দুর্বল ইন্টারনেট সংযোগ রয়েছে৷" "সংযোগের অনুমতি দেবেন?" @@ -1153,7 +1165,6 @@ "ভাষা এবং লেআউট নির্বাচন করুন আলতো চাপ দিন" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "প্রার্থীরা" "%s প্রস্তুত করা হচ্ছে" "ত্রুটি রয়েছে কিনা পরীক্ষা করা হচ্ছে" "নতুন %s সনাক্ত করা হয়েছে" @@ -1232,8 +1243,9 @@ "%s তে সংযুক্ত হয়েছে৷ নেটওয়ার্ক পরিচালনা করতে আলতো চাপুন৷" "সর্বদা-চালু VPN সংযুক্ত হচ্ছে..." "সর্বদা-চালু VPN সংযুক্ত হয়েছে" + "সর্বদা-চালু VPN এর সংযোগ বিচ্ছিন্ন হয়েছে" "সর্বদা-চালু VPN ত্রুটি" - "কনফিগার করতে আলতো চাপুন" + "সেট আপ করতে আলতো চাপুন" "ফাইল বেছে নিন" "কোনো ফাইল নির্বাচন করা হয়নি" "পুনরায় সেট করুন" @@ -1317,7 +1329,7 @@ "%s USB ড্রাইভ" "USB সঞ্চয়স্থান" "সম্পাদনা করুন" - "ডেটা ব্যবহারের সতর্কতা" + "ডেটা ব্যবহারের সতর্কতা" "ব্যবহার এবং সেটিংস দেখতে আলতো চাপুন৷" "2G-3G ডেটা সীমা ছাড়িয়েছে" "4G ডেটা সীমা ছাড়িয়েছে" @@ -1636,6 +1648,7 @@ "ভাষার নাম লিখুন" "প্রস্তাবিত" "সকল ভাষা" + "সমস্ত অঞ্চল" "অনুসন্ধান করুন" "কাজের মোড বন্ধ আছে" "অ্যাপ্লিকেশান, পটভূমি সিঙ্ক এবং সম্পর্কিত বৈশিষ্ট্যগুলি সহ কর্মস্থলের প্রোফাইলটিকে কাজ করার অনুমতি দিন।" diff --git a/core/res/res/values-bs-rBA/strings.xml b/core/res/res/values-bs-rBA/strings.xml index 20104a6d900b345de591c88f13f75bc9e597281c..e8a3c028eeaa1ad3515d8ed1d34dbfdc0d0932c7 100644 --- a/core/res/res/values-bs-rBA/strings.xml +++ b/core/res/res/values-bs-rBA/strings.xml @@ -216,6 +216,7 @@ "Opcije telefona" "Zaključavanje ekrana" "Isključi telefon" + "Hitni slučaj" "Izvještaj o greškama" "Kreirajte izvještaj o greškama" "Ovim će se prikupljati informacije o trenutnom stanju uređaja, koji će biti poslani kao poruka e-pošte. Može malo potrajati dok se izvještaj o greškama ne kreira i bude spreman za slanje. Budite strpljivi." @@ -1103,6 +1104,17 @@ "Wi-Fi nema pristup Internetu" "Dodirnite za opcije" + "Prebačeno na: %1$s" + "Kada na uređaju %2$s nema pristup internetu, koristi se %1$s. Moguća je naplata usluge." + "Prebačeno iz mreže %1$s u %2$s mrežu" + + "mobilni podaci" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "nepoznata vrsta mreže" "Problem prilikom spajanja na Wi-Fi mrežu" " ima lošu internet vezu." "Želite li dozvoliti povezivanje?" @@ -1180,7 +1192,6 @@ "Dodirnite za odabir jezika i rasporeda" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "kandidati" "Priprema se %s" "Provjera grešaka" "Novi uređaj %s je otkriven" @@ -1259,8 +1270,9 @@ "Povezano sa sesijom %s. Dodirnite da upravljate mrežom." "Povezivanje na uvijek aktivni VPN…" "Povezan na uvijek aktivni VPN" + "Uvijek aktivni VPN nije povezan" "Greška u povezivanju na uvijek aktivni VPN" - "Dodirnite za konfiguriranje" + "Dodirnite za postavke" "Odabir fajla" "Nije izabran nijedan fajl" "Ponovno pokretanje" @@ -1345,7 +1357,7 @@ "%s USB disk" "USB pohrana" "Uredi" - "Upozorenje za prijenos podataka" + "Upozorenje o prijenosu podataka" "Dodirnite za prikaz upotrebe i postavki." "Dostignut limit za 2G-3G podatke" "Dostignut limit za 4G podatke" @@ -1586,7 +1598,7 @@ "Ažurirao administrator" "Izbrisao administrator" "Da bi se trajanje baterije produžilo, opcija za štednju baterije minimizira rad uređaja i ograničava vibriranje, usluge lokacije i većinu prijenosa podataka u pozadini. E-pošta, poruke i druge aplikacije koje se oslanjaju na sinhronizaciju ne mogu biti ažurirane dok ih ne otvorite.\n\nŠtednja baterije se automatski isključi prilikom punjenja uređaja." - "Da bi se smanjilo korištenje podataka, usluga Ušteda podataka sprečava da neke aplikacije šalju ili primaju podatke u pozadini. Aplikacija koju trenutno koristite može pristupiti podacima, ali se to može desiti rjeđe. To može značiti, naprimjer, da se slike ne prikazuju sve dok ih ne dodirnete." + "Da bi se smanjio prijenos podataka, usluga Ušteda podataka sprečava da neke aplikacije šalju ili primaju podatke u pozadini. Aplikacija koju trenutno koristite može pristupiti podacima, ali se to može desiti rjeđe. To može značiti, naprimjer, da se slike ne prikazuju sve dok ih ne dodirnete." "Uključiti Uštedu podataka?" "Uključi" @@ -1674,6 +1686,7 @@ "Ukucajte naziv jezika" "Predloženo" "Svi jezici" + "Sve regije" "Pretraga" "Radni način rada je ISKLJUČEN" "Omogući radnom profilu da funkcionira, uključujući aplikacije, sinhronizaciju u pozadini i povezane funkcije." diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index eeed89204aee5a55b69a895208c85a8e4a56bb42..137d924ac1fc4fe0699fd4c73a636de67db6eaf0 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -214,6 +214,7 @@ "Opcions del telèfon" "Bloqueig de pantalla" "Apaga" + "Emergències" "Informe d\'error" "Crea informe d\'errors" "Es recopilarà informació sobre l\'estat actual del dispositiu i se t\'enviarà per correu electrònic. Passaran uns quants minuts des de l\'inici de l\'informe d\'errors fins al seu enviament, per la qual cosa et recomanem que tinguis paciència." @@ -1076,6 +1077,17 @@ "La Wi-Fi no té accés a Internet" "Toca per veure les opcions" + "Actualment en ús: %1$s" + "El dispositiu utilitza %1$s en cas que %2$s no tingui accés a Internet. És possible que s\'apliquin càrrecs." + "Abans es feia servir la xarxa %1$s; ara s\'utilitza %2$s" + + "dades mòbils" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "una tipus de xarxa desconegut" "No s\'ha pogut connectar a la Wi-Fi" " té una mala connexió a Internet." "Vols permetre la connexió?" @@ -1153,7 +1165,6 @@ "Toca per seleccionar l\'idioma i el disseny" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "candidats" "S\'està preparant %s" "S\'està comprovant si hi ha errors" "S\'ha detectat %s" @@ -1232,8 +1243,9 @@ "Connectat a %s. Pica per gestionar la xarxa." "T\'estàs connectant a la VPN sempre activada…" "Estàs connectat a la VPN sempre activada" + "La VPN sempre activada està desconnectada" "Error de la VPN sempre activada" - "Toca per configurar" + "Toca per configurar" "Trieu un fitxer" "No s\'ha escollit cap fitxer" "Restableix" @@ -1317,7 +1329,7 @@ "Unitat USB de: %s" "Emmagatzematge USB" "Edita" - "Advertiment d\'ús de dades" + "Alerta d\'ús de dades" "Toca per veure l\'ús i la configuració." "Límit de dades 2G-3G assolit" "Límit de dades 4G assolit" @@ -1636,6 +1648,7 @@ "Nom de l\'idioma" "Suggerits" "Tots els idiomes" + "Totes les regions" "Cerca" "Mode de feina desactivat" "Permet que el perfil professional funcioni, incloses les aplicacions, la sincronització en segon pla i les funcions relacionades." diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index df8bffdc4aa80f0337b9fad181551e60cef79b06..8037681ea37a771e7edf18f42b17525448061190 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -218,6 +218,7 @@ "Možnosti telefonu" "Zámek obrazovky" "Vypnout" + "Stav nouze" "Hlášení chyb" "Vytvořit chybové hlášení" "Shromažďuje informace o aktuálním stavu zařízení. Tyto informace je následně možné poslat v e-mailové zprávě, chvíli však potrvá, než bude hlášení o chybě připraveno k odeslání. Buďte prosím trpěliví." @@ -692,7 +693,7 @@ "V telefonu není žádná SIM karta." "Vložte SIM kartu." "SIM karta chybí nebo je nečitelná. Vložte SIM kartu." - "Nepoužitelná karta SIM." + "Nepoužitelná SIM karta." "Vaše SIM karta byla natrvalo zablokována.\n Požádejte svého poskytovatele bezdrátových služeb o další SIM kartu." "Předchozí skladba" "Další skladba" @@ -1126,6 +1127,17 @@ "Wi-Fi nemá přístup k internetu" "Klepnutím zobrazíte možnosti" + "Přechod na síť %1$s" + "Když síť %2$s nebude mít přístup k internetu, zařízení použije síť %1$s. Mohou být účtovány poplatky." + "Přechod ze sítě %1$s na síť %2$s" + + "mobilní data" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "neznámý typ sítě" "Připojení k síti Wi-Fi se nezdařilo" " má pomalé připojení k internetu." "Povolit připojení?" @@ -1203,7 +1215,6 @@ "Klepnutím vyberte jazyk a rozvržení" " AÁBCČDĎEÉĚFGHCHIÍJKLMNŇOÓPQRŘSŠTŤUÚVWXYÝZŽ" " 0123456789AÁBCČDĎEÉĚFGHCHIÍJKLMNŇOÓPQRŘSŠTŤUÚVWXYÝZŽ" - "kandidáti" "Probíhá příprava úložiště %s" "Kontrola chyb" "Zjištěno nové úložiště %s" @@ -1282,8 +1293,9 @@ "Připojeno k relaci %s. Klepnutím můžete síť spravovat." "Připojování k trvalé síti VPN…" "Je připojena trvalá síť VPN" + "Trvalá síť VPN je odpojena" "Chyba trvalé sítě VPN" - "Klepnutím zahájíte konfiguraci" + "Klepnutím přejděte do Nastavení" "Zvolit soubor" "Není vybrán žádný soubor" "Resetovat" @@ -1369,7 +1381,7 @@ "Jednotka USB %s" "Úložiště USB" "Upravit" - "Upozornění na využití dat" + "Upozornění na používání dat" "Klepnutím zobrazíte nastavení." "Dosáhli jste limitu dat 2G–3G" "Dosáhli jste limitu dat 4G" @@ -1708,6 +1720,7 @@ "Zadejte název jazyka" "Navrhované" "Všechny jazyky" + "Všechny oblasti" "Vyhledávání" "Pracovní režim je VYPNUTÝ" "Povolí fungování pracovního profilu, včetně aplikací, synchronizace na pozadí a souvisejících funkcí." diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 731c84746c6a4ed008b4d801483184cf7334bd49..eb4d2555f9f4ed6784b137a6ff363313b7f0db14 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -214,6 +214,7 @@ "Indstillinger for telefon" "Skærmlås" "Sluk" + "Nødopkald" "Fejlrapport" "Lav fejlrapport" "Der indsamles oplysninger om din enheds aktuelle status, der efterfølgende sendes i en e-mail. Der går lidt tid, fra fejlrapporten påbegyndes, til den er klar til at blive sendt. Tak for tålmodigheden." @@ -1076,6 +1077,17 @@ "Wi-Fi har ingen internetadgang" "Tryk for at se valgmuligheder" + "Der blev skiftet til %1$s" + "Enheden benytter %1$s, når %2$s ikke har adgang til internettet. Der opkræves muligvis gebyr." + "Der blev skiftet fra %1$s til %2$s" + + "mobildata" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "en ukendt netværkstype" "Kunne ikke oprette forbindelse til Wi-Fi" " har en dårlig internetforbindelse." "Vil du tillade denne forbindelse?" @@ -1153,7 +1165,6 @@ "Tryk for at vælge sprog og layout" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "kandidater" "Forbereder %s" "Kontrollerer for fejl" "Der blev registreret et nyt %s" @@ -1232,8 +1243,9 @@ "Forbundet til %s. Tryk for at administrere netværket." "Opretter forbindelse til altid aktiveret VPN…" "Always-on VPN er forbundet" + "Forbindelsen til altid aktiveret VPN er afbrudt" "Fejl i altid aktiveret VPN" - "Tryk for at konfigurere" + "Tryk for at konfigurere" "Vælg fil" "Ingen fil er valgt" "Nulstil" @@ -1317,7 +1329,7 @@ "USB-drev fra %s" "USB-lager" "Rediger" - "Advarsel om dataforbrug" + "Underretning om dataforbrug" "Tryk for at se forbrug og indstillinger." "Grænsen for 2G-3G-data er nået" "Grænsen for 4G-data er nået" @@ -1636,6 +1648,7 @@ "Angiv sprogets navn" "Foreslået" "Alle sprog" + "Alle områder" "Søg" "Arbejdstilstand er slået FRA" "Tillad, at arbejdsprofilen aktiveres, bl.a. i forbindelse med apps, baggrundssynkronisering og relaterede funktioner." diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index c478607cfca4c7f7dc0c0c545736df338e94a493..a6fad85e2df93643e149f8e11205fec15ef8c468 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -214,6 +214,7 @@ "Telefonoptionen" "Displaysperre" "Ausschalten" + "Notfall" "Fehlerbericht" "Fehlerbericht abrufen" "Bei diesem Fehlerbericht werden Daten zum aktuellen Status deines Geräts erfasst und als E-Mail versandt. Vom Start des Berichts bis zu seinem Versand kann es eine Weile dauern. Bitte habe etwas Geduld." @@ -416,7 +417,7 @@ "Ermöglicht der App, Pakete zu empfangen, die mithilfe von Multicast-Adressen an sämtliche Geräte in einem WLAN versendet wurden, nicht nur an dein Telefon. Dies nimmt mehr Leistung in Anspruch als der Nicht-Multicast-Modus." "Auf Bluetooth-Einstellungen zugreifen" "Ermöglicht der App, das lokale Bluetooth-Tablet zu konfigurieren, Remote-Geräte zu erkennen und eine Verbindung zu diesen herzustellen" - "Ermöglicht der App, den lokalen Bluetooth-Fernseher zu konfigurieren, Remote-Geräte zu erkennen und ein Pairing mit diesen durchzuführen" + "Ermöglicht der App, den lokalen Bluetooth-Fernseher zu konfigurieren, Remote-Geräte zu erkennen und eine Kopplung mit ihnen durchzuführen" "Ermöglicht der App, das lokale Bluetooth-Telefon zu konfigurieren, Remote-Geräte zu erkennen und eine Verbindung zu diesen herzustellen" "WiMAX-Verbindungen herstellen und trennen" "Ermöglicht der App festzustellen, ob WiMAX aktiviert ist. Zudem kann sie Informationen zu verbundenen WiMAX-Netzwerken abrufen." @@ -424,9 +425,9 @@ "Ermöglicht der App, eine Verbindung zwischen dem Tablet und WiMAX-Netzwerken herzustellen und solche zu trennen." "Ermöglicht der App, eine Verbindung zwischen dem Fernseher und WiMAX-Netzwerken herzustellen und diese zu trennen" "Ermöglicht der App, eine Verbindung zwischen dem Telefon und WiMAX-Netzwerken herzustellen und solche zu trennen." - "Pairing mit Bluetooth-Geräten durchführen" + "Kopplung mit Bluetooth-Geräten durchführen" "Ermöglicht der App, die Bluetooth-Konfiguration eines Tablets einzusehen und Verbindungen zu gekoppelten Geräten herzustellen und zu akzeptieren." - "Ermöglicht der App, die Bluetooth-Konfiguration des Fernsehers einzusehen und Verbindungen zu Pairing-Geräten herzustellen und zu akzeptieren" + "Ermöglicht der App, die Bluetooth-Konfiguration des Fernsehers abzurufen und Verbindungen zu gekoppelten Geräten herzustellen und zu akzeptieren" "Ermöglicht der App, die Bluetooth-Konfiguration des Telefons einzusehen und Verbindungen mit gekoppelten Geräten herzustellen und zu akzeptieren." "Nahfeldkommunikation steuern" "Ermöglicht der App die Kommunikation mit Tags für die Nahfeldkommunikation, Karten und Readern" @@ -1076,6 +1077,17 @@ "WLAN hat keinen Internetzugriff" "Für Optionen tippen" + "Zu %1$s gewechselt" + "Auf dem Gerät wird \"%1$s\" verwendet, wenn über \"%2$s\" kein Internet verfügbar ist. Eventuell fallen Gebühren an." + "Von \"%1$s\" zu \"%2$s\" gewechselt" + + "mobile Datennutzung" + "WLAN" + "Bluetooth" + "Ethernet" + "VPN" + + "ein unbekannter Netzwerktyp" "Es konnte keine WLAN-Verbindung hergestellt werden." " hat eine schlechte Internetverbindung." "Verbindung zulassen?" @@ -1153,7 +1165,6 @@ "Zum Auswählen von Sprache und Layout tippen" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "Kandidaten" "%s wird vorbereitet" "Nach Fehlern wird gesucht" "Neue %s entdeckt" @@ -1232,8 +1243,9 @@ "Verbunden mit %s. Zum Verwalten des Netzwerks tippen" "Verbindung zu durchgehend aktivem VPN wird hergestellt…" "Mit durchgehend aktivem VPN verbunden" + "Verbindung zu durchgehend aktivem VPN getrennt" "Durchgehend aktives VPN – Verbindungsfehler" - "Zum Konfigurieren tippen" + "Zum Einrichten tippen" "Datei auswählen" "Keine ausgewählt" "Zurücksetzen" @@ -1317,7 +1329,7 @@ "USB-Speichergerät von %s" "USB-Speicher" "Bearbeiten" - "Warnung zum Datenverbrauch" + "Warnung zur Datennutzung" "Für Nutzung und Einstellungen tippen." "2G-/3G-Datenlimit erreicht" "4G-Datenlimit erreicht" @@ -1636,6 +1648,7 @@ "Sprache eingeben" "Vorschläge" "Alle Sprachen" + "Alle Regionen" "Suche" "Arbeitsmodus ist AUS" "Arbeitsprofil aktivieren, einschließlich Apps, Synchronisierung im Hintergrund und verknüpfter Funktionen." diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 3c6e83217e898dcaae137eff446ac3a60fc15972..9e41023575f996e870d965810c89243bb879c759 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -214,6 +214,7 @@ "Επιλογές τηλεφώνου" "Κλείδωμα οθόνης" "Απενεργοποίηση" + "Κλήση έκτακτης ανάγκης" "Αναφορά σφαλμάτων" "Λήψη αναφοράς σφάλματος" "Θα συλλέξει πληροφορίες σχετικά με την τρέχουσα κατάσταση της συσκευής σας και θα τις στείλει μέσω μηνύματος ηλεκτρονικού ταχυδρομείου. Απαιτείται λίγος χρόνος για τη σύνταξη της αναφοράς σφάλματος και την αποστολή της. Κάντε λίγη υπομονή." @@ -249,7 +250,7 @@ "Ημερολόγιο" "έχει πρόσβαση στο ημερολόγιό σας" "SMS" - "αποστολή και προβολή μηνυμάτων SMS" + "στέλνει και να διαβάζει μηνύματα SMS" "Αποθηκευτικός χώρος" "έχει πρόσβαση στις φωτογραφίες/πολυμέσα/αρχεία στη συσκευή σας" "Μικρόφωνο" @@ -272,149 +273,149 @@ "Ελέγξτε το επίπεδο ζουμ και τη θέση της οθόνης." "Εκτέλεση κινήσεων" "Επιτρέπει το πάτημα, την ολίσθηση, το πλησίασμα και άλλες κινήσεις." - "απενεργοποίηση ή τροποποίηση γραμμής κατάστασης" + "απενεργοποιεί ή να τροποποιεί την γραμμή κατάστασης" "Επιτρέπει στην εφαρμογή να απενεργοποιεί τη γραμμή κατάστασης ή να προσθέτει και να αφαιρεί εικονίδια συστήματος." - "ορισμός ως γραμμής κατάστασης" + "ορίζεται ως γραμμή κατάστασης" "Επιτρέπει στην εφαρμογή να αποτελεί τη γραμμή κατάστασης." - "ανάπτυξη/σύμπτυξη γραμμής κατάστασης" + "αναπτύσσει/συμπτύσσει τη γραμμή κατάστασης" "Επιτρέπει στην εφαρμογή να αναπτύξει ή να συμπτύξει τη γραμμή κατάστασης." - "εγκατάσταση συντομεύσεων" + "εγκαθιστά συντομεύσεις" "Επιτρέπει σε μια εφαρμογή την προσθήκη συντομεύσεων στην Αρχική οθόνη χωρίς την παρέμβαση του χρήστη." - "κατάργηση εγκατάστασης συντομεύσεων" + "καταργεί την εγκατάσταση συντομεύσεων" "Επιτρέπει στην εφαρμογή την κατάργηση συντομεύσεων από την Αρχική οθόνη χωρίς την παρέμβαση του χρήστη." - "αναδρομολόγηση εξερχόμενων κλήσεων" + "αναδρομολογεί τις εξερχόμενες κλήσεις" "Επιτρέπει στην εφαρμογή να βλέπει τον αριθμό που καλέσατε κατά τη διάρκεια μιας εξερχόμενης κλήσης με επιλογή ανακατεύθυνσης της κλήσης σε έναν διαφορετικό αριθμό ή διακοπής της κλήσης." - "λήψη μηνυμάτων κειμένου (SMS)" + "λαμβάνει μηνύματα κειμένου (SMS)" "Επιτρέπει στην εφαρμογή τη λήψη και την επεξεργασία μηνυμάτων SMS. Αυτό σημαίνει ότι η εφαρμογή θα μπορούσε να παρακολουθήσει ή να διαγράψει τα μηνύματα που αποστέλλονται στη συσκευή σας χωρίς αυτά να εμφανιστούν σε εσάς." - "λήψη μηνυμάτων κειμένου (MMS)" + "λαμβάνει μηνύματα κειμένου (MMS)" "Επιτρέπει στην εφαρμογή τη λήψη και την επεξεργασία μηνυμάτων MMS. Αυτό σημαίνει ότι η εφαρμογή θα μπορούσε να παρακολουθήσει ή να διαγράψει τα μηνύματα που αποστέλλονται στη συσκευή σας χωρίς αυτά να εμφανιστούν σε εσάς." - "ανάγνωση μηνυμάτων που έχουν μεταδοθεί μέσω κινητού τηλεφώνου" + "διαβάζει μηνύματα που έχουν μεταδοθεί μέσω κινητού τηλεφώνου" "Επιτρέπει στην εφαρμογή την ανάγνωση μηνυμάτων που έχουν μεταδοθεί μέσω κινητού τηλεφώνου και έχουν ληφθεί από τη συσκευή σας. Ειδοποιήσεις που μεταδίδονται μέσω κινητού παραδίδονται σε ορισμένες τοποθεσίες για να σας προειδοποιήσουν για καταστάσεις έκτακτης ανάγκης. Κακόβουλες εφαρμογές ενδέχεται να παρεμποδίσουν την απόδοση ή τη λειτουργία της συσκευής σας κατά τη λήψη μετάδοσης μέσω κινητού σχετικά με μια επείγουσα κατάσταση." - "ανάγνωση ροών δεδομένων στις οποίες έχετε εγγραφεί" + "διαβάζει ροές δεδομένων στις οποίες έχετε εγγραφεί" "Επιτρέπει στην εφαρμογή τη λήψη λεπτομερειών σχετικά με τις τρέχουσες συγχρονισμένες ροές δεδομένων." - "πραγματοποιεί αποστολή και προβολή μηνυμάτων SMS" + "στέλνει και να διαβάζει μηνύματα SMS" "Επιτρέπει στην εφαρμογή των αποστολή μηνυμάτων SMS. Αυτό μπορεί να προκαλέσει μη αναμενόμενες χρεώσεις. Οι κακόβουλες εφαρμογές ενδέχεται να σας κοστίσουν χρήματα, αποστέλλοντας μηνύματα χωρίς την έγκρισή σας." - "ανάγνωση των μηνυμάτων κειμένου σας (SMS ή MMS)" + "διαβάζει τα μηνύματα κειμένου (SMS ή MMS)" "Επιτρέπει στην εφαρμογή την ανάγνωση μηνυμάτων SMS που είναι αποθηκευμένα στο tablet σας ή στην κάρτα σας SIM. Αυτό δίνει τη δυνατότητα στην εφαρμογή να διαβάζει όλα τα μηνύματα SMS, ανεξάρτητα από το περιεχόμενο ή το επίπεδο εμπιστευτικότητάς τους." "Επιτρέπει στην εφαρμογή να διαβάζει μηνύματα SMS που έχουν αποθηκευτεί στην τηλεόραση ή στην κάρτα SIM. Έτσι, η εφαρμογή μπορεί να διαβάζει όλα τα μηνύματα SMS, ανεξαρτήτως περιεχομένου ή εμπιστευτικότητας." "Επιτρέπει στην εφαρμογή την ανάγνωση μηνυμάτων SMS που είναι αποθηκευμένα στο τηλέφωνό σας ή στην κάρτα σας SIM. Αυτό δίνει τη δυνατότητα στην εφαρμογή να διαβάζει όλα τα μηνύματα SMS, ανεξάρτητα από το περιεχόμενο ή το επίπεδο εμπιστευτικότητάς τους." - "λήψη μηνυμάτων κειμένου (WAP)" + "λαμβάνει μηνύματα κειμένου (WAP)" "Επιτρέπει στην εφαρμογή τη λήψη και την επεξεργασία μηνυμάτων WAP. Αυτό σημαίνει ότι η εφαρμογή θα μπορούσε να παρακολουθήσει ή να διαγράψει τα μηνύματα που αποστέλλονται στη συσκευή σας χωρίς αυτά να εμφανιστούν σε εσάς." - "ανάκτηση εκτελούμενων εφαρμογών" + "ανακτά εκτελούμενες εφαρμογές" "Επιτρέπει στην εφαρμογή την ανάκτηση πληροφοριών σχετικά με τρέχουσες και πρόσφατα εκτελούμενες εργασίες. Αυτό μπορεί να δίνει τη δυνατότητα στην εφαρμογή να ανακαλύπτει πληροφορίες σχετικά με το ποιες εφαρμογές χρησιμοποιούνται στη συσκευή." - "διαχείριση προφίλ και κατόχων συσκευής" + "διαχειρίζεται το προφίλ και τους κατόχους συσκευής" "Επιτρέπει σε εφαρμογές να ορίζουν τους κατόχους προφίλ και τον κάτοχο της συσκευής." - "αναδιάταξη εκτελούμενων εφαρμογών" + "αναδιατάσσει τις εκτελούμενες εφαρμογές" "Επιτρέπει στην εφαρμογή τη μετακίνηση εργασιών στο προσκήνιο και το παρασκήνιο. Η εφαρμογή μπορεί να το κάνει αυτό χωρίς να καταχωρίσετε δεδομένα εισόδου." - "ενεργοποίηση λειτουργίας αυτοκινήτου" + "ενεργοποιεί την λειτουργία αυτοκινήτου" "Επιτρέπει στην εφαρμογή την ενεργοποίηση της λειτουργίας αυτοκινήτου." - "κλείσιμο των άλλων εφαρμογών" + "κλείνει άλλες εφαρμογές" "Επιτρέπει στην εφαρμογή τον τερματισμό των διεργασιών παρασκηνίου άλλων εφαρμογών. Αυτό μπορεί να προκαλεί τη διακοπή λειτουργίας άλλων εφαρμογών." - "σχεδίαση πάνω σε άλλες εφαρμογές" + "σχεδιάζει πάνω από άλλες εφαρμογές" "Επιτρέπει στην εφαρμογή το σχεδιασμό πάνω σε άλλες εφαρμογές ή τμήματα του περιβάλλοντος χρήστη. Ενδέχεται να παρεμβαίνουν στη χρήση του περιβάλλοντος σε άλλες εφαρμογές ή να αλλάζουν τα στοιχεία που βλέπετε σε άλλες εφαρμογές." - "να εκτελείται συνεχώς η εφαρμογή" + "επιτρέπει στην εφαρμογή να εκτελείται συνεχώς" "Επιτρέπει στην εφαρμογή να δημιουργεί μόνιμα τμήματα του εαυτού της στη μνήμη. Αυτό μπορεί να περιορίζει τη μνήμη που διατίθεται σε άλλες εφαρμογές, καθυστερώντας τη λειτουργία του tablet." "Επιτρέπει στην εφαρμογή να καθιστά τμήματά της μόνιμα στη μνήμη. Αυτό μπορεί να περιορίσει τη μνήμη που διατίθεται σε άλλες εφαρμογές, επιβραδύνοντας τη λειτουργία της τηλεόρασης." "Επιτρέπει στην εφαρμογή να δημιουργεί μόνιμα τμήματα του εαυτού της στη μνήμη. Αυτό μπορεί να περιορίζει τη μνήμη που διατίθεται σε άλλες εφαρμογές, καθυστερώντας τη λειτουργία του τηλεφώνου." - "μέτρηση αποθηκευτικού χώρου εφαρμογής" + "υπολογίζει τον αποθηκευτικό χώρο εφαρμογής" "Επιτρέπει στην εφαρμογή να ανακτήσει τα μεγέθη κώδικα, δεδομένων και προσωρινής μνήμης" "τροποποίηση ρυθμίσεων συστήματος" "Επιτρέπει στην εφαρμογή την τροποποίηση των δεδομένων των ρυθμίσεων του συστήματος. Τυχόν κακόβουλες εφαρμογές ενδέχεται να καταστρέψουν τη διαμόρφωση του συστήματός σας." - "εκτέλεση κατά την έναρξη" + "εκτελείται κατά την έναρξη" "Επιτρέπει στην εφαρμογή να εκκινηθεί αμέσως μόλις ολοκληρωθεί η εκκίνηση του συστήματος. Αυτό ενδέχεται να καθυστερήσει την εκκίνηση του tablet και να προκαλέσει γενική μείωση της ταχύτητας λειτουργίας του tablet, καθώς η εφαρμογή θα εκτελείται συνεχώς." "Επιτρέπει στην εφαρμογή να ξεκινάει μόλις ολοκληρώνεται η εκκίνηση του συστήματος. Αυτό μπορεί να καθυστερεί την εκκίνηση της τηλεόρασης και επιτρέπει στην εφαρμογή να επιβραδύνει τη συνολική λειτουργία του tablet, λόγω της συνεχούς προβολής." "Επιτρέπει στην εφαρμογή να εκκινηθεί αμέσως μόλις ολοκληρωθεί η εκκίνηση του συστήματος. Αυτό ενδέχεται να καθυστερήσει την εκκίνηση του τηλεφώνου και να προκαλέσει γενική μείωση της ταχύτητας λειτουργίας του τηλεφώνου, καθώς η εφαρμογή θα εκτελείται συνεχώς." - "αποστολή εκπομπής sticky" + "στέλνει εκπομπή sticky" "Επιτρέπει στην εφαρμογή την αποστολή εκπομπών sticky, οι οποίες παραμένουν μετά το τέλος της εκπομπής. Η υπερβολική χρήση ενδέχεται να καταστήσει τη λειτουργία του tablet αργή ή ασταθή, προκαλώντας τη χρήση μεγάλου τμήματος της μνήμης." "Επιτρέπει στην εφαρμογή να στέλνει εκπομπές που παραμένουν μετά το τέλος της μετάδοσης. Η υπερβολική χρήση μπορεί να καταστήσει αργή ή ασταθή τη λειτουργία της τηλεόρασης, προκαλώντας τη χρήση υπερβολικά μεγάλου μέρους της μνήμης." "Επιτρέπει στην εφαρμογή την αποστολή εκπομπών sticky, οι οποίες παραμένουν μετά το τέλος της εκπομπής. Η υπερβολική χρήση ενδέχεται να καταστήσει τη λειτουργία του τηλεφώνου αργή ή ασταθή, προκαλώντας τη χρήση μεγάλου τμήματος της μνήμης." - "ανάγνωση των επαφών σας" + "διαβάζει τις επαφές σας" "Επιτρέπει στην εφαρμογή την ανάγνωση δεδομένων σχετικά με τις επαφές σας που είναι αποθηκευμένες στο tablet σας, συμπεριλαμβανομένης της συχνότητας με την οποία έχετε καλέσει συγκεκριμένα άτομα ή έχετε επικοινωνήσει μαζί τους μέσω ηλεκτρονικού ταχυδρομείου ή άλλου τρόπου. Αυτή η άδεια δίνει τη δυνατότητα σε εφαρμογές να αποθηκεύουν τα δεδομένα των επαφών σας και οι κακόβουλες εφαρμογές ενδέχεται να μοιράζονται δεδομένα επαφών χωρίς να το γνωρίζετε." "Επιτρέπει στην εφαρμογή να διαβάζει δεδομένα σχετικά με τις επαφές σας που είναι αποθηκευμένες στην τηλεόρασή σας, συμπεριλαμβανομένης της συχνότητας με την οποία έχετε καλέσει συγκεκριμένα άτομα ή έχετε επικοινωνήσει μαζί τους μέσω ηλεκτρονικού ταχυδρομείου ή άλλου τρόπου. Αυτό το δικαίωμα επιτρέπει στις εφαρμογές να αποθηκεύουν τα δεδομένα των επαφών σας. Επίσης, κακόβουλες εφαρμογές μπορεί να μοιραστούν δεδομένα επαφών χωρίς να το γνωρίζετε." "Επιτρέπει στην εφαρμογή την ανάγνωση δεδομένων σχετικά με τις επαφές σας που είναι αποθηκευμένες στο τηλέφωνό σας, συμπεριλαμβανομένης της συχνότητας με την οποία έχετε καλέσει συγκεκριμένα άτομα ή έχετε επικοινωνήσει μαζί τους μέσω ηλεκτρονικού ταχυδρομείου ή άλλου τρόπου. Αυτή η άδεια δίνει τη δυνατότητα σε εφαρμογές να αποθηκεύουν τα δεδομένα των επαφών σας και οι κακόβουλες εφαρμογές ενδέχεται να μοιράζονται δεδομένα επαφών χωρίς να το γνωρίζετε." - "τροποποίηση των επαφών σας" + "τροποποιεί τις επαφές σας" "Επιτρέπει στην εφαρμογή την τροποποίηση των δεδομένων σχετικά με τις επαφές σας που είναι αποθηκευμένες στο tablet σας, συμπεριλαμβανομένης της συχνότητας με την οποία έχετε καλέσει συγκεκριμένες επαφές ή έχετε επικοινωνήσει μαζί τους μέσω ηλεκτρονικού ταχυδρομείου ή άλλου τρόπου. Αυτή η άδεια δίνει τη δυνατότητα σε εφαρμογές να διαγράφουν δεδομένα επαφών." "Επιτρέπει στην εφαρμογή να τροποποιεί τα δεδομένα σχετικά με τις επαφές που είναι αποθηκευμένες στην τηλεόρασή σας, συμπεριλαμβανομένης της συχνότητας με την οποία έχετε καλέσει συγκεκριμένες επαφές ή έχετε επικοινωνήσει μαζί τους μέσω ηλεκτρονικού ταχυδρομείου ή άλλου τρόπου. Αυτό το δικαίωμα δίνει τη δυνατότητα σε εφαρμογές να διαγράφουν δεδομένα επαφών." "Επιτρέπει στην εφαρμογή την τροποποίηση των δεδομένων σχετικά με τις επαφές σας που είναι αποθηκευμένες στο τηλέφωνό σας, συμπεριλαμβανομένης της συχνότητας με την οποία έχετε καλέσει συγκεκριμένες επαφές ή έχετε επικοινωνήσει μαζί τους μέσω ηλεκτρονικού ταχυδρομείου ή άλλου τρόπου. Αυτή η άδεια δίνει τη δυνατότητα σε εφαρμογές να διαγράφουν δεδομένα επαφών." - "ανάγνωση αρχείου καταγραφής κλήσεων" + "διαβάζει το αρχείο καταγραφής κλήσεων" "Επιτρέπει στην εφαρμογή την ανάγνωση του αρχείου καταγραφής κλήσεων του tablet σας, συμπεριλαμβανομένων των δεδομένων σχετικά με τις εισερχόμενες και τις εξερχόμενες κλήσεις. Αυτή η άδεια δίνει τη δυνατότητα στις εφαρμογές να αποθηκεύει τα δεδομένα του αρχείου καταγραφής κλήσεων και οι κακόβουλες εφαρμογές ενδέχεται να μοιράζονται δεδομένα του αρχείου καταγραφής κλήσεων χωρίς να το γνωρίζετε." "Επιτρέπει στην εφαρμογή να διαβάζει το αρχείο καταγραφής κλήσεων της τηλεόρασής σας, συμπεριλαμβανομένων δεδομένων σχετικά με τις εισερχόμενες και τις εξερχόμενες κλήσεις. Αυτό το δικαίωμα επιτρέπει στις εφαρμογές να αποθηκεύουν τα δεδομένα του αρχείου καταγραφής κλήσεων. Επίσης, κακόβουλες εφαρμογές μπορεί να μοιραστούν δεδομένα αρχείου καταγραφής κλήσεων χωρίς να το γνωρίζετε." "Επιτρέπει στην εφαρμογή την ανάγνωση του αρχείου καταγραφής κλήσεων του τηλεφώνου σας, συμπεριλαμβανομένων των δεδομένων σχετικά με τις εισερχόμενες και τις εξερχόμενες κλήσεις. Αυτή η άδεια δίνει τη δυνατότητα στις εφαρμογές να αποθηκεύει τα δεδομένα του αρχείου καταγραφής κλήσεων και οι κακόβουλες εφαρμογές ενδέχεται να μοιράζονται δεδομένα του αρχείου καταγραφής κλήσεων χωρίς να το γνωρίζετε." - "εγγραφή αρχείου καταγραφής κλήσεων" + "εγγράφει αρχείο καταγραφής κλήσεων" "Επιτρέπει στην εφαρμογή να τροποποιεί το αρχείο καταγραφής κλήσεων του tablet σας, συμπεριλαμβανομένων των δεδομένων σχετικά με τις εισερχόμενες και τις εξερχόμενες κλήσεις. Οι κακόβουλες εφαρμογές μπορεί να το χρησιμοποιήσουν για να διαγράψουν ή να τροποποιήσουν το αρχείο καταγραφής κλήσεων." "Επιτρέπει στην εφαρμογή να τροποποιεί το αρχείο καταγραφής κλήσεων της τηλεόρασής σας, συμπεριλαμβανομένων των δεδομένων σχετικά με τις εισερχόμενες και τις εξερχόμενες κλήσεις. Κακόβουλες εφαρμογές μπορεί να χρησιμοποιήσουν αυτήν τη δυνατότητα, για να διαγράψουν ή να τροποποιήσουν το αρχείο καταγραφής κλήσεων." "Επιτρέπει στην εφαρμογή να τροποποιεί το αρχείο καταγραφής κλήσεων του τηλεφώνου σας, συμπεριλαμβανομένων των δεδομένων σχετικά με τις εισερχόμενες και τις εξερχόμενες κλήσεις. Οι κακόβουλες εφαρμογές μπορεί να το χρησιμοποιήσουν για να διαγράψουν ή να τροποποιήσουν το αρχείο καταγραφής κλήσεων." "πρόσβαση στους αισθητήρες λειτουργιών (π.χ. παρακολούθηση καρδιακού παλμού)" "Επιτρέπει στην εφαρμογή να αποκτήσει πρόσβαση στα δεδομένα των αισθητήρων που παρακολουθούν τη φυσική σας κατάσταση, όπως τον καρδιακό ρυθμό σας." - "ανάγνωση συμβάντων ημερολογίου και εμπιστευτικών πληροφοριών" + "διαβάζει συμβάντα ημερολογίου και εμπιστευτικές πληροφορίες" "Επιτρέπει στην εφαρμογή την ανάγνωση όλων των συμβάντων ημερολογίου που είναι αποθηκευμένα στο tablet σας, συμπεριλαμβανομένων εκείνων των φίλων ή των συναδέλφων σας. Αυτό μπορεί να δίνει τη δυνατότητα στην εφαρμογή να μοιράζεται ή να αποθηκεύει τα δεδομένα του ημερολογίου σας, ανεξάρτητα από το βαθμό εμπιστευτικότητας ή ευαισθησίας τους." "Επιτρέπει στην εφαρμογή να διαβάζει όλα τα συμβάντα ημερολογίου που είναι αποθηκευμένα στην τηλεόρασή σας, συμπεριλαμβανομένων εκείνων από τους φίλους ή τους συναδέλφους σας. Αυτό μπορεί να επιτρέψει στην εφαρμογή να μοιράζεται ή να αποθηκεύει τα δεδομένα ημερολογίου, ανεξαρτήτως εμπιστευτικότητας ή ευαισθησίας." "Επιτρέπει στην εφαρμογή την ανάγνωση όλων των συμβάντων ημερολογίου που είναι αποθηκευμένα στο τηλέφωνό σας, συμπεριλαμβανομένων εκείνων των φίλων ή των συναδέλφων σας. Αυτό μπορεί να δίνει τη δυνατότητα στην εφαρμογή να μοιράζεται ή να αποθηκεύει τα δεδομένα του ημερολογίου σας, ανεξάρτητα από το βαθμό εμπιστευτικότητας ή ευαισθησίας τους." - "προσθήκη ή τροποποίηση συμβάντων ημερολογίου και αποστολή μηνυμάτων ηλεκτρονικού ταχυδρομείου σε προσκεκλημένους χωρίς να το γνωρίζουν οι κάτοχοι" + "προσθέτει ή τροποποιεί συμβάντα ημερολογίου και να στέλνει μηνύματα ηλ. ταχυδρομείου σε προσκεκλημένους χωρίς να το γνωρίζουν οι κάτοχοι" "Επιτρέπει στην εφαρμογή την προσθήκη, την κατάργηση και την αλλαγή συμβάντων που μπορείτε να τροποποιήσετε στο tablet σας, συμπεριλαμβανομένων εκείνων των φίλων ή των συναδέλφων σας. Αυτό μπορεί να επιτρέπει στην εφαρμογή να αποστέλλει μηνύματα που φαίνεται ότι προέρχονται από κατόχους ημερολογίων ή να τροποποιεί συμβάντα χωρίς να το γνωρίζουν οι κάτοχοι." "Επιτρέπει στην εφαρμογή να προσθέτει, να καταργεί και να αλλάζει συμβάντα που μπορείτε να τροποποιείτε στην τηλεόρασή σας, συμπεριλαμβανομένων όσων ανήκουν σε φίλους ή συναδέλφους. Αυτό ενδέχεται να επιτρέπει στην εφαρμογή να αποστέλλει μηνύματα τα οποία φαίνεται ότι προέρχονται από κατόχους ημερολογίου ή να τροποποιεί συμβάντα χωρίς να το γνωρίζουν οι κάτοχοί τους." "Επιτρέπει στην εφαρμογή την προσθήκη, την κατάργηση και την αλλαγή συμβάντων που μπορείτε να τροποποιήσετε στο τηλέφωνό σας, συμπεριλαμβανομένων εκείνων των φίλων ή των συναδέλφων σας. Αυτό μπορεί να επιτρέπει στην εφαρμογή να αποστέλλει μηνύματα που φαίνεται ότι προέρχονται από κατόχους ημερολογίων ή να τροποποιεί συμβάντα χωρίς να το γνωρίζουν οι κάτοχοι." - "πρόσβαση σε επιπλέον εντολές παρόχου τοποθεσίας" + "έχει πρόσβαση σε επιπλέον εντολές παρόχου τοποθεσίας" "Επιτρέπει στην εφαρμογή την πρόσβαση σε επιπλέον εντολές παρόχου τοποθεσίας. Αυτό μπορεί να δώσει τη δυνατότητα στην εφαρμογή να παρέμβει στη λειτουργία του GPS ή άλλων πηγών τοποθεσίας." - "πρόσβαση στην ακριβή τοποθεσία (με βάση το GPS και το δίκτυο)" + "έχει πρόσβαση στην ακριβή τοποθεσία (με βάση το GPS και το δίκτυο)" "Επιτρέπει στην εφαρμογή να λαμβάνει την ακριβή θέση σας με τη χρήση του Παγκόσμιου Συστήματος Εντοπισμού (GPS) ή πηγών τοποθεσίας δικτύου, όπως κεραίες κινητής τηλεφωνίας και Wi-Fi. Αυτές οι υπηρεσίες τοποθεσίας πρέπει να είναι ενεργοποιημένες και διαθέσιμες στην συσκευή σας, ώστε να μπορούν να χρησιμοποιηθούν από την εφαρμογή. Οι εφαρμογές ενδέχεται να τις χρησιμοποιήσουν για να προσδιορίσουν τη θέση σας και ενδέχεται να καταναλώσουν επιπλέον ισχύ μπαταρίας." - "πρόσβαση στην τοποθεσία κατά προσέγγιση (με βάση το δίκτυο)" + "έχει πρόσβαση στην τοποθεσία κατά προσέγγιση (με βάση το δίκτυο)" "Επιτρέπει στην εφαρμογή τη λήψη της κατά προσέγγιση τοποθεσίας σας. Αυτή η τοποθεσία προκύπτει από τις υπηρεσίες τοποθεσίας με τη χρήση πηγών τοποθεσίας δικτύου, όπως κεραίες κινητής τηλεφωνίας και Wi-Fi. Αυτές οι υπηρεσίες τοποθεσίας πρέπει να είναι ενεργοποιημένες και διαθέσιμες στην συσκευή σας, ώστε να μπορούν να χρησιμοποιηθούν από την εφαρμογή. Οι εφαρμογές ενδέχεται να τις χρησιμοποιήσουν για να προσδιορίσουν κατά προσέγγιση τη θέση σας." - "αλλαγή των ρυθμίσεων ήχου" + "αλλάζει τις ρυθμίσεις ήχου" "Επιτρέπει στην εφαρμογή την τροποποίηση καθολικών ρυθμίσεων ήχου, όπως η ένταση και ποιο ηχείο χρησιμοποιείται για έξοδο." - "εγγραφή ήχου" + "εγγράφει ήχο" "Επιτρέπει στην εφαρμογή την εγγραφή ήχου με το μικρόφωνο. Αυτή η άδεια δίνει τη δυνατότητα στην εφαρμογή να εγγράφει ήχο ανά πάσα στιγμή χωρίς την έγκρισή σας." "στέλνει εντολές στην κάρτα SIM" "Επιτρέπει στην εφαρμογή την αποστολή εντολών στην κάρτα SIM. Αυτό είναι εξαιρετικά επικίνδυνο." - "λήψη φωτογραφιών και βίντεο" + "κάνει λήψη φωτογραφιών και βίντεο" "Επιτρέπει στην εφαρμογή τη λήψη φωτογραφιών και βίντεο με τη φωτογραφική μηχανή. Αυτή η άδεια δίνει τη δυνατότητα στην εφαρμογή να χρησιμοποιεί τη φωτογραφική μηχανή ανά πάσα στιγμή χωρίς την έγκρισή σας." - "έλεγχος δόνησης" + "ελέγχει τη δόνηση" "Επιτρέπει στην εφαρμογή τον έλεγχο της δόνησης." - "απευθείας κλήση τηλεφωνικών αριθμών" + "πραγματοποιεί απευθείας κλήση τηλεφωνικών αριθμών" "Επιτρέπει στην εφαρμογή την κλήση αριθμών τηλεφώνου χωρίς δική σας παρέμβαση. Αυτό μπορεί να προκαλέσει μη αναμενόμενες χρεώσεις ή κλήσεις. Έχετε υπόψη ότι δεν επιτρέπεται στην εφαρμογή η κλήση αριθμών έκτακτης ανάγκης. Οι κακόβουλες εφαρμογές ενδέχεται να σας κοστίσουν χρήματα, πραγματοποιώντας κλήσεις χωρίς την έγκρισή σας." - "πρόσβαση στην υπηρεσία κλήσεων της IMS" + "έχει πρόσβαση στην υπηρεσία κλήσεων της IMS" "Επιτρέπει στην εφαρμογή τη χρήση της υπηρεσίας IMS για την πραγματοποίηση κλήσεων χωρίς τη δική σας παρέμβαση." - "ανάγνωση κατάστασης και ταυτότητας τηλεφώνου" + "διαβάζει την κατάσταση και ταυτότητα τηλεφώνου" "Επιτρέπει στην εφαρμογή την πρόσβαση στις λειτουργίες τηλεφώνου της συσκευής. Αυτή η άδεια δίνει τη δυνατότητα στην εφαρμογή να καθορίζει τον αριθμό τηλεφώνου και τα αναγνωριστικά συσκευών, εάν μια κλήση είναι ενεργή, καθώς και τον απομακρυσμένο αριθμό που συνδέεται από μια κλήση." - "παρεμπόδιση μετάβασης του tablet σε κατάσταση αδράνειας" - "αποτροπή μετάβασης της τηλεόρασης στην κατάσταση αδράνειας" - "παρεμπόδιση μετάβασης του τηλεφώνου σε κατάσταση αδράνειας" + "αποτρέπει την μετάβαση του tablet σε κατάσταση αδράνειας" + "αποτρέπει την μετάβαση της τηλεόρασης σε κατάσταση αδράνειας" + "αποτρέπει το τηλεφώνο να μεταβεί σε κατάσταση αδράνειας" "Επιτρέπει στην εφαρμογή την παρεμπόδιση της μετάβασης του tablet σε κατάσταση αδράνειας." "Επιτρέπει στην εφαρμογή να εμποδίζει τη μετάβαση της τηλεόρασης στην κατάσταση αδράνειας." "Επιτρέπει στην εφαρμογή την παρεμπόδιση της μετάβασης του τηλεφώνου σε κατάσταση αδράνειας." - "μετάδοση υπερύθρων" + "μεταδίδει με υπερύθρες" "Επιτρέπει στην εφαρμογή να χρησιμοποιεί τον πομπό υπερύθρων του tablet." "Επιτρέπει στην εφαρμογή να χρησιμοποιεί τον πομπό υπερύθρων της τηλεόρασης." "Επιτρέπει στην εφαρμογή να χρησιμοποιεί τον πομπό υπερύθρων του τηλεφώνου." - "ορισμός ταπετσαρίας" + "ορίζει ταπετσαρία" "Επιτρέπει στην εφαρμογή τον ορισμό της ταπετσαρίας συστήματος." - "ρύθμιση του μεγέθους της ταπετσαρίας σας" + "ρυθμίζει το μέγεθος της ταπετσαρίας" "Επιτρέπει στην εφαρμογή τον ορισμό συμβουλών μεγέθους ταπετσαρίας συστήματος." - "ορισμός ζώνης ώρας" + "ορίζει τη ζώνης ώρας" "Επιτρέπει στην εφαρμογή την αλλαγή της ζώνης ώρας του tablet." "Επιτρέπει στην εφαρμογή να αλλάζει τη ζώνη ώρας της τηλεόρασης." "Επιτρέπει στην εφαρμογή την αλλαγή της ζώνης ώρας του τηλεφώνου." - "εύρεση λογαριασμών στη συσκευή" + "βρίσκει λογαριασμούς στη συσκευή" "Επιτρέπει στην εφαρμογή τη λήψη της λίστας λογαριασμών που υπάρχουν στο tablet. Μπορεί να περιλαμβάνονται τυχόν λογαριασμοί που δημιουργήθηκαν από εφαρμογές που έχετε εγκαταστήσει." "Επιτρέπει στην εφαρμογή να λαμβάνει τη λίστα λογαριασμών που γνωρίζει η τηλεόραση. Αυτό μπορεί να περιλαμβάνει λογαριασμούς που δημιουργούνται από λογαριασμούς που έχετε εγκαταστήσει." "Επιτρέπει στην εφαρμογή τη λήψη της λίστας λογαριασμών που υπάρχουν στο τηλέφωνο. Μπορεί να περιλαμβάνονται τυχόν λογαριασμοί που δημιουργήθηκαν από εφαρμογές που έχετε εγκαταστήσει." - "προβολή συνδέσεων δικτύου" + "βλέπει τις συνδέσεις δικτύου" "Επιτρέπει στην εφαρμογή την προβολή πληροφοριών σχετικά με συνδέσεις δικτύου, όπως ποια δίκτυα υπάρχουν και είναι συνδεδεμένα." - "πλήρης πρόσβαση στο δίκτυο" + "έχει πλήρη πρόσβαση στο δίκτυο" "Επιτρέπει στην εφαρμογή τη δημιουργία θέσεων δικτύου και τη χρήση προσαρμοσμένων πρωτοκόλλων δικτύου. Το πρόγραμμα περιήγησης και άλλες εφαρμογές παρέχουν μέσα για την αποστολή δεδομένων στο διαδίκτυο, επομένως η συγκεκριμένη άδεια δεν είναι απαραίτητη για την αποστολή δεδομένων στο διαδίκτυο." - "αλλαγή συνδεσιμότητας δικτύου" + "αλλάζει την συνδεσιμότητα δικτύου" "Επιτρέπει στην εφαρμογή την αλλαγή της κατάστασης συνδεσιμότητας δικτύου." - "αλλαγή συνδεσιμότητας μέσω σύνδεσης με κινητή συσκευή" + "αλλάζει συνδεσιμότητα μέσω σύνδεσης με κινητή συσκευή" "Επιτρέπει στην εφαρμογή την αλλαγή της κατάστασης συνδεσιμότητας δικτύου." - "προβολή συνδέσεων Wi-Fi" + "βλέπει τις συνδέσεις Wi-Fi" "Επιτρέπει στην εφαρμογή την προβολή πληροφοριών σχετικά με τη δικτύωση Wi-Fi, όπως εάν το Wi-Fi είναι ενεργοποιημένο και τα ονόματα των συνδεδεμένων συσκευών Wi-Fi." - "σύνδεση και αποσύνδεση από το Wi-Fi" + "συνδέεται/αποσυνδέεται από το Wi-Fi" "Επιτρέπει στην εφαρμογή τη σύνδεση σε σημεία πρόσβασης Wi-Fi και την αποσύνδεση από αυτά, καθώς και την πραγματοποίηση αλλαγών σε διαμόρφωση συσκευών για δίκτυα Wi-Fi." - "να επιτρέπεται η λήψη πολλαπλής διανομής Wi-Fi" + "επιτρέπει την λήψη πολλαπλής διανομής Wi-Fi" "Επιτρέπει στην εφαρμογή τη λήψη πακέτων που αποστέλλονται σε όλες τις συσκευές σε ένα δίκτυο Wi-Fi, με χρήση διευθύνσεων πολλαπλής διανομής και όχι απλώς στο tablet σας. Χρησιμοποιεί περισσότερη ενέργεια σε σχέση με τη λειτουργία χωρίς πολλαπλή διανομή." "Επιτρέπει στην εφαρμογή να λαμβάνει πακέτα που αποστέλλονται σε όλες τις συσκευές σε ένα δίκτυο Wi-Fi, χρησιμοποιώντας διευθύνσεις multicast και όχι μόνο την τηλεόρασή σας. Χρησιμοποιεί περισσότερη ενέργεια από τη λειτουργία χωρίς multicast." "Επιτρέπει στην εφαρμογή τη λήψη πακέτων που αποστέλλονται σε όλες τις συσκευές σε ένα δίκτυο Wi-Fi, με χρήση διευθύνσεων πολλαπλής διανομής και όχι απλώς στο τηλέφωνό σας. Χρησιμοποιεί περισσότερη ενέργεια σε σχέση με τη λειτουργία χωρίς πολλαπλή διανομή." - "πρόσβαση στις ρυθμίσεις Bluetooth" + "διαβάζει τις ρυθμίσεις Bluetooth" "Επιτρέπει στην εφαρμογή τη διαμόρφωση του τοπικού tablet Bluetooth, τον εντοπισμό και τη σύζευξη με απομακρυσμένες συσκευές." "Επιτρέπει στην εφαρμογή να διαμορφώνει το τοπικό Bluetooth στην τηλεόραση, καθώς και να ανακαλύπτει απομακρυσμένες συσκευές και να συνδέεται μαζί τους." "Επιτρέπει στην εφαρμογή τη διαμόρφωση του τοπικού tablet Bluetooth, τον εντοπισμό και τη σύζευξη με απομακρυσμένες συσκευές." @@ -424,17 +425,17 @@ "Επιτρέπει στην εφαρμογή τη σύνδεση στο tablet και την αποσύνδεση από αυτό, από δίκτυα WiMAX." "Επιτρέπει στην εφαρμογή να συνδέει και να αποσυνδέει την τηλεόραση από δίκτυα WiMAX." "Επιτρέπει στην εφαρμογή τη σύνδεση στο τηλέφωνο και την αποσύνδεση από αυτό, από δίκτυα WiMAX." - "σύζευξη με συσκευές Bluetooth" + "πραγματοποιεί σύζευξη με συσκευές Bluetooth" "Επιτρέπει στην εφαρμογή να προβάλλει τη διαμόρφωση του Bluetooth στο tablet, καθώς και να πραγματοποιεί και να αποδέχεται συνδέσεις με συνδεδεμένες συσκευές." "Επιτρέπει στην εφαρμογή να προβάλλει τη διαμόρφωση του Bluetooth στην τηλεόραση, καθώς και να δημιουργεί και να αποδέχεται συνδέσεις με συσκευές σε σύζευξη." "Επιτρέπει στην εφαρμογή να προβάλλει τη διαμόρφωση του Bluetooth στο τηλέφωνο, καθώς και να πραγματοποιεί και να αποδέχεται συνδέσεις με συνδεδεμένες συσκευές." - "έλεγχος Επικοινωνίας κοντινού πεδίου (Near Field Communication)" + "ελέγχει την Επικοινωνία κοντινού πεδίου (FNC)" "Επιτρέπει στην εφαρμογή την επικοινωνία με ετικέτες, κάρτες και αναγνώστες της Επικοινωνίας κοντινού πεδίου (NFC)." - "απενεργοποίηση κλειδώματος οθόνης" + "απενεργοποιεί το κλείδωμα οθόνης" "Επιτρέπει στην εφαρμογή την απενεργοποίηση του κλειδώματος πληκτρολογίου και άλλης σχετικής ασφάλειας με κωδικό πρόσβασης. Για παράδειγμα, το κλείδωμα πληκτρολογίου στο τηλέφωνο απενεργοποιείται όταν λαμβάνεται εισερχόμενη τηλεφωνική κλήση και ενεργοποιείται ξανά όταν η κλήση τερματιστεί." - "διαχείριση εξοπλισμού μοναδικού χαρακτηριστικού" + "διαχειρίζεται τον εξοπλισμό δακτυλικού αποτυπώματος" "Επιτρέπει στην εφαρμογή να επικαλείται μεθόδους για την προσθήκη και τη διαγραφή προτύπων μοναδικού χαρακτηριστικού για χρήση." - "χρήση εξοπλισμού μοναδικού χαρακτηριστικού" + "χρησιμοποιεί τον εξοπλισμό δακτυλικού αποτυπώματος" "Επιτρέπει στην εφαρμογή να χρησιμοποιεί εξοπλισμό μοναδικού χαρακτηριστικού για έλεγχο ταυτότητας" "Εντοπίστηκε μερικό μοναδικό χαρακτηριστικό. Δοκιμάστε ξανά." "Δεν ήταν δυνατή η επεξεργασία του μοναδικού χαρακτηριστικού. Δοκιμάστε ξανά." @@ -453,65 +454,65 @@ "Εικονίδιο δακτυλικών αποτυπωμάτων" - "ανάγνωση ρυθμίσεων συγχρονισμού" + "διαβάζει τις ρυθμίσεις συγχρονισμού" "Επιτρέπει στην εφαρμογή την ανάγνωση των ρυθμίσεων συγχρονισμού για έναν λογαριασμό. Για παράδειγμα, αυτό μπορεί να καθορίσει εάν η εφαρμογή \"Άτομα\" είναι συγχρονισμένη με έναν λογαριασμό." - "εναλλαγή ενεργοποίησης και απενεργοποίησης συγχρονισμού" + "ενεργοποιεί/απενεργοποιεί τον συγχρονισμό" "Επιτρέπει σε μια εφαρμογή την τροποποίηση των ρυθμίσεων συγχρονισμού για έναν λογαριασμό. Για παράδειγμα, αυτό μπορεί να χρησιμοποιηθεί για να ενεργοποιηθεί ο συγχρονισμός της εφαρμογής \"Άτομα\" με έναν λογαριασμό." - "ανάγνωση στατιστικών συγχρονισμού" + "διαβάζει στατιστικά στοιχεία συγχρονισμού" "Επιτρέπει σε μια εφαρμογή την ανάγνωση των στατιστικών στοιχείων συγχρονισμού για έναν λογαριασμό, συμπεριλαμβανομένων του ιστορικού των συμβάντων συγχρονισμού και του όγκου των δεδομένων που συγχρονίζονται." "ανάγν. περιεχ. αποθηκ. χώρ.USB" - "ανάγνωση του περιεχομένου της κάρτας SD" + "διαβάζει το περιεχομένο της κάρτας SD" "Επιτρέπει στην εφαρμογή την ανάγνωση του περιεχομένου του αποθηκευτικού σας χώρου USB." "Επιτρέπει στην εφαρμογή την ανάγνωση του περιεχομένου της κάρτας SD." - "τροποποίηση ή διαγραφή του USB" - "τροποποίηση ή διαγραφή των περιεχομένων της κάρτας SD" + "τροποποιεί/διαγράφει το USB" + "τροποποιεί ή διαγράφει τα περιεχόμενα της κάρτας SD" "Επιτρέπει στην εφαρμογή την εγγραφή στον αποθηκευτικό χώρο USB." "Επιτρέπει στην εφαρμογή την εγγραφή στην κάρτα SD." - "πραγματοποίηση/λήψη κλήσεων SIP" + "πραγματοποιεί/λαμβάνει κλήσεις SIP" "Επιτρέπει στην εφαρμογή να πραγματοποιεί και να λαμβάνει κλήσεις SIP." - "εγγραφή νέων συνδέσεων SIM τηλεπικοινωνιών" + "πραγματοποιεί εγγραφή νέων συνδέσεων SIM τηλεπικοινωνιών" "Επιτρέπει στην εφαρμογή την εγγραφή νέων συνδέσεων SIM τηλεπικοινωνιών." - "εγγραφή νέων συνδέσεων τηλεπικοινωνιών" + "πραγματοποιεί εγγραφή των νέων συνδέσεων τηλεπικοινωνιών" "Επιτρέπει στην εφαρμογή την εγγραφή νέων συνδέσεων τηλεπικοινωνιών." - "διαχείριση των συνδέσεων τηλεπικοινωνιών" + "διαχειρίζεται τις συνδέσεις τηλεπικοινωνιών" "Επιτρέπει στην εφαρμογή να διαχειρίζεται τις συνδέσεις τηλεπικοινωνιών." - "αλληλεπίδραση με την οθόνη κατά τη διάρκεια κλήσης" + "αλληλεπιδρά με την οθόνη κατά τη διάρκεια κλήσης" "Επιτρέπει στην εφαρμογή να ελέγχει πότε και πώς βλέπει ο χρήστης την οθόνη κατά τη διάρκεια κλήσης." - "αλληλεπίδραση με υπηρεσίες τηλεφωνίας" + "αλληλεπιδρά με υπηρεσίες τηλεφωνίας" "Επιτρέπει στην εφαρμογή να αλληλεπιδρά με υπηρεσίες τηλεφωνίας για την πραγματοποίηση/λήψη κλήσεων." - "παροχή εμπειρίας χρήστη κατά τη διάρκεια κλήσης" + "παρέχει εμπειρία χρήστη κατά τη διάρκεια κλήσης" "Επιτρέπει στην εφαρμογή να παρέχει μια εμπειρία στο χρήστη κατά τη διάρκεια κλήσης." - "ανάγνωση ιστορικών δεδομένων χρήσης δικτύου" + "διαβάζει ιστορικά στοιχεία δεδομένων χρήσης δικτύου" "Επιτρέπει στην εφαρμογή την ανάγνωση ιστορικών στοιχείων χρήσης δικτύου για συγκεκριμένα δίκτυα και εφαρμογές." - "διαχείριση πολιτικής δικτύου" + "διαχειρίζεται την πολιτική δικτύου" "Επιτρέπει στην εφαρμογή τη διαχείριση των πολιτικών δικτύου και τον ορισμό κανόνων για ορισμένες εφαρμογές." - "τροποποίηση υπολογισμού χρήσης δικτύου" + "τροποποιεί τον υπολογισμό χρήσης δικτύου" "Επιτρέπει στην εφαρμογή την τροποποίηση του τρόπου υπολογισμού της χρήσης δικτύου έναντι των εφαρμογών. Δεν προορίζεται για χρήση από συνήθεις εφαρμογές." - "πρόσβαση στις ειδοποιήσεις" + "έχει πρόσβαση στις ειδοποιήσεις" "Επιτρέπει στην εφαρμογή να ανακτά, να εξετάζει και να απαλείφει ειδοποιήσεις, συμπεριλαμβανομένων εκείνων που δημοσιεύονται από άλλες εφαρμογές." - "δέσμευση σε υπηρεσία ακρόασης ειδοποίησης" + "συνδέεται σε υπηρεσία ακρόασης ειδοποίησης" "Επιτρέπει στον κάτοχο τη δέσμευση στη διεπαφή ανωτάτου επιπέδου μιας υπηρεσίας ακρόασης ειδοποιήσεων. Δεν απαιτείται σε κανονικές εφαρμογές." - "σύνδεση σε μια υπηρεσία παρόχου συνθηκών" + "δεσμεύεται σε μια υπηρεσία παρόχου συνθηκών" "Επιτρέπει στον κάτοχο τη σύνδεση στη διεπαφή ανωτάτου επιπέδου ενός παρόχου συνθηκών. Δεν απαιτείται για κανονικές εφαρμογές." - "δέσμευση σε υπηρεσία dream" + "δεσμεύεται σε υπηρεσία dream" "Επιτρέπει στον κάτοχο τη δέσμευση στη διεπαφή ανωτάτου επιπέδου μιας υπηρεσίας dream. Δεν απαιτείται σε κανονικές εφαρμογές." - "κλήση της εφαρμογής διαμόρφωσης που παρέχεται από την εταιρεία κινητής τηλεφωνίας" + "καλέι την εφαρμογή διαμόρφωσης του παρόχου κινητής τηλεφωνίας" "Επιτρέπει στον κάτοχο την κλήση της εφαρμογής διαμόρφωσης που παρέχεται από την εταιρεία κινητής τηλεφωνίας. Δεν απαιτείται για κανονικές εφαρμογές." - "λήψη παρατηρήσεων σχετικά με την κατάσταση δικτύου" + "ανιχνεύει παρατηρήσεις σχετικά με την κατάσταση δικτύου" "Επιτρέπει σε μια εφαρμογή να λαμβάνει παρατηρήσεις σχετικά με την κατάσταση δικτύου. Δεν θα πρέπει να απαιτείται ποτέ για κανονικές εφαρμογές." "αλλαγή βαθμονόμησης της συσκευής εισόδου" "Επιτρέπει στην εφαρμογή να τροποποιεί τις παραμέτρους βαθμονόμησης της οθόνης αφής. Δεν απαιτείται για τις κανονικές εφαρμογές." - "πρόσβαση σε πιστοποιητικά DRM" + "έχει πρόσβαση σε πιστοποιητικά DRM" "Επιτρέπει σε μια εφαρμογή να παρέχει και να χρησιμοποιεί πιστοποιητικά DRM. Δεν θα χρειαστεί ποτέ για κανονικές εφαρμογές." "λήψη κατάστασης μεταφοράς Android Beam" "Επιτρέπει σε αυτήν την εφαρμογή να λαμβάνει πληροφορίες σχετικά με τις τρέχουσες μεταφορές Android Beam" - "κατάργηση πιστοποιητικών DRM" + "καταργεί πιστοποιητικά DRM" "Επιτρέπει σε μια εφαρμογή την κατάργηση πιστοποιητικών DRM. Δεν χρειάζεται ποτέ για κανονικές εφαρμογές." - "δέσμευση σε υπηρεσία ανταλλαγής μηνυμάτων εταιρείας κινητής τηλεφωνίας" + "δεσμεύεται σε υπηρεσία ανταλλαγής μηνυμάτων παρόχου κινητής τηλεφωνίας" "Επιτρέπει στον κάτοχο τη δέσμευση στη διεπαφή ανωτάτου επιπέδου μιας υπηρεσίας ανταλλαγής μηνυμάτων εταιρείας κινητής τηλεφωνίας. Δεν απαιτείται για συνήθεις εφαρμογές." - "δέσμευση σε υπηρεσίες εταιρείας κινητής τηλεφωνίας" + "δεσμεύεται σε υπηρεσίες του παρόχου κινητής τηλεφωνίας" "Δίνει στον κάτοχο τη δυνατότητα δέσμευσης σε υπηρεσίες εταιρείας κινητής τηλεφωνίας. Δεν απαιτείται ποτέ για κανονικές εφαρμογές." - "πρόσβαση στη λειτουργία \"Μην ενοχλείτε\"" + "έχει πρόσβαση στη λειτουργία \"Μην ενοχλείτε\"" "Επιτρέπει στην εφαρμογή την εγγραφή και τη σύνταξη διαμόρφωσης για τη λειτουργία \"Μην ενοχλείτε\"." "Ορισμός κανόνων κωδικού πρόσβασης" "Ελέγξτε την έκταση και τους επιτρεπόμενους χαρακτήρες σε κωδικούς πρόσβασης κλειδώματος οθόνης και PIN." @@ -791,17 +792,17 @@ "Ενορία" "Περιοχή" "Εμιράτο" - "ανάγνωση των σελιδοδεικτών και του ιστορικού ιστού σας" + "διαβάζει τους σελιδοδείκτες και το ιστορικού ιστού" "Επιτρέπει στην εφαρμογή την ανάγνωση του ιστορικού όλων των διευθύνσεων URL που έχει επισκεφτεί το πρόγραμμα περιήγησης, καθώς και όλων των σελιδοδεικτών του προγράμματος περιήγησης. Σημείωση: αυτή η άδεια ίσως να μην μπορεί να εφαρμοστεί από τρίτα προγράμματα περιήγησης ή άλλες εφαρμογές με δυνατότητες περιήγησης ιστού." - "εγγραφή σελιδοδεικτών και ιστορικού ιστού" + "εγγράφει σελιδοδείκτες και ιστορικό ιστού" "Επιτρέπει στην εφαρμογή την τροποποίηση του ιστορικού του προγράμματος περιήγησης ή των σελιδοδεικτών που έχουν αποθηκευτεί στο tablet σας. Αυτό μπορεί να δίνει τη δυνατότητα στην εφαρμογή να διαγράφει ή να τροποποιεί δεδομένα του προγράμματος περιήγησης. Σημείωση: αυτή η άδεια ίσως να μην μπορεί να εφαρμοστεί από τρίτα προγράμματα περιήγησης ή άλλες εφαρμογές με δυνατότητες περιήγησης ιστού." "Επιτρέπει στην εφαρμογή να τροποποιεί το ιστορικό του προγράμματος περιήγησης ή τους σελιδοδείκτες που είναι αποθηκευμένοι στην τηλεόρασή σας. Σημείωση: Αυτό το δικαίωμα δεν πρέπει να εφαρμόζεται από τρίτα προγράμματα περιήγησης ή άλλες εφαρμογές με δυνατότητες περιήγησης στον ιστό." "Επιτρέπει στην εφαρμογή την τροποποίηση του ιστορικού του προγράμματος περιήγησης ή των σελιδοδεικτών που έχουν αποθηκευτεί στο τηλέφωνό σας. Αυτό μπορεί να δίνει τη δυνατότητα στην εφαρμογή να διαγράφει ή να τροποποιεί δεδομένα του προγράμματος περιήγησης. Σημείωση: αυτή η άδεια ίσως να μην μπορεί να εφαρμοστεί από τρίτα προγράμματα περιήγησης ή άλλες εφαρμογές με δυνατότητες περιήγησης ιστού." - "ρύθμιση ξυπνητηριού" + "ρυθμίζει το ξυπνητήρι" "Επιτρέπει στην εφαρμογή τη ρύθμιση μιας ειδοποίησης σε μια εγκατεστημένη εφαρμογή ξυπνητηριού. Ορισμένες εφαρμογές ξυπνητηριού ενδέχεται να μην μπορούν να ενσωματώσουν αυτήν τη λειτουργία." - "προσθήκη τηλεφωνητή" + "προσθέτει τηλεφωνητή" "Επιτρέπει στην εφαρμογή να προσθέτει μηνύματα στα εισερχόμενα του αυτόματου τηλεφωνητή σας." - "τροποποίηση δικαιωμάτων γεωγραφικής θέσης του Προγράμματος περιήγησης" + "τροποποιεί δικαιώματα γεωγραφικής θέσης του Προγράμματος περιήγησης" "Επιτρέπει στην εφαρμογή την τροποποίηση των αδειών γεωτοποθεσίας του Προγράμματος περιήγησης. Τυχόν κακόβουλες εφαρμογές ενδέχεται να το χρησιμοποιήσουν για να επιτρέψουν την αποστολή πληροφοριών τοποθεσίας σε αυθαίρετους ιστότοπους." "Θέλετε το πρόγραμμα περιήγησης να διατηρήσει αυτόν τον κωδικό πρόσβασης;" "Να μην γίνει τώρα" @@ -1076,6 +1077,17 @@ "Το δίκτυο Wi-Fi δεν έχει πρόσβαση στο διαδίκτυο" "Πατήστε για να δείτε τις επιλογές" + "Μετάβαση σε δίκτυο %1$s" + "Η συσκευή χρησιμοποιεί το δίκτυο %1$s όταν το δίκτυο %2$s δεν έχει πρόσβαση στο διαδίκτυο. Ενδέχεται να ισχύουν χρεώσεις." + "Μετάβαση από το δίκτυο %1$s στο δίκτυο %2$s" + + "δεδομένα κινητής τηλεφωνίας" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "άγνωστος τύπος δικτύου" "Δεν είναι δυνατή η σύνδεση στο Wi-Fi" " έχει κακή σύνδεση στο Διαδίκτυο." "Να επιτρέπεται η σύνδεση;" @@ -1153,7 +1165,6 @@ "Πατήστε για να επιλέξετε γλώσσα και διάταξη" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "υποψήφιοι" "Προετοιμασία %s" "Έλεγχος για σφάλματα" "Εντοπίστηκε νέο μέσο αποθήκευσης %s" @@ -1191,11 +1202,11 @@ "Διαμόρφωση…" "Δεν έχει εισαχθεί" "Δεν βρέθηκαν δραστηριότητες που να συμφωνούν με τα κριτήρια." - "δρομολόγηση εξόδου μέσων" + "δρομολογεί την έξοδο μέσων" "Επιτρέπει σε μια εφαρμογή τη διαγραφή διαδρομής δεδομένων εξόδου μέσων σε άλλες εξωτερικές συσκευές." - "ανάγνωση περιόδων σύνδεσης εγκατάστασης" + "διαβάζει τις περιόδους σύνδεσης εγκατάστασης" "Επιτρέπει σε μια εφαρμογή την ανάγνωση των περιόδων σύνδεσης εγκατάστασης. Αυτό της επιτρέπει να βλέπει λεπτομέρειες σχετικά με τις εγκαταστάσεις του ενεργού πακέτου." - "αίτημα εγκατάστασης πακέτων" + "ζητά πακέτα εγκατάστασης" "Επιτρέπει σε μια εφαρμογή να ζητά εγκατάσταση πακέτων." "Πατήστε δύο φορές για έλεγχο εστίασης" "Δεν ήταν δυνατή η προσθήκη του γραφικού στοιχείου." @@ -1232,8 +1243,9 @@ "Συνδέθηκε με %s. Πατήστε για να διαχειριστείτε το δίκτυο." "Σύνδεση πάντα ενεργοποιημένου VPN…" "Έχει συνδεθεί πάντα ενεργοποιημένο VPN" + "Το πάντα ενεργοποιημένο VPN αποσυνδέθηκε" "Σφάλμα πάντα ενεργοποιημένου VPN" - "Πατήστε για διαμόρφωση" + "Πατήστε για ρύθμιση" "Επιλογή αρχείου" "Δεν επιλέχθηκε κανένα αρχείο." "Επαναφορά" @@ -1317,7 +1329,7 @@ "Μονάδα USB %s" "Αποθηκευτικός χώρος USB" "Επεξεργασία" - "Προειδοποίηση χρήσης δεδομένων" + "Ειδοποίηση χρήσης δεδομένων" "Πατήστε για προβολή χρήσης/ρυθμ." "Συμπλ. το όριο δεδομένων 2G-3G" "Συμπλ. το όριο δεδομένων 4G" @@ -1636,6 +1648,7 @@ "Εισαγ. όνομα γλώσσας" "Προτεινόμενες" "Όλες οι γλώσσες" + "Όλες οι περιοχές" "Αναζήτηση" "Λειτουργία εργασίας ΑΠΕΝΕΡΓ/ΝΗ" "Να επιτρέπεται η λειτουργία του προφίλ εργασίας σας, συμπεριλαμβανομένων των εφαρμογών, του συγχρονισμού στο παρασκήνιο και των σχετικών λειτουργιών." diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 12b7aa5f69e6f53ea0b7a6888c5e2bcec29688d2..c6e04d71c5dbf740f7c76c2893178ce4d3e092b7 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -214,6 +214,7 @@ "Phone options" "Screen lock" "Power off" + "Emergency" "Bug report" "Take bug report" "This will collect information about your current device state, to send as an email message. It will take a little time from starting the bug report until it is ready to be sent. Please be patient." @@ -1076,6 +1077,17 @@ "Wi-Fi has no Internet access" "Tap for options" + "Switched to %1$s" + "Device uses %1$s when %2$s has no Internet access. Charges may apply." + "Switched from %1$s to %2$s" + + "mobile data" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "an unknown network type" "Couldn\'t connect to Wi-Fi" " has a poor Internet connection." "Allow connection?" @@ -1153,7 +1165,6 @@ "Tap to select language and layout" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "candidates" "Preparing %s" "Checking for errors" "New %s detected" @@ -1232,8 +1243,9 @@ "Connected to %s. Tap to manage the network." "Always-on VPN connecting…" "Always-on VPN connected" + "Always-on VPN disconnected" "Always-on VPN error" - "Tap to configure" + "Tap to set up" "Choose file" "No file chosen" "Reset" @@ -1317,7 +1329,7 @@ "%s USB drive" "USB storage" "Edit" - "Data usage warning" + "Data usage alert" "Tap to view usage and settings." "2G-3G data limit reached" "4G data limit reached" @@ -1636,6 +1648,7 @@ "Type language name" "Suggested" "All languages" + "All regions" "Search" "Work mode is OFF" "Allow work profile to function, including apps, background sync and related features." diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 12b7aa5f69e6f53ea0b7a6888c5e2bcec29688d2..c6e04d71c5dbf740f7c76c2893178ce4d3e092b7 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -214,6 +214,7 @@ "Phone options" "Screen lock" "Power off" + "Emergency" "Bug report" "Take bug report" "This will collect information about your current device state, to send as an email message. It will take a little time from starting the bug report until it is ready to be sent. Please be patient." @@ -1076,6 +1077,17 @@ "Wi-Fi has no Internet access" "Tap for options" + "Switched to %1$s" + "Device uses %1$s when %2$s has no Internet access. Charges may apply." + "Switched from %1$s to %2$s" + + "mobile data" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "an unknown network type" "Couldn\'t connect to Wi-Fi" " has a poor Internet connection." "Allow connection?" @@ -1153,7 +1165,6 @@ "Tap to select language and layout" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "candidates" "Preparing %s" "Checking for errors" "New %s detected" @@ -1232,8 +1243,9 @@ "Connected to %s. Tap to manage the network." "Always-on VPN connecting…" "Always-on VPN connected" + "Always-on VPN disconnected" "Always-on VPN error" - "Tap to configure" + "Tap to set up" "Choose file" "No file chosen" "Reset" @@ -1317,7 +1329,7 @@ "%s USB drive" "USB storage" "Edit" - "Data usage warning" + "Data usage alert" "Tap to view usage and settings." "2G-3G data limit reached" "4G data limit reached" @@ -1636,6 +1648,7 @@ "Type language name" "Suggested" "All languages" + "All regions" "Search" "Work mode is OFF" "Allow work profile to function, including apps, background sync and related features." diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 12b7aa5f69e6f53ea0b7a6888c5e2bcec29688d2..c6e04d71c5dbf740f7c76c2893178ce4d3e092b7 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -214,6 +214,7 @@ "Phone options" "Screen lock" "Power off" + "Emergency" "Bug report" "Take bug report" "This will collect information about your current device state, to send as an email message. It will take a little time from starting the bug report until it is ready to be sent. Please be patient." @@ -1076,6 +1077,17 @@ "Wi-Fi has no Internet access" "Tap for options" + "Switched to %1$s" + "Device uses %1$s when %2$s has no Internet access. Charges may apply." + "Switched from %1$s to %2$s" + + "mobile data" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "an unknown network type" "Couldn\'t connect to Wi-Fi" " has a poor Internet connection." "Allow connection?" @@ -1153,7 +1165,6 @@ "Tap to select language and layout" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "candidates" "Preparing %s" "Checking for errors" "New %s detected" @@ -1232,8 +1243,9 @@ "Connected to %s. Tap to manage the network." "Always-on VPN connecting…" "Always-on VPN connected" + "Always-on VPN disconnected" "Always-on VPN error" - "Tap to configure" + "Tap to set up" "Choose file" "No file chosen" "Reset" @@ -1317,7 +1329,7 @@ "%s USB drive" "USB storage" "Edit" - "Data usage warning" + "Data usage alert" "Tap to view usage and settings." "2G-3G data limit reached" "4G data limit reached" @@ -1636,6 +1648,7 @@ "Type language name" "Suggested" "All languages" + "All regions" "Search" "Work mode is OFF" "Allow work profile to function, including apps, background sync and related features." diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 136902b57799fb140ec9622b9ca9d6c1b5852dd0..ea1c1a5bda83f220c87162df5e645157643c24b9 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -214,6 +214,7 @@ "Opciones de dispositivo" "Bloqueo de pantalla" "Apagar" + "Emergencias" "Informe de errores" "Iniciar informe de errores" "Se recopilará información sobre el estado actual de tu dispositivo, que se enviará por correo. Pasarán unos minutos desde que se inicie el informe de errores hasta que se envíe, por lo que te recomendamos que tengas paciencia." @@ -1076,6 +1077,17 @@ "La red Wi-Fi no tiene acceso a Internet" "Presiona para ver opciones" + "Se cambió a %1$s" + "El dispositivo usa %1$s cuando %2$s no tiene acceso a Internet. Es posible que se apliquen cargos." + "Se cambió de %1$s a %2$s" + + "datos móviles" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "un tipo de red desconocido" "No se pudo conectar a la red Wi-Fi." " tiene una mala conexión a Internet." "¿Permitir la conexión?" @@ -1153,7 +1165,6 @@ "Presiona para seleccionar el idioma y el diseño" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "candidatos" "Preparando el medio %s" "Verificando errores" "Se detectó un nuevo medio (%s)." @@ -1232,8 +1243,9 @@ "Conectado a %s. Pulsa para gestionar la red." "Estableciendo conexión con la VPN siempre activada..." "Se estableció conexión con la VPN siempre activada." + "Se desconectó la VPN siempre activada" "Se produjo un error al establecer conexión con la VPN siempre activada." - "Presiona para configurar" + "Presiona para configurar" "Elegir archivo" "No se seleccionó un archivo." "Restablecer" @@ -1317,7 +1329,7 @@ "Unidad USB de %s" "Almacenamiento USB" "Editar" - "Advertencia de uso de datos" + "Alerta por el uso de datos" "Presiona para uso y opciones." "Límite de datos 2G-3G alcanzado" "Límite de datos 4G alcanzado" @@ -1636,6 +1648,7 @@ "Nombre del idioma" "Sugeridos" "Todos los idiomas" + "Todas las regiones" "Búsqueda" "Modo de trabajo DESACTIVADO" "Permite que se active el perfil de trabajo, incluidas las apps, la sincronización en segundo plano y las funciones relacionadas." diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index c4ebb02128fde792644072ab1b063a1adfb4e92d..c6d6663c2d6a626e80fccf68cd5d8ffad691003a 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -214,6 +214,7 @@ "Opciones del teléfono" "Bloqueo de pantalla" "Apagar" + "Emergencia" "Informe de error" "Crear informe de errores" "Se recopilará información sobre el estado actual de tu dispositivo y se enviará por correo electrónico. Pasarán unos minutos desde que empiece a generarse el informe de errores hasta que se envíe." @@ -1076,6 +1077,17 @@ "Wi-Fi sin acceso a Internet" "Toca para ver opciones" + "Se ha cambiado a %1$s" + "El dispositivo utiliza %1$s cuando %2$s no tiene acceso a Internet. Es posible que se apliquen cargos." + "Se ha cambiado de %1$s a %2$s" + + "datos móviles" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "tipo de red desconocido" "No se ha podido establecer conexión con la red Wi-Fi." " tiene una conexión inestable a Internet." "¿Permitir la conexión?" @@ -1153,7 +1165,6 @@ "Toca para seleccionar el idioma y el diseño" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "candidatos" "Preparando %s" "Comprobando errores" "Nueva %s detectada" @@ -1232,8 +1243,9 @@ "Conectado a %s. Toca para administrar la red." "Conectando VPN siempre activada…" "VPN siempre activada conectada" + "VPN siempre activada desconectada" "Error de VPN siempre activada" - "Toca para configurar" + "Toca para configurar" "Seleccionar archivo" "Archivo no seleccionado" "Restablecer" @@ -1317,7 +1329,7 @@ "Unidad USB %s" "Almacenamiento USB" "Editar" - "Advertencia de uso de datos" + "Alerta sobre el uso de datos" "Toca para ver uso y ajustes." "Límite de datos 2G-3G alcanzado" "Límite de datos 4G alcanzado" @@ -1557,7 +1569,7 @@ "Actualizado por tu administrador" "Eliminado por tu administrador" "Para ayudar a mejorar la duración de la batería, la función de ahorro de energía reduce el rendimiento del dispositivo y limita la vibración, los servicios de ubicación y la mayor parte de la transmisión de datos en segundo plano. Es posible que las aplicaciones que se sincronizan, como las de correo y mensajes, no se actualicen a menos que las abras.\n\nLa función de ahorro de energía se desactiva automáticamente cuando el dispositivo se está cargando." - "El Economizador de Datos evita que algunas aplicaciones envíen o reciban datos en segundo plano, lo que permite reducir el uso de datos. Una aplicación activa podrá acceder a los datos, aunque con menos frecuencia. Esto significa que, por ejemplo, algunas imágenes no se muestren hasta que no las toques." + "El ahorro de datos evita que algunas aplicaciones envíen o reciban datos en segundo plano, lo que permite reducir el uso de datos. Una aplicación activa podrá acceder a los datos, aunque con menos frecuencia. Esto significa que, por ejemplo, algunas imágenes no se muestren hasta que no las toques." "¿Activar ahorro de datos?" "Activar" @@ -1636,6 +1648,7 @@ "Nombre de idioma" "Sugeridos" "Todos los idiomas" + "Todas las regiones" "Buscar" "Modo de trabajo desactivado" "Permite que se utilice el perfil de trabajo, incluidas las aplicaciones, la sincronización en segundo plano y las funciones relacionadas." diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml index 89223795d2bd4ebe01574ad18e70894e620591f0..9263b59b65b99bb5fbe04b5b976aaee82a3ab409 100644 --- a/core/res/res/values-et-rEE/strings.xml +++ b/core/res/res/values-et-rEE/strings.xml @@ -214,6 +214,7 @@ "Telefonivalikud" "Ekraanilukk" "Lülita välja" + "Hädaabi" "Veaaruanne" "Veaaruande võtmine" "Nii kogutakse teavet teie seadme praeguse oleku kohta, et saata see meilisõnumina. Enne kui saate veaaruande ära saata, võtab selle loomine natuke aega; varuge kannatust." @@ -251,7 +252,7 @@ "SMS" "saata ja vaadata SMS-sõnumeid" "Mäluruum" - "juurde pääseda seadmesse salvestatud fotodele, meediale ja failidele" + "juurde pääseda seadmesse salvestatud fotodele, meediasisule ja failidele" "Mikrofon" "heli salvestamine" "Kaamera" @@ -1076,6 +1077,17 @@ "WiFi-l pole juurdepääsu Internetile" "Puudutage valikute nägemiseks" + "Lülitati võrgule %1$s" + "Seade kasutab võrku %1$s, kui võrgul %2$s puudub Interneti-ühendus. Rakenduda võivad tasud." + "Lülitati võrgult %1$s võrgule %2$s" + + "mobiilne andmeside" + "WiFi" + "Bluetooth" + "Ethernet" + "VPN" + + "tundmatu võrgutüüp" "Ei saanud WiFi-ga ühendust" " on halb Interneti-ühendus." "Kas lubada ühendus?" @@ -1153,7 +1165,6 @@ "Puudutage keele ja paigutuse valimiseks" " ABCDEFGHIJKLMNOPQRSŠZŽTUVWÕÄÖÜXY" " 0123456789ABCDEFGHIJKLMNOPQRSŠZŽTUVWÕÄÖÜXY" - "kandidaadid" "Üksuse %s ettevalmistamine" "Vigade kontrollimine" "Tuvastati uus üksus %s" @@ -1232,8 +1243,9 @@ "Ühendatud seansiga %s. Koputage võrgu haldamiseks" "Ühendamine alati sees VPN-iga …" "Ühendatud alati sees VPN-iga" + "Alati sees VPN pole ühendatud" "Alati sees VPN-i viga" - "Puudutage seadistamiseks" + "Puudutage seadistamiseks" "Valige fail" "Ühtegi faili pole valitud" "Lähtesta" @@ -1317,7 +1329,7 @@ "Tootja %s USB-ketas" "USB-mäluseade" "Muuda" - "Andmete kasutamise hoiatus" + "Andmekasutuse hoiatus" "Puudutage kasutuse/seadete vaat." "2G-, 3G-andmeside limiit on täis" "4G-andmeside limiit on täis" @@ -1636,6 +1648,7 @@ "Sisestage keele nimi" "Soovitatud" "Kõik keeled" + "Kõik piirkonnad" "Otsing" "Töörežiim on VÄLJA LÜLITATUD" "Lubatakse tööprofiili toimingud, sh rakendused, taustal sünkroonimine ja seotud funktsioonid." diff --git a/core/res/res/values-eu-rES/strings.xml b/core/res/res/values-eu-rES/strings.xml index 7dc0877cd580caa21427f1131cd8fe46aaf6f422..97628fc768363d3a026a266eb0ef3231609c6795 100644 --- a/core/res/res/values-eu-rES/strings.xml +++ b/core/res/res/values-eu-rES/strings.xml @@ -214,6 +214,7 @@ "Telefonoaren aukerak" "Pantailaren blokeoa" "Itzali" + "Larrialdiak" "Akatsen txostena" "Sortu akatsen txostena" "Gailuaren uneko egoerari buruzko informazioa bilduko da, mezu elektroniko gisa bidaltzeko. Minutu batzuk igaroko dira akatsen txostena sortzen hasten denetik bidaltzeko prest egon arte. Itxaron, mesedez." @@ -742,7 +743,7 @@ "Erabiltzaile-hautatzailea" "Egoera" "Kamera" - "Multimedia-kontrolak" + "Multimedia kontrolatzeko aukerak" "Widgetak berrantolatzen hasi da." "Widgetak berrantolatu dira." "%1$s widgeta ezabatu da." @@ -1074,8 +1075,19 @@ "Hasi saioa sarean" - "Wi-Fi konexioa ezin da Internetera konektatu" + "Wi-Fi eginbidea ezin da Internetera konektatu" "Sakatu aukerak ikusteko" + "%1$s erabiltzen ari zara orain" + "%2$s Internetera konektatzeko gauza ez denean, %1$s erabiltzen du gailuak. Agian kostuak ordaindu beharko dituzu." + "%1$s erabiltzen ari zinen, baina %2$s erabiltzen ari zara orain" + + "datu-konexioa" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "sare mota ezezaguna" "Ezin izan da Wi-Fi sarera konektatu" " Interneteko konexio txarra du." "Konektatzea baimendu nahi diozu?" @@ -1153,7 +1165,6 @@ "Hizkuntza eta diseinua hautatzeko, sakatu hau" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "hautagaiak" "%s prestatzen" "Errorerik dagoen egiaztatzen" "%s berria hauteman da" @@ -1232,8 +1243,9 @@ "%s saiora konektatuta. Sakatu sarea kudeatzeko." "Beti aktibatuta dagoen VPNa konektatzen…" "Beti aktibatuta dagoen VPNa konektatu da" + "Deskonektatu egin da beti aktibatuta dagoen VPN konexioa" "Beti aktibatuta dagoen VPN errorea" - "Sakatu konfiguratzeko" + "Konfiguratzeko, sakatu hau" "Aukeratu fitxategia" "Ez da fitxategirik aukeratu" "Berrezarri" @@ -1317,7 +1329,7 @@ "%s USB unitatea" "USB memoria" "Editatu" - "Datuen erabilerari buruzko abisua" + "Datu-erabilerari buruzko abisua" "Sakatu erabilera eta ezarpenak ikusteko." "2-3 GB-ko mugara iritsi zara" "4 GB-ko mugara iritsi zara" @@ -1636,6 +1648,7 @@ "Adierazi hizkuntza" "Iradokitakoak" "Hizkuntza guztiak" + "Lurralde guztiak" "Bilaketa" "Desaktibatuta dago laneko modua" "Baimendu laneko profilak funtzionatzea, besteak beste, aplikazioak, atzeko planoko sinkronizazioa eta erlazionatutako eginbideak." diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 5976ad13419148c2b1de1d2c85822c38dc05f94d..128a66f394da4b519b6cb4c59da2d14eb2433f8e 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -214,6 +214,7 @@ "گزینه‌های تلفن" "قفل صفحه" "خاموش کردن" + "اضطراری" "گزارش اشکال" "گرفتن گزارش اشکال" "این گزارش اطلاعات مربوط به وضعیت دستگاه کنونی شما را جمع‌آوری می‌کند تا به صورت یک پیام رایانامه ارسال شود. از زمان شروع گزارش اشکال تا آماده شدن برای ارسال اندکی زمان می‌برد؛ لطفاً شکیبا باشید." @@ -924,9 +925,9 @@ در %d سال در %d سال - "مشکل در ویدیو" - "متأسفیم، این ویدیو برای پخش جریانی با این دستگاه معتبر نیست." - "پخش این ویدیو ممکن نیست." + "مشکل در ویدئو" + "متأسفیم، این ویدئو برای پخش جریانی با این دستگاه معتبر نیست." + "پخش این ویدئو ممکن نیست." "تأیید" "%1$s، %2$s" "ظهر" @@ -1076,6 +1077,17 @@ "‏Wi-Fi به اینترنت دسترسی ندارد" "برای گزینه‌ها ضربه بزنید" + "به %1$s تغییر کرد" + "وقتی %2$s دسترسی به اینترنت نداشته باشد، دستگاه از %1$s استفاده می‌کند. ممکن است هزینه‌هایی اعمال شود." + "از %1$s به %2$s تغییر کرد" + + "داده شبکه تلفن همراه" + "Wi-Fi" + "بلوتوث" + "اترنت" + "VPN" + + "نوع شبکه نامشخص" "‏اتصال به Wi-Fi ممکن نیست" " اتصال اینترنتی ضعیفی دارد." "اتصال مجاز است؟" @@ -1153,7 +1165,6 @@ "برای انتخاب زبان و چیدمان ضربه بزنید" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "داوطلبین" "در حال آماده‌سازی %s" "در حال بررسی برای خطاها" "%s جدید شناسایی شد" @@ -1232,8 +1243,9 @@ "به %s متصل شد. برای مدیریت شبکه ضربه بزنید." "‏در حال اتصال VPN همیشه فعال…" "‏VPN همیشه فعال متصل شد" + "‏ارتباط VPN همیشه روشن قطع شد" "‏خطای VPN همیشه فعال" - "جهت پیکربندی ضربه بزنید" + "برای راه‌اندازی ضربه بزنید" "انتخاب فایل" "هیچ فایلی انتخاب نشد" "بازنشانی" @@ -1317,7 +1329,7 @@ "‏درایو USB ‏%s" "‏حافظهٔ USB" "ویرایش" - "هشدار میزان استفاده از داده" + "هشدار مصرف داده" "برای مشاهده مصرف و تنظیمات ضربه بزنید." "‏به حد مجاز مصرف داده 2G-3G رسید" "‏به حد مجاز مصرف داده 4G رسید" @@ -1512,8 +1524,8 @@ "Kahu" "Kaku2" "You4" - "عمودی ناشناس" - "افقی ناشناس" + "عمودی نامشخص" + "افقی نامشخص" "لغو شد" "خطا هنگام نوشتن محتوا" "نامعلوم" @@ -1636,6 +1648,7 @@ "نام زبان را تایپ کنید" "پیشنهادشده" "همه زبان‌ها" + "همه منطقه‌ها" "جستجو" "حالت کاری خاموش است" "به نمایه کاری اجازه فعالیت ( شامل استفاده از برنامه‌ها، همگام‌سازی در پس‌زمینه و قابلیت‌های مرتبط) داده شود." diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index b22175040dd7b47fd1243859d02ead29d3f58504..c4c223bd70855fbac9d3d3463efd09004cb69859 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -214,6 +214,7 @@ "Puhelimen asetukset" "Näytön lukitus" "Katkaise virta" + "Hätäpuhelu" "Virheraportti" "Luo virheraportti" "Toiminto kerää tietoja laitteen tilasta ja lähettää ne sähköpostitse. Virheraportti on valmis lähetettäväksi hetken kuluttua - kiitos kärsivällisyydestäsi." @@ -1076,6 +1077,17 @@ "Wi-Fi ei ole yhteydessä internetiin." "Näytä vaihtoehdot napauttamalla." + "%1$s otettiin käyttöön" + "%1$s otetaan käyttöön, kun %2$s ei voi muodostaa yhteyttä internetiin. Veloitukset ovat mahdollisia." + "%1$s poistettiin käytöstä ja %2$s otettiin käyttöön." + + "mobiilidata" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "tuntematon verkon tyyppi" "Wi-Fi-yhteyden muodostaminen epäonnistui" " : huono internetyhteys." "Sallitaanko yhteys?" @@ -1153,7 +1165,6 @@ "Valitse kieli ja asettelu koskettamalla." " ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "kandidaatit" "Valmistellaan kohdetta %s" "Tarkistetaan virheiden varalta." "Uusi %s on havaittu." @@ -1232,8 +1243,9 @@ "Yhdistetty: %s. Hallinnoi verkkoa napauttamalla." "Yhdistetään aina käytössä olevaan VPN-verkkoon..." "Yhdistetty aina käytössä olevaan VPN-verkkoon" + "Aina käytössä olevan VPN:n yhteys on katkaistu" "Aina käytössä oleva VPN: virhe" - "Määritä napauttamalla." + "Määritä koskettamalla." "Valitse tiedosto" "Ei valittua tiedostoa" "Palauta" @@ -1317,7 +1329,7 @@ "USB-asema: %s" "USB-tallennustila" "Muokkaa" - "Tiedonsiirtovaroitus" + "Datankäyttövaroitus" "Käyttö & asetukset napauttamalla" "2G-3G-tietojen raja saavutettu" "4G-tietojen raja saavutettu" @@ -1636,6 +1648,7 @@ "Anna kielen nimi" "Ehdotukset" "Kaikki kielet" + "Kaikki alueet" "Haku" "Työtila on pois käytöstä" "Sallii työprofiiliin toiminnan, esimerkiksi sovellukset ja taustasynkronoinnin." diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index d9fbceb2ba5da763dde6a8d7a6044e7d7ac369eb..e52eeda9f7f3f577a61ed0506609ef6a7b185e00 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -214,6 +214,7 @@ "Options du téléphone" "Verrouillage de l\'écran" "Éteindre" + "Urgence" "Rapport de bogue" "Créer un rapport de bogue" "Cela permet de recueillir des informations concernant l\'état actuel de votre appareil. Ces informations sont ensuite envoyées sous forme de courriel. Merci de patienter pendant la préparation du rapport de bogue. Cette opération peut prendre quelques instants." @@ -1076,6 +1077,17 @@ "Le réseau Wi-Fi ne dispose d\'aucun accès à Internet" "Touchez pour afficher les options" + "Passé au réseau %1$s" + "L\'appareil utilise %1$s quand %2$s n\'a pas d\'accès à Internet. Des frais peuvent s\'appliquer." + "Passé du réseau %1$s au %2$s" + + "données cellulaires" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "RPV" + + "un type de réseau inconnu" "Impossible de se connecter au Wi-Fi." " dispose d\'une mauvaise connexion Internet." "Autoriser la connexion?" @@ -1153,7 +1165,6 @@ "Touchez pour sélectionner la langue et la configuration du clavier" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "candidats" "Préparation de « %s » en cours" "Recherche d\'erreurs en cours..." "Une nouvelle mémoire « %s » a été détectée" @@ -1232,8 +1243,9 @@ "Connecté à %s. Appuyez ici pour gérer le réseau." "VPN permanent en cours de connexion…" "VPN permanent connecté" + "RPV permanent déconnecté" "Erreur du VPN permanent" - "Touchez pour configurer" + "Touchez pour configurer" "Choisir un fichier" "Aucun fichier sélectionné" "Réinitialiser" @@ -1317,7 +1329,7 @@ "Clé USB %s" "Mémoire de stockage USB" "Modifier" - "Avertissement utilisation données" + "Alerte d\'utilisation des données" "Touch. pour aff. util. et param." "Limite de données 2G-3G atteinte" "Limite de données 4G atteinte" @@ -1636,6 +1648,7 @@ "Entrez la langue" "Suggestions" "Toutes les langues" + "Toutes les régions" "Rechercher" "Le mode Travail est désactivé" "Autoriser le fonctionnement du profil professionnel, y compris les applications, la synchronisation en arrière-plan et les fonctionnalités associées." diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 6600f0926c1adfe1a257a141ea2e485c80b31367..9da228e40d01d9e4e7325130830f963f37f7e834 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -214,6 +214,7 @@ "Options du téléphone" "Verrouillage de l\'écran" "Éteindre" + "Urgences" "Rapport de bug" "Créer un rapport de bug" "Cela permet de recueillir des informations concernant l\'état actuel de votre appareil. Ces informations sont ensuite envoyées sous forme d\'e-mail. Merci de patienter pendant la préparation du rapport de bug. Cette opération peut prendre quelques instants." @@ -993,7 +994,7 @@ "Aucune application ne peut effectuer cette action." "%1$s a cessé de fonctionner." "Le processus %1$s a cessé de fonctionner." - "%1$s ne cesse de s\'arrêter." + "%1$s s\'arrête systématiquement" "Le processus \"%1$s\" ne cesse de s\'arrêter." "Rouvrir l\'application" "Envoyer des commentaires" @@ -1076,6 +1077,17 @@ "Le réseau Wi-Fi ne dispose d\'aucun accès à Internet." "Appuyez ici pour afficher des options." + "Nouveau réseau : %1$s" + "L\'appareil utilise %1$s lorsque %2$s n\'a pas de connexion Internet. Des frais supplémentaires peuvent s\'appliquer." + "Ancien réseau : %1$s. Nouveau réseau : %2$s" + + "données mobiles" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "type de réseau inconnu" "Impossible de se connecter au Wi-Fi." " dispose d\'une mauvaise connexion Internet." "Autoriser la connexion ?" @@ -1153,7 +1165,6 @@ "Appuyer pour sélectionner la langue et la disposition" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "candidats" "Préparation mémoire \"%s\" en cours" "Recherche d\'erreurs" "Une nouvelle mémoire de stockage \"%s\" a été détectée." @@ -1232,8 +1243,9 @@ "Connecté à %s. Appuyez ici pour gérer le réseau." "VPN permanent en cours de connexion…" "VPN permanent connecté" + "VPN permanent déconnecté" "Erreur du VPN permanent" - "Appuyez ici pour configurer." + "Appuyer pour configurer" "Sélectionner un fichier" "Aucun fichier sélectionné" "Réinitialiser" @@ -1317,7 +1329,7 @@ "Clé USB %s" "Mémoire de stockage USB" "Modifier" - "Avertissement utilisation données" + "Alerte de consommation des données" "Appuyez pour conso/paramètres." "Limite de données 2G-3G atteinte" "Limite de données 4G atteinte" @@ -1558,7 +1570,7 @@ "Supprimé par votre administrateur" "Pour améliorer l\'autonomie de la batterie, l\'économiseur de batterie réduit les performances et désactive le vibreur, les services de localisation et la plupart des données en arrière-plan. Les messageries électroniques ou autres applications utilisant la synchronisation pourraient ne pas se mettre à jour, sauf si vous les ouvrez.\n\nL\'économiseur de batterie s\'éteint automatiquement lorsque l\'appareil est en charge." "Pour réduire la consommation des données, l\'économiseur de données empêche certaines applications d\'envoyer ou de recevoir des données en arrière-plan. Ainsi, une application que vous utilisez actuellement peut accéder à des données, mais moins souvent. Par exemple, il se peut que les images ne s\'affichent pas tant que vous n\'appuyez pas dessus." - "Activer sauvegarde données ?" + "Activer l\'économiseur de données ?" "Activer" Pendant %1$d minute (jusqu\'à %2$s) @@ -1636,6 +1648,7 @@ "Saisissez la langue" "Recommandations" "Toutes les langues" + "Toutes les régions" "Rechercher" "Mode professionnel DÉSACTIVÉ" "Autoriser le fonctionnement du profil professionnel, y compris les applications, la synchronisation en arrière-plan et les fonctionnalités associées." diff --git a/core/res/res/values-gl-rES/strings.xml b/core/res/res/values-gl-rES/strings.xml index 8023edffdb4716b57e6f1eb8ed6a4e7660cb3aff..72757a6aae6b547281ba6c7d1aff53b499c85033 100644 --- a/core/res/res/values-gl-rES/strings.xml +++ b/core/res/res/values-gl-rES/strings.xml @@ -214,6 +214,7 @@ "Opcións de teléfono" "Bloqueo da pantalla" "Apagar" + "Emerxencias" "Informe de erros" "Crear informe de erros" "Este informe recompilará información acerca do estado actual do teu dispositivo para enviala en forma de mensaxe de correo electrónico. O informe de erros tardará un pouco en completarse desde o seu inicio ata que estea preparado para enviarse, polo que che recomendamos que teñas paciencia." @@ -598,7 +599,7 @@ "Devolver chamada" "Coche" "Empresa (ppal.)" - "ISDN" + "RDSI" "Principal" "Outro fax" "Radio" @@ -1076,6 +1077,17 @@ "A wifi non ten acceso a Internet" "Toca para ver opcións." + "Cambiouse a: %1$s" + "O dispositivo utiliza %1$s cando %2$s non ten acceso a Internet. Pódense aplicar cargos." + "Cambiouse de %1$s a %2$s" + + "datos móbiles" + "wifi" + "Bluetooth" + "Ethernet" + "VPN" + + "un tipo de rede descoñecido" "Non se puido conectar coa rede Wi-Fi" " ten unha conexión a Internet deficiente." "Queres permitir a conexión?" @@ -1153,7 +1165,6 @@ "Toca para seleccionar o idioma e o deseño" " ABCDEFGHIJKLMNÑOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNÑOPQRSTUVWXYZ" - "candidatos" "Preparando a %s" "Comprobando se hai erros" "Detectouse unha %s nova" @@ -1232,8 +1243,9 @@ "Conectado a %s. Toca aquí para xestionar a rede." "VPN sempre activada conectándose..." "VPN sempre activada conectada" + "Desconectouse a VPN sempre activada" "Erro na VPN sempre activada" - "Toca para configurar" + "Tocar para configurar" "Escoller un ficheiro" "Non se seleccionou ningún ficheiro" "Restablecer" @@ -1317,7 +1329,7 @@ "Unidade USB de %s" "almacenamento USB" "Editar" - "Aviso de uso de datos" + "Alerta de uso de datos" "Toca para uso e configuración." "Límite de datos de 2G-3G acadado" "Límite de datos de 4G acadado" @@ -1636,6 +1648,7 @@ "Nome do idioma" "Suxeridos" "Todos os idiomas" + "Todas as rexións" "Buscar" "Modo de traballo DESACTIVADO" "Permite que funcione o perfil de traballo, incluídas as aplicacións, a sincronización en segundo plano e as funcións relacionadas." diff --git a/core/res/res/values-gu-rIN/strings.xml b/core/res/res/values-gu-rIN/strings.xml index 5c3bf93b551afa2beafe54b48bfb0f2d38b12b73..a233361d579219f2f9ef3a28eee6e4ca585e73e6 100644 --- a/core/res/res/values-gu-rIN/strings.xml +++ b/core/res/res/values-gu-rIN/strings.xml @@ -214,6 +214,7 @@ "ફોન વિકલ્પો" "સ્ક્રીન લૉક" "પાવર બંધ" + "કટોકટી" "બગ રિપોર્ટ" "બગ રિપોર્ટ લો" "આ, એક ઇ-મેઇલ સંદેશ તરીકે મોકલવા માટે, તમારા વર્તમાન ઉપકરણ સ્થિતિ વિશેની માહિતી એકત્રિત કરશે. એક બગ રિપોર્ટ પ્રારંભ કરીને તે મોકલવા માટે તૈયાર ન થઈ જાય ત્યાં સુધી તેમાં થોડો સમય લાગશે; કૃપા કરીને ધીરજ રાખો." @@ -1076,6 +1077,17 @@ "Wi-Fi ને કોઈ ઇન્ટરનેટ ઍક્સેસ નથી" "વિકલ્પો માટે ટૅપ કરો" + "%1$s પર સ્વિચ કર્યું" + "જ્યારે %2$s પાસે કોઈ ઇન્ટરનેટ ઍક્સેસ ન હોય ત્યારે ઉપકરણ %1$s નો ઉપયોગ કરે છે. શુલ્ક લાગુ થઈ શકે છે." + "%1$s પરથી %2$s પર સ્વિચ કર્યું" + + "સેલ્યુલર ડેટા" + "Wi-Fi" + "Bluetooth" + "ઇથરનેટ" + "VPN" + + "અજાણ્યો નેટવર્ક પ્રકાર" "Wi-Fi સાથે કનેક્ટ કરી શકાયું નથી" " નબળું ઇન્ટરનેટ કનેક્શન ધરાવે છે." "કનેક્શનની મંજૂરી આપીએ?" @@ -1153,7 +1165,6 @@ "ભાષા અને લેઆઉટ પસંદ કરવા માટે ટૅપ કરો" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "ઉમેદવારો" "%s ને તૈયાર કરી રહ્યું છે" "ભૂલો માટે તપાસી રહ્યું છે" "નવું %s મળ્યું" @@ -1232,8 +1243,9 @@ "%s થી કનેક્ટ થયાં. નેટવર્કને સંચાલિત કરવા માટે ટૅપ કરો." "હંમેશા-ચાલુ VPN કનેક્ટ થઈ રહ્યું છે…" "હંમેશા-ચાલુ VPN કનેક્ટ થયું" + "હંમેશાં-ચાલુ VPN ડિસ્કનેક્ટ થયું" "હંમેશાં ચાલુ VPN ભૂલ" - "ગોઠવવા માટે ટૅપ કરો" + "સેટ કરવા માટે ટૅપ કરો" "ફાઇલ પસંદ કરો" "કોઈ ફાઇલ પસંદ કરેલી નથી" "ફરીથી સેટ કરો" @@ -1317,7 +1329,7 @@ "%s USB ડ્રાઇવ" "USB સંગ્રહ" "સંપાદિત કરો" - "ડેટા વપરાશ ચેતવણી" + "ડેટા વપરાશ ચેતવણી" "વપરાશ અને સેટિંગ્સ જોવા ટૅપ કરો." "2G-3G ડેટા મર્યાદા પર પહોંચ્યાં" "4G ડેટા મર્યાદા સુધી પહોંચ્યાં" @@ -1636,6 +1648,7 @@ "ભાષાનું નામ ટાઇપ કરો" "સૂચવેલા" "બધી ભાષાઓ" + "તમામ પ્રદેશ" "શોધ" "કાર્ય મોડ બંધ છે" "કાર્ય પ્રોફાઇલને ઍપ્લિકેશનો, પૃષ્ઠભૂમિ સમન્વયન અને સંબંધિત સુવિધાઓ સહિતનું કાર્ય કરવાની મંજૂરી આપો." diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index bea243b7e2413400dffd27ae7718d65cb922f67d..ea45c1a1764226da8eb0c0bd28746a4dd60ccadf 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -214,6 +214,7 @@ "फ़ोन विकल्‍प" "स्‍क्रीन लॉक" "पावर बंद" + "आपातकाल" "बग रिपोर्ट" "बग रिपोर्ट प्राप्त करें" "ईमेल संदेश के रूप में भेजने के लिए, इसके द्वारा आपके डिवाइस की वर्तमान स्थिति के बारे में जानकारी एकत्र की जाएगी. बग रिपोर्ट प्रारंभ करने से लेकर भेजने के लिए तैयार होने तक कुछ समय लगेगा; कृपया धैर्य रखें." @@ -295,9 +296,9 @@ "SMS संदेश भेजें और देखें" "ऐप्स को SMS संदेशों को भेजने देता है. इसके परिणामस्वरूप अप्रत्‍याशित शुल्‍क लागू हो सकते हैं. दुर्भावनापूर्ण ऐप्स आपकी पुष्टि के बिना संदेश भेजकर आपका धन व्‍यय कर सकते हैं." "अपने लेख संदेश (SMS या MMS) पढ़ें" - "ऐप्स को आपके टेबलेट या सिम कार्ड में संग्रहीत SMS संदेश पढ़ने देता है. इससे सामग्री या गोपनीयता पर ध्यान दिए बिना, ऐप्स सभी SMS संदेश पढ़ सकता है." - "ऐप को आपके टीवी या सिम कार्ड पर संग्रहीत SMS संदेशों को पढ़ने की अनुमति देती है. इससे ऐप को सामग्री या गोपनीयता पर ध्‍यान दिए बिना, सभी SMS संदेशों को पढ़ने की अनुमति मिल जाती है." - "ऐप्स को आपके फ़ोन या सिम कार्ड में संग्रहीत SMS संदेश पढ़ने देता है. इससे सामग्री या गोपनीयता पर ध्यान दिए बिना, ऐप्स सभी SMS संदेश पढ़ सकता है." + "ऐप्स को आपके टेबलेट या सिम कार्ड में संग्रहीत SMS संदेश पढ़ने देता है. इससे सामग्री या निजता पर ध्यान दिए बिना, ऐप्स सभी SMS संदेश पढ़ सकता है." + "ऐप को आपके टीवी या सिम कार्ड पर संग्रहीत SMS संदेशों को पढ़ने की अनुमति देती है. इससे ऐप को सामग्री या निजता पर ध्‍यान दिए बिना, सभी SMS संदेशों को पढ़ने की अनुमति मिल जाती है." + "ऐप्स को आपके फ़ोन या सिम कार्ड में संग्रहीत SMS संदेश पढ़ने देता है. इससे सामग्री या निजता पर ध्यान दिए बिना, ऐप्स सभी SMS संदेश पढ़ सकता है." "लेख संदेश (WAP) प्राप्त करें" "ऐप्स को WAP संदेशों को प्राप्‍त और संसाधित करने देता है. इस अनुमति में आपको भेजे गए संदेशों की निगरानी आपको दिखाए बिना करने और हटाने की क्षमता शामिल है." "चल रहे ऐप्स पुनर्प्राप्त करें" @@ -347,9 +348,9 @@ "शरीर संवेदक एक्सेस करें (जैसे हृदय गति मॉनीटर)" "ऐप को आपकी शारीरिक स्‍थिति, जैसे आपकी हृदय गति पर नज़र रखने वाले संवेदकों का डेटा एक्‍सेस करने देती है." "केलैंडर ईवेंट के साथ-साथ गोपनीय जानकारी पढ़ें" - "ऐप्स को मित्रों या सहकर्मियों के कैलेंडर इवेंट सहित, आपके टेबलेट पर संग्रहीत कैलेंडर इवेंट पढ़ने देता है. इससे गोपनीयता या संवेदनशीलता पर ध्यान दिए बिना, ऐप्स आपके कैलेंडर डेटा को साझा कर सकता है या सहेज सकता है." - "ऐप को, मित्रों और सहकर्मियों के कैलेंडर ईवेंट सहित, आपके टीवी पर संग्रहीत सभी कैलेंडर ईवेंट पढ़ने देती है. इससे ऐप को गोपनीयता या संवेदनशीलता पर ध्‍यान दिए बिना, आपका कैलेडर डेटा साझा करने या सहेजने की अनुमति मिल जाती है." - "ऐप्स को मित्रों या सहकर्मियों के कैलेंडर इवेंट सहित, आपके फ़ोन पर संग्रहीत कैलेंडर इवेंट पढ़ने देता है. इससे गोपनीयता या संवेदनशीलता पर ध्यान दिए बिना, ऐप्स आपके कैलेंडर डेटा को साझा कर सकता है या सहेज सकता है." + "ऐप्स को मित्रों या सहकर्मियों के कैलेंडर इवेंट सहित, आपके टेबलेट पर संग्रहीत कैलेंडर इवेंट पढ़ने देता है. इससे निजता या संवेदनशीलता पर ध्यान दिए बिना, ऐप्स आपके कैलेंडर डेटा को साझा कर सकता है या सहेज सकता है." + "ऐप को, मित्रों और सहकर्मियों के कैलेंडर ईवेंट सहित, आपके टीवी पर संग्रहीत सभी कैलेंडर ईवेंट पढ़ने देती है. इससे ऐप को निजता या संवेदनशीलता पर ध्‍यान दिए बिना, आपका कैलेडर डेटा साझा करने या सहेजने की अनुमति मिल जाती है." + "ऐप्स को मित्रों या सहकर्मियों के कैलेंडर इवेंट सहित, आपके फ़ोन पर संग्रहीत कैलेंडर इवेंट पढ़ने देता है. इससे निजता या संवेदनशीलता पर ध्यान दिए बिना, ऐप्स आपके कैलेंडर डेटा को साझा कर सकता है या सहेज सकता है." "अपनी जानकारी के बि‍ना कैलेंडर ईवेंट जोड़ें या संशोधि‍त करें और अति‍थि‍यों को ईमेल भेजें" "ऐप्स को मित्रों या सहकर्मियों के ईवेंट के साथ ही वे ईवेंट जोड़ने, निकालने, बदलने देता है जिन्हें आप अपने टेबलेट पर संशोधित कर सकते हैं. इससे ऐप्स ,अपनी जानकारी के बिना उन संदेशों को भेज सकता है जो कैलेंडर स्वामियों की ओर से आते दिखाई देते हैं, या ईवेंट संशोधित कर सकता है." "ऐप को ऐसे ईवेंट जोड़ने, निकालने, बदलने देती है जिन्हें आप अपने डिवाइस पर बदल सकते हैं, जिनमें मित्रों या सहकर्मियों के ईवेंट शामिल हैं. इससे ऐप ऐसे संदेश भेज सकता है जो कैलेंडर स्वामी से आते हुए प्रतीत होते हैं या ऐप स्वामी की जानकारी के बिना ईवेंट बदल सकता है." @@ -1076,6 +1077,17 @@ "वाई-फ़ाई में कोई इंटरनेट ऐक्‍सेस नहीं है" "विकल्पों के लिए टैप करें" + "%1$s पर ले जाया गया" + "%2$s में कोई इंटरनेट एक्‍सेस नहीं होने पर डिवाइस %1$s का उपयोग करता है. शुल्क लिया जा सकता है." + "%1$s से %2$s पर ले जाया गया" + + "सेल्युलर डेटा" + "वाई-फ़ाई" + "ब्लूटूथ" + "ईथरनेट" + "VPN" + + "अज्ञात नेटवर्क प्रकार" "वाई-फ़ाई से कनेक्‍ट नहीं हो सका" " के पास एक कमज़ोर इंटरनेट कनेक्‍शन है." "कनेक्शन की अनुमति दें?" @@ -1153,7 +1165,6 @@ "भाषा और लेआउट चुनने के लिए टैप करें" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "उम्‍मीदवार" "%s को तैयार किया जा रहा है" "त्रुटियों की जांच कर रहा है" "नए %s का पता लगा" @@ -1232,8 +1243,9 @@ "%s से कनेक्‍ट किया गया. नेटवर्क प्रबंधित करने के लिए टैप करें." "हमेशा-चालू VPN कनेक्ट हो रहा है…" "हमेशा-चालू VPN कनेक्ट है" + "हमेशा-चालू VPN डिस्‍कनेक्‍ट है" "हमेशा-चालू VPN त्रुटि" - "कॉन्फ़िगर करने के लिए टैप करें" + "सेट करने के लिए टैप करें" "फ़ाइल चुनें" "कोई फ़ाइल चुनी नहीं गई" "रीसेट करें" @@ -1317,7 +1329,7 @@ "%s USB डिस्‍क" "USB मेमोरी" "संपादित करें" - "डेटा उपयोग की चेतावनी" + "डेटा उपयोग की सूचना" "उपयोग व सेटिंग देखने हेतु टैप करें." "2G-3G डेटा सीमा पूर्ण हो गई" "4G डेटा सीमा पूर्ण हो गई" @@ -1636,6 +1648,7 @@ "भाषा का नाम लिखें" "सुझाए गए" "सभी भाषाएं" + "सभी क्षेत्र" "खोजें" "कार्य मोड बंद है" "ऐप्स, पृष्ठभूमि समन्वयन और संबंधित सुविधाओं सहित कार्य प्रोफ़ाइल को काम करने की अनुमति दें" diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index b181f6d40e83b20010c1b0dc44f50b52612d4fd0..5f2d3d62d50e9da44cd1e49c06d6de4a37417c63 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -216,6 +216,7 @@ "Opcije telefona" "Zaključavanje zaslona" "Isključi" + "Hitno" "Izvješće o bugovima" "Izvješće o programskoj pogrešci" "Time će se prikupiti podaci o trenutačnom stanju vašeg uređaja koje ćete nam poslati u e-poruci. Za pripremu izvješća o programskoj pogrešci potrebno je nešto vremena pa vas molimo za strpljenje." @@ -1101,6 +1102,17 @@ "Wi-Fi nema pristup internetu" "Dodirnite za opcije" + "Prelazak na drugu mrežu: %1$s" + "Kada %2$s nema pristup internetu, na uređaju se upotrebljava %1$s. Moguća je naplata naknade." + "Mreža je promijenjena: %1$s > %2$s" + + "mobilni podaci" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "nepoznata vrsta mreže" "Ne može se spojiti na Wi-Fi" " ima lošu internetsku vezu." "Dopustiti povezivanje?" @@ -1178,7 +1190,6 @@ "Dodirnite da biste odabrali jezik i raspored" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "kandidati" "Priprema uređaja %s" "Traženje pogrešaka" "Otkriven je novi uređaj %s" @@ -1257,8 +1268,9 @@ "Povezan sa sesijom %s. Dotaknite za upravljanje mrežom." "Povezivanje s uvijek uključenom VPN mrežom…" "Povezan s uvijek uključenom VPN mrežom" + "Prekinuta je veza s uvijek uključenom VPN mrežom" "Pogreška uvijek uključene VPN mreže" - "Dodirnite da biste konfigurirali" + "Dodirnite za postavljanje" "Odaberite datoteku" "Nema odabranih datoteka" "Ponovo postavi" @@ -1343,7 +1355,7 @@ "%s USB pogon" "USB pohrana" "Uredi" - "Upozorenje o upotrebi podataka" + "Upozorenje o upotrebi podataka" "Dodirnite za upotrebu i postavke" "Dost. ogr. 2G–3G prijenosa pod." "Dost. ogr. 4G prijenosa podataka" @@ -1672,6 +1684,7 @@ "Unesite naziv jezika" "Predloženo" "Svi jezici" + "Sve regije" "Pretraži" "Radni je način ISKLJUČEN" "Omogućuje radnom profilu da funkcionira, uključujući aplikacije, sinkronizaciju u pozadini i povezane značajke." diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index aea12a60f2aef9dbe7dc1aa30bd9374c06a89fe5..cd3659a7f0f9d54788dbe657652089664c6a0c88 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -214,6 +214,7 @@ "Telefonbeállítások" "Képernyő lezárása" "Kikapcsolás" + "Vészhívás" "Programhiba bejelentése" "Hibajelentés készítése" "Ezzel információt fog gyűjteni az eszköz jelenlegi állapotáról, amelyet a rendszer e-mailben fog elküldeni. Kérjük, legyen türelemmel, amíg a hibajelentés elkészül, és küldhető állapotba kerül." @@ -1076,6 +1077,17 @@ "A Wi-Fi-hálózaton nincs internetkapcsolat" "Koppintson a beállítások megjelenítéséhez" + "Átváltva erre: %1$s" + "%1$s használata, ha nincs internetkapcsolat %2$s-kapcsolaton keresztül. A szolgáltató díjat számíthat fel." + "Átváltva %1$s-hálózatról erre: %2$s" + + "mobiladat" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "ismeretlen hálózati típus" "Nem sikerült csatlakozni a Wi-Fi hálózathoz" " rossz internetkapcsolattal rendelkezik." "Engedélyezi a csatlakozást?" @@ -1153,7 +1165,6 @@ "Koppintson a nyelv és a billentyűzetkiosztás kiválasztásához" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "jelöltek" "%s előkészítése" "Hibák keresése" "Új %s észlelve" @@ -1232,8 +1243,9 @@ "Csatlakozva ide: %s. Érintse meg a hálózat kezeléséhez." "Csatlakozás a mindig bekapcsolt VPN-hez..." "Csatlakozva a mindig bekapcsolt VPN-hez" + "Kapcsolat bontva a mindig bekapcsolt VPN-nel" "Hiba a mindig bekapcsolt VPN-nel" - "Koppintson a konfiguráláshoz" + "Koppintson ide a beállításhoz" "Fájl kiválasztása" "Nincs fájl kiválasztva" "Alaphelyzet" @@ -1317,7 +1329,7 @@ "%s USB-meghajtó" "USB-tár" "Szerkesztés" - "Adathasználati figyelmeztetés" + "Adathasználati értesítés" "Koppintson az adatokért." "2G-/3G-adatkorlát elérve" "4G-adatkorlát elérve" @@ -1636,6 +1648,7 @@ "Adja meg a nyelvet" "Javasolt" "Minden nyelv" + "Minden régió" "Keresés" "A munka mód KI van kapcsolva" "Munkaprofil használatának engedélyezése, beleértve az alkalmazásokat, a háttérben való szinkronizálást és a kapcsolódó funkciókat." diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml index ba97468da4366374b623bc598ceb29b4ec0c923b..160efff177e38b21bb64227f9e334839d1746ee7 100644 --- a/core/res/res/values-hy-rAM/strings.xml +++ b/core/res/res/values-hy-rAM/strings.xml @@ -214,6 +214,7 @@ "Հեռախոսի ընտրանքներ" "Էկրանի փական" "Անջատել" + "Շտապ կանչ" "Վրիպակի զեկույց" "Գրել սխալի զեկույց" "Սա տեղեկություններ կհավաքագրի ձեր սարքի առկա կարգավիճակի մասին և կուղարկի այն էլեկտրոնային նամակով: Որոշակի ժամանակ կպահանջվի վրիպակի մասին զեկուցելու պահից սկսած մինչ ուղարկելը: Խնդրում ենք փոքր-ինչ համբերատար լինել:" @@ -249,17 +250,17 @@ "Օրացույց" "օգտագործել օրացույցը" "Կարճ հաղորդագրություն" - "ուղարկել և դիտել SMS հաղորդագրությունները" + "ուղարկել և դիտել SMS-ները" "Պահոց" - "օգտագործել լուսանկարները, մեդիա ֆայլերը և ձեր սարքում պահվող այլ ֆայլերը" + "օգտագործել լուսանկարները, մեդիա ֆայլերը և ձեր սարքում պահվող մյուս ֆայլերը" "Բարձրախոս" - "ձայնագրում" + "ձայնագրել" "Ֆոտոխցիկ" - "լուսանկարում և տեսագրում" + "լուսանկարել և տեսագրել" "Հեռախոս" - "հեռախոսազանգերի կատարում և կառավարում" + "կատարել զանգեր և կառավարել զանգերը" "Մարմնի սենսորներ" - "օգտագործել ձեր հիմնական ֆիզիոլոգիական ցուցանիշների վերաբերյալ սենսորի տվյալները" + "օգտագործել սենսորների տվյալները ձեր օրգանիզմի վիճակի մասին" "Առբերել պատուհանի բովանդակությունը" "Ստուգեք պատուհանի բովանդակությունը, որի հետ փոխգործակցում եք:" "Միացնել Հպման միջոցով հետազոտումը" @@ -673,7 +674,7 @@ "Ապակողպելու կամ շտապ կանչ անելու համար սեղմեք «Ընտրացանկ»" "Ապակողպելու համար սեղմեք Ցանկը:" "Հավաքեք սխեման` ապակողպելու համար" - "Արտակարգ իրավիճակ" + "Շտապ կանչ" "Վերադառնալ զանգին" "Ճիշտ է:" "Կրկին փորձեք" @@ -1057,8 +1058,8 @@ "Զանգի ձայնի բարձրություն" "Մեդիա ձայնի բարձրություն" "Ծանուցումների ձայնի ուժգնությունը" - "Լռելյայն զանգերանգ" - "Լռելյայն զանգերանգ (%1$s)" + "Կանխադրված զանգերանգ" + "Կանխադրված զանգերանգ (%1$s)" "Ոչ մեկը" "Զանգերանգներ" "Անհայտ զանգերանգ" @@ -1076,6 +1077,17 @@ "Wi-Fi ցանցը համացանցի միացում չունի" "Հպեք՝ ընտրանքները տեսնելու համար" + "Անցել է %1$s ցանցի" + "Եթե %2$s ցանցն ինտերնետ կապ չունի, սարքն անցնում է %1$s ցանցի: Կարող են վճարներ գանձվել:" + "%1$s ցանցից անցել է %2$s ցանցի" + + "բջջային տվյալներ" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "ցանցի անհայտ տեսակ" "Չհաջողվեց միանալ Wi-Fi-ին" " ունի թույլ ինտերնետ կապ:" "Թույլատրե՞լ կապը:" @@ -1153,7 +1165,6 @@ "Հպեք՝ լեզուն և դասավորությունն ընտրելու համար" " ԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏՐՑՈՒՓՔԵւՕՖ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "թեկնածուները" "%s-ի նախապատրաստում" "Սխալների ստուգում" "Հայտնաբերվել է նոր %s" @@ -1232,8 +1243,9 @@ "Կապակացված է %s-ին: Սեղմեք` ցանցը կառավարելու համար:" "Միշտ-միացված VPN-ը կապվում է..." "Միշտ-առցանց VPN-ը կապակցված է" + "«Միշտ միացված VPN»-ն անջատված է" "VPN սխալը միշտ միացված" - "Հպեք՝ կազմաձևելու համար" + "Հպեք՝ կարգավորելու համար" "Ընտրել ֆայլը" "Ոչ մի ֆայլ չի ընտրված" "Վերակայել" @@ -1317,7 +1329,7 @@ "USB սարքավար %s-ից" "USB կրիչ" "Խմբագրել" - "Տվյալների օգտագործման նախազգուշացում" + "Տվյալների օգտագործման զգուշացում" "Հպեք և տեսեք օգտագործումը և կարգավորումները:" "2G-3G տվյալների սահմանաչափը սպառվել է" "4G տվյալների սահմանաչափը սպառվել է" @@ -1636,6 +1648,7 @@ "Մուտքագրեք լեզուն" "Առաջարկներ" "Բոլոր լեզուները" + "Բոլոր տարածաշրջանները" "Որոնում" "Աշխատանքային ռեժիմն ԱՆՋԱՏՎԱԾ Է" "Միացնել աշխատանքային պրոֆիլը՝ հավելվածները, ֆոնային համաժամեցումը և առնչվող գործառույթները" diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 132789b01598bc455bd24e987713ae89e73730bd..fefca0ccd58b66cc4fa5469cbe757b06a1a0206f 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -116,7 +116,7 @@ "Roaming - Sistem Yang Dipilih" "Roaming - Sistem Tersedia" "Mitra Roaming - Alliance" - "Roaming - Mitra Premium" + "Roaming - Partner Premium" "Fungsionalitas Layanan Roaming - Penuh" "Fungsionalitas Layanan Roaming - Sebagian" "Spanduk Roaming Hidup" @@ -214,6 +214,7 @@ "Opsi telepon" "Kunci layar" "Matikan daya" + "Darurat" "Laporan bug" "Ambil laporan bug" "Ini akan mengumpulkan informasi status perangkat Anda saat ini, untuk dikirimkan sebagai pesan email. Harap bersabar, mungkin perlu waktu untuk memulai laporan bug hingga siap dikirim." @@ -253,7 +254,7 @@ "Penyimpanan" "mengakses foto, media, dan file di perangkat" "Mikrofon" - "rekam audio" + "merekam audio" "Kamera" "mengambil gambar dan merekam video" "Telepon" @@ -1076,6 +1077,17 @@ "Wi-Fi tidak memiliki akses internet" "Ketuk untuk melihat opsi" + "Dialihkan ke %1$s" + "Perangkat menggunakan %1$s jika %2$s tidak memiliki akses internet. Tarif mungkin berlaku." + "Dialihkan dari %1$s ke %2$s" + + "data seluler" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "jenis jaringan yang tidak dikenal" "Tidak dapat tersambung ke Wi-Fi" " memiliki sambungan internet yang buruk." "Izinkan hubungan?" @@ -1153,7 +1165,6 @@ "Ketuk untuk memilih bahasa dan tata letak" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "calon" "Menyiapkan %s" "Memeriksa kesalahan" "%s baru terdeteksi" @@ -1232,8 +1243,9 @@ "Tersambung ke %s. Ketuk untuk mengelola jaringan." "Menyambungkan VPN selalu aktif..." "VPN selalu aktif tersambung" + "VPN selalu aktif terputus" "Kesalahan VPN selalu aktif" - "Ketuk untuk mengonfigurasi" + "Ketuk untuk menyiapkan" "Pilih file" "Tidak ada file yang dipilih" "Setel ulang" @@ -1317,7 +1329,7 @@ "Drive USB %s" "Penyimpanan USB" "Edit" - "Peringatan penggunaan data" + "Lansiran penggunaan data" "Ketuk untuk lihat penggunaan & setelan." "Batas data 2G-3G terlampaui" "Batas data 4G terlampaui" @@ -1636,6 +1648,7 @@ "Ketik nama bahasa" "Disarankan" "Semua bahasa" + "Semua wilayah" "Telusuri" "Mode kerja NONAKTIF" "Izinkan profil kerja berfungsi, termasuk aplikasi, sinkronisasi latar belakang, dan fitur terkait." diff --git a/core/res/res/values-is-rIS/strings.xml b/core/res/res/values-is-rIS/strings.xml index a897ba87cc273731f10386068502efd1ebb44e91..cdc6d4228a9ed18225027cea9a8dd437af66510a 100644 --- a/core/res/res/values-is-rIS/strings.xml +++ b/core/res/res/values-is-rIS/strings.xml @@ -214,6 +214,7 @@ "Valkostir síma" "Skjálás" "Slökkva" + "Neyðarsímtal" "Villutilkynning" "Útbúa villutilkynningu" "Þetta safnar upplýsingum um núverandi stöðu tækisins til að senda með tölvupósti. Það tekur smástund frá því villutilkynningin er ræst og þar til hún er tilbúin til sendingar – sýndu biðlund." @@ -1076,6 +1077,17 @@ "Wi-Fi netið er ekki með tengingu við internetið" "Ýttu til að sjá valkosti" + "Skipt yfir á %1$s" + "Tækið notar %1$s þegar %2$s er ekki með internetaðgang. Gjöld geta átt við." + "Skipt úr %1$s yfir í %2$s" + + "farsímagögn" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "óþekkt tegund netkerfis" "Ekki var hægt að tengjast Wi-Fi" " er með lélegt netsamband." "Leyfa tengingu?" @@ -1153,7 +1165,6 @@ "Ýttu til að velja tungumál og útlit" " AÁBCDÐEÉFGHIÍJKLMNOÓPQRSTUÚVWXYÝZÞÆÖ" " 0123456789AÁBCDÐEÉFGHIÍJKLMNOÓPQRSTUÚVWXYÝZÞÆÖ" - "möguleikar" "Undirbýr %s" "Leitar að villum" "Nýtt %s fannst" @@ -1232,8 +1243,9 @@ "Tengt við %s. Ýttu til að hafa umsjón með netinu." "Sívirkt VPN tengist…" "Sívirkt VPN tengt" + "Sívirkt VPN aftengt" "Villa í sívirku VPN" - "Ýttu til að stilla" + "Ýttu til að setja upp" "Velja skrá" "Engin skrá valin" "Endurstilla" @@ -1317,7 +1329,7 @@ "USB-drif frá %s" "USB-geymsla" "Breyta" - "Viðvörun vegna gagnanotkunar" + "Viðvörun um gagnanotkun" "Ýttu fyrir uppl. og stillingar" "Gagnahámarki 2G og 3G náð" "Gagnahámarki 4G náð" @@ -1636,6 +1648,7 @@ "Sláðu inn heiti tungumáls" "Tillögur" "Öll tungumál" + "Öll svæði" "Leita" "Slökkt á vinnusniði" "Leyfa virkni vinnusniðs, m.a. forrita, samstillingar í bakgrunni og tengdra eiginleika." diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 9cd74dc808e8d71f2d3f050feb178b3215f9a7ad..b82470fe2254cbc749a4c3cb27ebe90b9e128737 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -214,6 +214,7 @@ "Opzioni telefono" "Blocco schermo" "Spegni" + "Emergenza" "Segnalazione di bug" "Apri segnalazione bug" "Verranno raccolte informazioni sullo stato corrente del dispositivo che saranno inviate sotto forma di messaggio email. Passerà un po\' di tempo prima che la segnalazione di bug aperta sia pronta per essere inviata; ti preghiamo di avere pazienza." @@ -1076,6 +1077,17 @@ "Connessione Wi-Fi priva di accesso Internet" "Tocca per le opzioni" + "Passato a %1$s" + "Il dispositivo utilizza %1$s quando %2$s non ha accesso a Internet. Potrebbero essere applicati costi." + "Passato da %1$s a %2$s" + + "rete dati" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "tipo di rete sconosciuto" "Impossibile connettersi alla rete Wi-Fi" " ha una connessione Internet debole." "Consentire la connessione?" @@ -1153,7 +1165,6 @@ "Tocca per selezionare la lingua e il layout" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "candidati" "Preparazione della %s" "Ricerca errori" "Nuova %s rilevata" @@ -1232,8 +1243,9 @@ "Collegata a %s. Tocca per gestire la rete." "Connessione a VPN sempre attiva…" "VPN sempre attiva connessa" + "VPN sempre attiva disconnessa" "Errore VPN sempre attiva" - "Tocca per configurare" + "Tocca per configurare" "Scegli file" "Nessun file è stato scelto" "Reimposta" @@ -1317,7 +1329,7 @@ "Unità USB %s" "Archivio USB" "Modifica" - "Avviso sull\'utilizzo dei dati" + "Avviso sull\'utilizzo dei dati" "Tocca per uso e impostazioni." "Limite di dati 2G-3G raggiunto" "Limite di dati 4G raggiunto" @@ -1636,6 +1648,7 @@ "Digita nome lingua" "Suggerite" "Tutte le lingue" + "Tutte le aree geografiche" "Cerca" "Modalità Lavoro DISATTIVATA" "Attiva il profilo di lavoro, incluse app, sincronizzazione in background e funzioni correlate." diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index bebe027cb67f0894a3d594a875d99a833c1ab403..36c52057f38a61f8a70fe84961a9fba681163b54 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -218,6 +218,7 @@ "אפשרויות טלפון" "נעילת מסך" "כיבוי" + "חירום" "דיווח על באג" "שלח דיווח על באג" "פעולה זו תאסוף מידע על מצב המכשיר הנוכחי שלך על מנת לשלוח אותו כהודעת אימייל. היא תימשך זמן קצר מרגע פתיחת דיווח הבאג ועד לשליחת ההודעה בפועל. אנא המתן בסבלנות." @@ -1126,6 +1127,17 @@ "‏אין ל-Wi-Fi גישה לאינטרנט" "הקש לקבלת אפשרויות" + "מעבר אל %1$s" + "המכשיר משתמש ברשת %1$s כשלרשת %2$s אין גישה לאינטרנט. עשויים לחול חיובים." + "עבר מרשת %1$s לרשת %2$s" + + "נתונים סלולריים" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "סוג רשת לא מזוהה" "‏אין אפשרות להתחבר ל-Wi-Fi" " אינו מחובר היטב לאינטרנט." "האם להתיר את החיבור?" @@ -1203,7 +1215,6 @@ "הקש כדי לבחור שפה ופריסה" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "מועמדים" "הכנת %s" "בודק אם יש שגיאות" "זוהה %s חדש" @@ -1282,8 +1293,9 @@ "מחובר אל %s. הקש כדי לנהל את הרשת." "‏ה-VPN שמופעל תמיד, מתחבר..." "‏ה-VPN שפועל תמיד, מחובר" + "‏חיבור תמידי ל-VPN מנותק" "‏שגיאת VPN שמופעל תמיד" - "הקש כדי להגדיר" + "הקש כדי להגדיר" "בחר קובץ" "לא נבחר קובץ" "איפוס" @@ -1362,14 +1374,14 @@ "אפשרויות נוספות" "‏%1$s‏, %2$s" "‏%1$s‏, %2$s‏, %3$s" - "אחסון משותף פנימי" + "אחסון שיתוף פנימי" "‏כרטיס SD" "‏כרטיס SD של %s" "‏כונן USB" "‏כונן USB של %s" "‏אחסון USB" "ערוך" - "אזהרת שימוש בנתונים" + "התראה לשימוש בנתונים" "הקש כדי להציג נתוני שימוש והגדרות." "‏הגעת למגבלת הנתונים של 2G-3G" "‏הגעת למגבלת הנתונים של 4G" @@ -1708,6 +1720,7 @@ "הקלד שם שפה" "הצעות" "כל השפות" + "כל האזורים" "חיפוש" "מצב העבודה כבוי" "אפשר לפרופיל העבודה לפעול, כולל אפליקציות, סנכרון ברקע ותכונות קשורות." diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index b2a7bd27f243795171dd845909106e01dfadcc38..5550900543e40f023f1675551724ce78dd3ad378 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -214,6 +214,7 @@ "携帯電話オプション" "画面ロック" "電源を切る" + "緊急通報" "バグレポート" "バグレポートを取得" "現在の端末の状態に関する情報が収集され、その内容がメールで送信されます。バグレポートが開始してから送信可能な状態となるまでには多少の時間がかかりますのでご了承ください。" @@ -374,7 +375,7 @@ "電話番号への自動発信をアプリに許可します。これにより、予期せぬ発信や料金が発生する可能性があります。なお、緊急通報番号への発信は許可されません。悪意のあるアプリが確認なしで発信し、料金が発生する恐れがあります。" "IMS通話サービスへのアクセス" "IMSサービスがユーザー操作なしで電話をかけることをアプリに許可します。" - "端末のステータスとIDの読み取り" + "端末情報と ID の読み取り" "端末の電話機能へのアクセスをアプリに許可します。これにより、電話番号、端末ID、通話中かどうか、通話相手の電話番号をアプリから特定できるようになります。" "タブレットのスリープを無効化" "テレビのスリープを無効化" @@ -511,8 +512,8 @@ "携帯通信会社のSMSサービスのトップレベルインターフェースにバインドすることを所有者に許可します。通常のアプリでは不要です。" "携帯通信会社のサービスへのバインド" "携帯通信会社のサービスにバインドすることを所有者に許可します。通常のアプリでは不要です。" - "[通知を非表示]へのアクセス" - "[通知を非表示]の設定の読み取りと書き込みをアプリに許可します。" + "マナーモードへのアクセス" + "マナーモード設定の読み取りと書き込みをアプリに許可します。" "パスワードルールの設定" "画面ロックのパスワードとPINの長さと使用できる文字を制御します。" "画面ロック解除試行の監視" @@ -1076,6 +1077,17 @@ "Wi-Fiはインターネットに接続していません" "タップしてその他のオプションを表示" + "「%1$s」に切り替えました" + "端末で「%2$s」によるインターネット接続ができない場合に「%1$s」を使用します。通信料が発生することがあります。" + "「%1$s」から「%2$s」に切り替えました" + + "モバイルデータ" + "Wi-Fi" + "Bluetooth" + "イーサネット" + "VPN" + + "不明なネットワーク タイプ" "Wi-Fiに接続できませんでした" " はインターネット接続に問題があります。" "接続を許可しますか?" @@ -1153,7 +1165,6 @@ "タップして言語とレイアウトを選択してください" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "候補" "%sを準備中" "エラーを確認中" "新しい%sが検出されました" @@ -1232,8 +1243,9 @@ "%sに接続しました。ネットワークを管理するにはタップしてください。" "VPNに常時接続しています…" "VPNに常時接続しました" + "常時接続 VPN の接続を解除しました" "常時接続VPNのエラー" - "タップして設定" + "設定するにはタップします" "ファイルを選択" "ファイルが選択されていません" "リセット" @@ -1317,7 +1329,7 @@ "%s製USBドライブ" "USBストレージ" "編集" - "データ使用の警告" + "データ使用量に関する通知" "タップして使用状況と設定を表示します。" "2G~3Gデータの上限に達しました" "4Gデータの上限に達しました" @@ -1595,10 +1607,10 @@ "%1$sまで" "%1$s(次のアラーム)まで" "ユーザーがOFFにするまで" - "[通知を非表示]をOFFにするまで" + "マナーモードを OFF にするまで" "%1$s/%2$s" "折りたたむ" - "通知を非表示" + "マナーモード" "ダウンタイム" "平日の夜" "週末" @@ -1636,6 +1648,7 @@ "言語名を入力" "言語の候補" "すべての言語" + "すべての地域" "検索" "Work モード OFF" "仕事用プロファイルで、アプリ、バックグラウンド同期などの関連機能の使用を許可します。" diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml index 0295ea50a8be4ad5e2f6c786968e14de2d1c9a5a..a8fed8b577b599c647ab4067dc205af9b948cec5 100644 --- a/core/res/res/values-ka-rGE/strings.xml +++ b/core/res/res/values-ka-rGE/strings.xml @@ -214,6 +214,7 @@ "ტელეფონის პარამეტრები" "ეკრანის დაბლოკვა" "კვების გამორთვა" + "საგანგებო სამსახურები" "ხარვეზის შესახებ ანგარიში" "შექმენით შეცდომის ანგარიში" "იგი შეაგროვებს ინფორმაციას თქვენი მოწყობილობის ამჟამინდელი მდგომარეობის შესახებ, რათა ის ელფოსტის შეტყობინების სახით გააგზავნოს. ხარვეზის ანგარიშის მომზადებასა და შეტყობინების გაგზავნას გარკვეული დრო სჭირდება. გთხოვთ, მოითმინოთ." @@ -1076,6 +1077,17 @@ "Wi-Fi-ს არ აქვს ინტერნეტზე წვდომა" "შეეხეთ ვარიანტების სანახავად" + "ახლა გამოიყენება %1$s" + "თუ %2$s ინტერნეტთან კავშირს დაკარგავს, მოწყობილობის მიერ %1$s იქნება გამოყენებული, რამაც შეიძლება დამატებითი ხარჯები გამოიწვიოს" + "ახლა გამოიყენება %1$s (გამოიყენებოდა %2$s)" + + "მობილური ინტერნეტი" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "უცნობი ტიპის ქსელი" "Wi-Fi-თან დაკავშირება ვერ მოხერხდა" " აქვს ცუდი ინტერნეტ კავშირი." "გსურთ კავშირის დაშვება?" @@ -1153,7 +1165,6 @@ "შეეხეთ ენისა და განლაგების ასარჩევად" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "კანდიდატები" "%s-ის მომზადება" "შეცდომების შემოწმება" "აღმოჩენილია ახალი %s" @@ -1232,8 +1243,9 @@ "მიერთებულია %s-ზე. შეეხეთ ქსელის სამართავად." "მიმდინარეობს მუდმივად ჩართული VPN-ის მიერთება…" "მუდმივად ჩართული VPN-ის მიერთებულია" + "მუდმივად ჩართული VPN გათიშულია" "შეცდომა მუდამ VPN-ზე" - "შეეხეთ პარამეტრების კონფიგურაციისთვის" + "შეეხეთ დასაყენებლად" "ფაილის არჩევა" "ფაილი არჩეული არ არის" "საწყისზე დაბრუნება" @@ -1317,7 +1329,7 @@ "%s USB დისკი" "USB მეხსიერება" "რედაქტირება" - "ინტერნეტის გამოყენების გაფრთხილება" + "მონაცემთა მოხმარების გაფრთხილება" "შეეხეთ მოხმარებისა და პარამეტრების სანახავად." "2G-3G მონაცემთა ლიმიტი ამოიწურა" "4G მონაცემთა ლიმიტი ამოიწურა" @@ -1636,6 +1648,7 @@ "აკრიფეთ ენის სახელი" "რეკომენდებული" "ყველა ენა" + "ყველა რეგიონი" "ძიება" "სამსახურის რეჟიმი გამორთულია" "სამსახურის პროფილის მუშაობის დაშვება, მათ შორის, აპების, ფონური სინქრონიზაციის და დაკავშირებული ფუნქციების." diff --git a/core/res/res/values-kk-rKZ/strings.xml b/core/res/res/values-kk-rKZ/strings.xml index b5931c1a1ea11a50565b659aa445666e49824d0c..00264ad8969a0fc166bd06e59468abb1feaf0900 100644 --- a/core/res/res/values-kk-rKZ/strings.xml +++ b/core/res/res/values-kk-rKZ/strings.xml @@ -214,6 +214,7 @@ "Телефон опциялары" "Экранды құлыптау" "Өшіру" + "Төтенше жағдай" "Вирус туралы хабарлау" "Қате туралы есеп құру" "Құрылғының қазіргі күйі туралы ақпаратты жинап, электрондық хабармен жібереді. Есеп әзір болғанша біраз уақыт кетеді, шыдай тұрыңыз." @@ -1076,6 +1077,17 @@ "Wi-Fi желісінде интернет байланысы жоқ" "Опциялар үшін түртіңіз" + "%1$s желісіне ауысты" + "Құрылғы %2$s желісінде интернетпен байланыс жоғалған жағдайда %1$s желісін пайдаланады. Деректер ақысы алынуы мүмкін." + "%1$s желісінен %2$s желісіне ауысты" + + "ұялы дерек" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "желі түрі белгісіз" "Wi-Fi желісіне қосыла алмады" " Интернет байланысы нашар." "Қосылуға рұқсат ету керек пе?" @@ -1153,7 +1165,6 @@ "Тіл мен пернетақта схемасын таңдау үшін түртіңіз" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "үміткерлер" "%s дайындалуда" "Қателер тексерілуде" "Жаңа %s анықталды" @@ -1232,8 +1243,9 @@ "%s жүйесіне жалғанған. Желіні басқару үшін түріңіз." "Әрқашан қосылған ВЖЖ жалғануда…" "Әрқашан қосылған ВЖЖ жалғанған" + "Әрқашан қосулы VPN желісі ажыратылды" "Әрқашан қосылған ВЖЖ қателігі" - "Конфигурациялау үшін түртіңіз" + "Реттеу үшін түртіңіз" "Файлды таңдау" "Ешқандай файл таңдалмаған" "Қайта реттеу" @@ -1317,7 +1329,7 @@ "%s USB дискі" "USB жады" "Өзгерту" - "Дерекқор қолдануға қатысты ескерту" + "Деректер трафигі туралы ескерту" "Трафик пен параметрлерді көру үшін түртіңіз." "2G-3G деректер шегіне жеттіңіз" "4G деректер шегіне жеттіңіз" @@ -1636,6 +1648,7 @@ "Тіл атауын теріңіз" "Ұсынылған" "Барлық тілдер" + "Барлық аймақтар" "Іздеу" "Жұмыс режимі ӨШІРУЛІ" "Жұмыс профиліне, соның ішінде, қолданбаларға, фондық синхрондауға және қатысты мүмкіндіктерге жұмыс істеуге рұқсат ету." diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml index 71f8cbabd8800c8619efdfa694bd1ca4c13f0855..feaef821e5350c1fdf95917a58f96bc684b89c5f 100644 --- a/core/res/res/values-km-rKH/strings.xml +++ b/core/res/res/values-km-rKH/strings.xml @@ -214,6 +214,7 @@ "ជម្រើស​ទូរស័ព្ទ" "ចាក់​សោ​អេក្រង់" "បិទ" + "អាសន្ន" "របាយការណ៍​កំហុស" "យក​របាយការណ៍​កំហុស" "វា​នឹង​​ប្រមូល​ព័ត៌មាន​អំពី​ស្ថានភាព​ឧបករណ៍​របស់​អ្នក ដើម្បី​ផ្ញើ​ជា​សារ​អ៊ីមែល។ វា​នឹង​ចំណាយ​ពេល​តិច​ពី​ពេល​ចាប់ផ្ដើម​របាយការណ៍​រហូត​ដល់​ពេល​វា​រួចរាល់​ដើម្បី​ផ្ញើ សូម​អត់ធ្មត់។" @@ -1078,6 +1079,17 @@ "Wi-Fi មិនមានអ៊ិនធឺណិតនោះទេ" "ប៉ះសម្រាប់ជម្រើស" + "បានប្តូរទៅ %1$s" + "ឧបករណ៍ប្រើ %1$s នៅពេលដែល %2$s គ្មានការតភ្ជាប់អ៊ីនធឺណិត។ អាចគិតប្រាក់លើការប្រើប្រាស់ទិន្នន័យ។" + "បានប្តូរពី %1$s ទៅ %2$s" + + "ទិន្នន័យចល័ត" + "Wi-Fi" + "ប៊្លូធូស" + "អ៊ីសឺរណិត" + "VPN" + + "ប្រភេទបណ្តាញមិនស្គាល់" "មិន​​អាច​តភ្ជាប់​វ៉ាយហ្វាយ" " មាន​ការ​តភ្ជាប់​អ៊ីនធឺណិត​មិន​ល្អ។" "អនុញ្ញាត​ភ្ជាប់?" @@ -1155,7 +1167,6 @@ "ប៉ះដើម្បីជ្រើសភាសា និងប្លង់" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "បេក្ខជន" "កំពុងរៀបចំ %s" "កំពុងពិនិត្យរកកំហុស" "បានរកឃើញ %s ថ្មី" @@ -1234,8 +1245,9 @@ "បាន​ភ្ជាប់​ទៅ %s ។ ប៉ះ ដើម្បី​គ្រប់គ្រង​បណ្ដាញ។" "បើក​ការ​តភ្ជាប់ VPN ជា​និច្ច..។" "ភ្ជាប់ VPN ជា​និច្ច" + "បានផ្តាច់ VPN ដែលបើកជានិច្ច" "បើក​កំហុស VPN ជា​និច្ច" - "ប៉ះដើម្បីកំណត់រចនាសម្ព័ន្ធ" + "ប៉ះដើម្បីដំឡើង" "ជ្រើស​​ឯកសារ" "គ្មាន​ឯកសារ​បាន​ជ្រើស" "កំណត់​ឡើងវិញ" @@ -1319,7 +1331,7 @@ "ឧបករណ៍ផ្ទុក USB %s" "ឧបករណ៍​ផ្ទុក​យូអេសប៊ី" "កែសម្រួល​" - "ការព្រមាន​ប្រើ​ទិន្នន័យ" + "ការព្រមានអំពីការប្រើទិន្នន័យ" "ប៉ះដើម្បីមើលការប្រើប្រាស់ និងការកំណត់" "បាន​ដល់​ដែន​កំណត់​ទិន្នន័យ 2G-3G" "បាន​ដល់​ដែន​កំណត់​ទិន្នន័យ 4G" @@ -1638,6 +1650,7 @@ "វាយបញ្ចូលឈ្មោះភាសា" "បាន​ស្នើ" "ភាសាទាំងអស់" + "តំបន់ទាំងអស់" "ស្វែងរក" "របៀបការងារបានបិទ" "អនុញ្ញាតឲ្យប្រវត្តិរូបការងារដំណើរការ ដោយរាប់បញ្ចូលទាំងកម្មវិធី ការធ្វើសមកាលកម្មផ្ទៃខាងក្រោយ និងលក្ខណៈពិសេសដែលពាក់ព័ន្ធ។" diff --git a/core/res/res/values-kn-rIN/strings.xml b/core/res/res/values-kn-rIN/strings.xml index 770af199d113cb3c94cfc3fcec97c5e1fbd344d6..7cb97a7c56b78b54bd489df6fc2ff449ca74c2b5 100644 --- a/core/res/res/values-kn-rIN/strings.xml +++ b/core/res/res/values-kn-rIN/strings.xml @@ -172,7 +172,7 @@ ಪ್ರಮಾಣಪತ್ರ ಅಂಗೀಕಾರಗಳನ್ನು ಸ್ಥಾಪಿಸಲಾಗಿದೆ ಪ್ರಮಾಣಪತ್ರ ಅಂಗೀಕಾರಗಳನ್ನು ಸ್ಥಾಪಿಸಲಾಗಿದೆ - "ಅಜ್ಞಾತ ಥರ್ಡ್ ಪಾರ್ಟಿಯ ಪ್ರಕಾರ" + "ಅಪರಿಚಿತ ಥರ್ಡ್ ಪಾರ್ಟಿಯ ಪ್ರಕಾರ" "ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ನಿರ್ವಾಹಕರಿಂದ" "%s ಪ್ರಕಾರ" "ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಅನ್ನು ಅಳಿಸಲಾಗಿದೆ" @@ -214,6 +214,7 @@ "ಫೋನ್ ಆಯ್ಕೆಗಳು" "ಸ್ಕ್ರೀನ್ ಲಾಕ್" "ಪವರ್ ಆಫ್ ಮಾಡು" + "ತುರ್ತು" "ದೋಷದ ವರದಿ" "ದೋಷ ವರದಿ ರಚಿಸಿ" "ನಿಮ್ಮ ಸಾಧನದ ಪ್ರಸ್ತುತ ಸ್ಥಿತಿಯ ಕುರಿತು ಮಾಹಿತಿಯನ್ನು ಸಂಗ್ರಹಿಸಿಕೊಳ್ಳುವುದರ ಜೊತೆ ಇ-ಮೇಲ್ ರೂಪದಲ್ಲಿ ನಿಮಗೆ ರವಾನಿಸುತ್ತದೆ. ಇದು ದೋಷ ವರದಿಯನ್ನು ಪ್ರಾರಂಭಿಸಿದ ಸಮಯದಿಂದ ಅದನ್ನು ಕಳುಹಿಸುವವರೆಗೆ ಸ್ವಲ್ಪ ಸಮಯವನ್ನು ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ; ದಯವಿಟ್ಟು ತಾಳ್ಮೆಯಿಂದಿರಿ." @@ -814,9 +815,9 @@ "space" "enter" "ಅಳಿಸು" - "ಹುಡುಕು" + "ಹುಡುಕಿ" "ಹುಡುಕಿ…" - "ಹುಡುಕು" + "ಹುಡುಕಿ" "ಪ್ರಶ್ನೆಯನ್ನು ಹುಡುಕಿ" "ಪ್ರಶ್ನೆಯನ್ನು ತೆರವುಗೊಳಿಸು" "ಪ್ರಶ್ನೆಯನ್ನು ಸಲ್ಲಿಸು" @@ -979,8 +980,8 @@ "ಇದನ್ನು ಬಳಸಿಕೊಂಡು ಕಳುಹಿಸಿ" "%1$s ಬಳಸಿಕೊಂಡು ಕಳುಹಿಸಿ" "ಕಳುಹಿಸು" - "ಹೋಮ್‌ ಅಪ್ಲಿಕೇಶನ್‌ ಆಯ್ಕೆಮಾಡಿ" - "ಹೋಮ್‌ ಎಂಬಂತೆ %1$s ಅನ್ನು ಬಳಸಿ" + "ಮುಖಪುಟ‌ ಅಪ್ಲಿಕೇಶನ್‌ ಆಯ್ಕೆಮಾಡಿ" + "ಮುಖಪುಟ‌ ಎಂಬಂತೆ %1$s ಅನ್ನು ಬಳಸಿ" "ಚಿತ್ರ ಕ್ಯಾಪ್ಚರ್ ಮಾಡಿ" "ಇದರ ಜೊತೆಗೆ ಚಿತ್ರ ಕ್ಯಾಪ್ಚರ್ ಮಾಡಿ" "%1$s ಜೊತೆ ಚಿತ್ರ ಕ್ಯಾಪ್ಚರ್ ಮಾಡಿ" @@ -1061,7 +1062,7 @@ "ಡಿಫಾಲ್ಟ್ ರಿಂಗ್‌ಟೋನ್ (%1$s)" "ಯಾವುದೂ ಇಲ್ಲ" "ರಿಂಗ್‌ಟೋನ್‌ಗಳು" - "ಅಜ್ಞಾತ ರಿಂಗ್‌ಟೋನ್" + "ಅಪರಿಚಿತ ರಿಂಗ್‌ಟೋನ್" ವೈ-ಫೈ ನೆಟ್‌ವರ್ಕ್‌ಗಳು ಲಭ್ಯವಿವೆ ವೈ-ಫೈ ನೆಟ್‌ವರ್ಕ್‌ಗಳು ಲಭ್ಯವಿವೆ @@ -1076,6 +1077,17 @@ "ವೈ-ಫೈ ಯಾವುದೇ ಇಂಟರ್ನೆಟ್ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿಲ್ಲ" "ಆಯ್ಕೆಗಳಿಗೆ ಟ್ಯಾಪ್ ಮಾಡಿ" + "%1$s ಗೆ ಬದಲಾಯಿಸಲಾಗಿದೆ" + "%2$s ಇಂಟರ್ನೆಟ್ ಪ್ರವೇಶ ಹೊಂದಿಲ್ಲದಿರುವಾಗ, ಸಾಧನವು %1$s ಬಳಸುತ್ತದೆ. ಶುಲ್ಕಗಳು ಅನ್ವಯವಾಗಬಹುದು." + "%1$s ರಿಂದ %2$s ಗೆ ಬದಲಾಯಿಸಲಾಗಿದೆ" + + "ಸೆಲ್ಯುಲರ್ ಡೇಟಾ" + "ವೈ-ಫೈ" + "ಬ್ಲೂಟೂತ್‌" + "ಇಥರ್ನೆಟ್" + "VPN" + + "ಅಪರಿಚಿತ ನೆಟ್‌ವರ್ಕ್ ಪ್ರಕಾರ" "ವೈ-ಫೈ ಗೆ ಸಂಪರ್ಕಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ" " ಕಳಪೆ ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕವನ್ನು ಹೊಂದಿದೆ." "ಸಂಪರ್ಕವನ್ನು ಅನುಮತಿಸುವುದೇ?" @@ -1153,7 +1165,6 @@ "ಭಾಷೆ ಮತ್ತು ವಿನ್ಯಾಸವನ್ನು ಆಯ್ಕೆ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "ಅಭ್ಯರ್ಥಿಗಳು" "%s ಅನ್ನು ಸಿದ್ಧಪಡಿಸಲಾಗುತ್ತಿದೆ" "ದೋಷಗಳನ್ನು ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ" "ಹೊಸ %s ಪತ್ತೆಯಾಗಿದೆ" @@ -1200,7 +1211,7 @@ "ಝೂಮ್‌ ನಿಯಂತ್ರಿಸಲು ಎರಡು ಬಾರಿ ಟ್ಯಾಪ್ ಮಾಡಿ" "ವಿಜೆಟ್ ಸೇರಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ." "ಹೋಗು" - "ಹುಡುಕು" + "ಹುಡುಕಿ" "ಕಳುಹಿಸು" "ಮುಂದೆ" "ಮುಗಿದಿದೆ" @@ -1232,8 +1243,9 @@ "%s ಗೆ ಸಂಪರ್ಕಗೊಂಡಿದೆ. ನೆಟ್‍ವರ್ಕ್ ನಿರ್ವಹಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ." "ಯಾವಾಗಲೂ-ಆನ್ VPN ಸಂಪರ್ಕಗೊಳ್ಳುತ್ತಿದೆ…" "ಯಾವಾಗಲೂ-ಆನ್ VPN ಸಂಪರ್ಕಗೊಂಡಿದೆ" + "ಯಾವಾಗಲೂ-ಆನ್ VPN ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗಿದೆ" "ಯಾವಾಗಲೂ-ಆನ್ VPN ದೋಷ" - "ಕಾನ್ಫಿಗರ್ ಮಾಡಲು ಟ್ಯಾಪ್‌ ಮಾಡಿ" + "ಹೊಂದಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ" "ಫೈಲ್ ಆಯ್ಕೆಮಾಡು" "ಯಾವುದೇ ಫೈಲ್ ಆಯ್ಕೆ ಮಾಡಿಲ್ಲ" "ಮರುಹೊಂದಿಸು" @@ -1257,8 +1269,8 @@ "ಹಂಚು" "ಹುಡುಕಿ" "ವೆಬ್ ಹುಡುಕಾಟ" - "ಮುಂದಿನದನ್ನು ಹುಡುಕು" - "ಹಿಂದಿನದನ್ನು ಹುಡುಕು" + "ಮುಂದಿನದನ್ನು ಹುಡುಕಿ" + "ಹಿಂದಿನದನ್ನು ಹುಡುಕಿ" "%s ಅವರಿಂದ ಸ್ಥಾನ ವಿನಂತಿ" "ಸ್ಥಾನ ವಿನಂತಿ" "%1$s (%2$s) ಅವರಿಂದ ವಿನಂತಿಸಲಾಗಿದೆ" @@ -1317,7 +1329,7 @@ "%s USB ಡ್ರೈವ್" "USB ಸಂಗ್ರಹಣೆ" "ಎಡಿಟ್" - "ಡೇಟಾ ಬಳಕೆಯ ಎಚ್ಚರಿಕೆ" + "ಡೇಟಾ ಬಳಕೆ ಎಚ್ಚರಿಕೆ" "ಬಳಕೆ ಮತ್ತು ಸೆಟ್ಟಿಂಗ್‍ಗಳನ್ನು ವೀಕ್ಷಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ." "2G-3G ಡೇಟಾ ಮೀತಿಯನ್ನು ತಲುಪಿದೆ" "4G ಡೇಟಾ ಮೀತಿಯನ್ನು ತಲುಪಿದೆ" @@ -1512,11 +1524,11 @@ "Kahu" "Kaku2" "You4" - "ಅಜ್ಞಾತ ಪೋಟ್ರೇಟ್" - "ಅಜ್ಞಾತ ಲ್ಯಾಂಡ್‌ಸ್ಕೇಪ್" + "ಅಪರಿಚಿತ ಪೋಟ್ರೇಟ್" + "ಅಪರಿಚಿತ ಲ್ಯಾಂಡ್‌ಸ್ಕೇಪ್" "ರದ್ದುಮಾಡಲಾಗಿದೆ" "ವಿಷಯವನ್ನು ಬರೆಯುವಲ್ಲಿ ದೋಷ ಎದುರಾಗಿದೆ" - "ಅಜ್ಞಾತ" + "ಅಪರಿಚಿತ" "ಮುದ್ರಣ ಸೇವೆ ಸಕ್ರಿಯಗೊಂಡಿಲ್ಲ" "%s ಸೇವೆಯನ್ನು ಸ್ಥಾಪಿಸಲಾಗಿದೆ" "ಸಕ್ರಿಯಗೊಳಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ" @@ -1636,7 +1648,8 @@ "ಭಾಷೆ ಹೆಸರನ್ನು ಟೈಪ್ ಮಾಡಿ" "ಸೂಚಿತ ಭಾಷೆ" "ಎಲ್ಲಾ ಭಾಷೆಗಳು" - "ಹುಡುಕು" + "ಎಲ್ಲಾ ಪ್ರದೇಶಗಳು" + "ಹುಡುಕಿ" "ಕೆಲಸದ ಮೋಡ್ ಆಫ್ ಆಗಿದೆ" "ಅಪ್ಲಿಕೇಶನ್‌ಗಳು, ಹಿನ್ನೆಲೆ ಸಿಂಕ್ ಮತ್ತು ಇತರ ಸಂಬಂಧಿತ ವೈಶಿಷ್ಟ್ಯಗಳು ಸೇರಿದಂತೆ ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್‌‌ ಕಾರ್ಯನಿರ್ವಹಿಸಲು ಅನುಮತಿಸಿ." "ಆನ್ ಮಾಡು" diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 5b446b445a0ff28a943f7c3f63d5bb460d07c9f5..b23a96637c5784d28a1e0f9c5d25669ceb32d3f2 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -214,6 +214,7 @@ "휴대전화 옵션" "화면 잠금" "종료" + "긴급 전화" "버그 신고" "버그 신고" "현재 기기 상태에 대한 정보를 수집하여 이메일 메시지로 전송합니다. 버그 신고를 시작하여 전송할 준비가 되려면 약간 시간이 걸립니다." @@ -243,7 +244,7 @@ "개인으로 전환" "직장으로 전환" "주소록" - "주소록에 접근할 수 있도록" + "주소록에 액세스" "위치" "이 기기의 위치정보에 액세스" "캘린더" @@ -259,7 +260,7 @@ "전화" "통화 상태를 관리하거나 전화를 걸 수 있도록" "신체 센서" - "생체 신호에 관한 센서 데이터에 접근할 수 있도록" + "생체 신호에 관한 센서 데이터에 액세스" "창 콘텐츠 가져오기" "상호작용 중인 창의 콘텐츠를 검사합니다." "터치하여 탐색 사용" @@ -1076,6 +1077,17 @@ "Wi-Fi가 인터넷에 연결되어 있지 않습니다." "탭하여 옵션 보기" + "%1$s(으)로 전환" + "%2$s이(가) 인터넷에 연결되지 않는 경우 기기에서 %1$s을(를) 사용합니다. 요금이 부과될 수 있습니다." + "%1$s에서 %2$s(으)로 전환" + + "모바일 데이터" + "Wi-Fi" + "블루투스" + "이더넷" + "VPN" + + "알 수 없는 네트워크 유형" "Wi-Fi에 연결할 수 없습니다" " 인터넷 연결 상태가 좋지 않습니다." "연결을 허용하시겠습니까?" @@ -1153,7 +1165,6 @@ "탭하여 언어와 레이아웃을 선택하세요." " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "가능한 원인" "%s 준비 중" "오류 확인 중" "새로운 %s 감지됨" @@ -1232,8 +1243,9 @@ "%s에 연결되어 있습니다. 네트워크를 관리하려면 누르세요." "연결 유지 VPN에 연결하는 중…" "연결 유지 VPN에 연결됨" + "연결 유지 VPN 연결 해제됨" "연결 유지 VPN 오류" - "설정하려면 탭하세요." + "탭하여 설정" "파일 선택" "파일을 선택하지 않았습니다." "초기화" @@ -1310,14 +1322,14 @@ "옵션 더보기" "%1$s, %2$s" "%1$s, %2$s, %3$s" - "내부 공유 저장공간" + "내부 공유 저장용량" "SD 카드" "%s SD 카드" "USB 드라이브" "%s USB 드라이브" "USB 저장소" "수정" - "데이터 사용 경고" + "데이터 사용 알림" "사용량 및 설정을 보려면 탭하세요." "2G-3G 데이터 한도에 도달함" "4G 데이터 한도에 도달함" @@ -1636,6 +1648,7 @@ "언어 이름 입력" "추천" "모든 언어" + "모든 지역" "검색" "직장 모드가 사용 중지됨" "앱, 백그라운드 동기화 및 관련 기능을 포함한 직장 프로필이 작동하도록 허용" diff --git a/core/res/res/values-ky-rKG/strings.xml b/core/res/res/values-ky-rKG/strings.xml index 0f82dcbdffcfae61547ee4dd0693c27ab9aea537..4f48a944f79835d50c697184f1b60b2571f962a8 100644 --- a/core/res/res/values-ky-rKG/strings.xml +++ b/core/res/res/values-ky-rKG/strings.xml @@ -214,6 +214,7 @@ "Телефон мүмкүнчүлүктөрү" "Экран кулпусу" "Кубатын өчүрүү" + "Тез жардам" "Ката тууралуу билдирүү" "Ката тууралуу билдирүү түзүү" "Бул сиздин түзмөгүңүздүн учурдагы абалын эмейл билдирүүсү катары жөнөтүш максатында маалымат чогултат. Ката тууралуу билдирүү түзүлүп башталып, жөнөтүлгөнгө чейин бир аз убакыт керек болот; сураныч, бир аз күтө туруңуз." @@ -1076,6 +1077,17 @@ "Wi-Fi тармагы Интернетке туташпай турат" "Параметрлерди ачуу үчүн таптап коюңуз" + "%1$s тармагына которуштурулду" + "%2$s тармагы Интернетке туташпай турганда, түзмөгүңүз %1$s тармагын колдонот. Акы алынышы мүмкүн." + "%1$s дегенден %2$s тармагына которуштурулду" + + "мобилдик дайындар" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "белгисиз тармак түрү" "Wi-Fi менен туташуу түзүлбөдү" " хотспотунун интернет байланышы начар." "Туташууга уруксатпы?" @@ -1153,7 +1165,6 @@ "Тил жана калып тандоо үчүн таптап коюңуз" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "талапкерлер" "%s даярдалууда" "Каталар текшерилүүдө" "Жаңы %s аныкталды" @@ -1197,8 +1208,7 @@ "Колдонмого орнотуу сеанстарын окуу мүмкүнчүлүгүн берет. Ушуну менен, ал жигердүү топтом орнотууларынын чоо-жайын көрө алат." "орнотуу топтомдорун суроо" "Колдонмо топтомдорду орнотууга уруксат сурай алат." - - + "Масштабдын параметрлерин өзгөртүү үчүн бул жерди эки жолу басыңыз." "Виджетти кошуу мүмкүн болбоду." "Өтүү" "Издөө" @@ -1229,14 +1239,13 @@ "Эскертмелердин маанилүүлүгүн баалоо кызматы" "VPN иштетилди" "VPN %s аркылуу жандырылды" - - - - + "Тармактын параметрлерин өзгөртүү үчүн бул жерди басыңыз." + "%s сеансына туташуу ишке ашты. Желенин параметрлерин өзгөртүү үчүн бул жерди басыңыз." "Дайым иштеген VPN туташууда…" "Дайым иштеген VPN туташтырылды" + "Дайым иштеген VPN ажыратылды" "Дайым иштеген VPN\'де ката кетти" - "Конфигурациялоо үчүн таптап коюңуз" + "Жөндөө үчүн таптаңыз" "Файл тандоо" "Эч файл тандалган жок" "Баштапкы абалга келтирүү" @@ -1320,7 +1329,7 @@ "%s USB түзмөгү" "USB эстутуму" "Өзгөртүү" - "Дайындарды колдонуу боюнча эскрт" + "Дайындарды колдонууну чектөө" "Колдонулушун жана жөндөөлөрүн көрүү үчүн таптаңыз." "2G-3G дайындар чегине жетти" "4G дайындар чегине жетти" @@ -1639,6 +1648,7 @@ "Тилди киргизиңиз" "Сунушталган" "Бардык тилдер" + "Бардык аймактар" "Издөө" "Жумуш режими ӨЧҮРҮЛГӨН" "Жумуш профилин, ошондой эле колдонмолорду, фондо шайкештирүү жана ага байланыштуу функцияларды иштетиңиз." diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml index e2720c7f75dda1495803ba14ce6346e1a4eed0f1..18f285f96d8979244c0c384b6bb7c732e17099b5 100644 --- a/core/res/res/values-lo-rLA/strings.xml +++ b/core/res/res/values-lo-rLA/strings.xml @@ -214,6 +214,7 @@ "ໂຕເລືອກໂທລະສັບ" "ລັອກໜ້າຈໍ" "ປິດ" + "ສຸກເສີນ" "ລາຍງານຂໍ້ຜິດພາດ" "ໃຊ້ລາຍງານຂໍ້ບົກພ່ອງ" "ນີ້ຈະເປັນການເກັບກຳຂໍ້ມູນກ່ຽວກັບ ສະຖານະປັດຈຸບັນຂອງອຸປະກອນທ່ານ ເພື່ອສົ່ງເປັນຂໍ້ຄວາມທາງອີເມວ. ມັນຈະໃຊ້ເວລາໜ້ອຍນຶ່ງ ໃນການເລີ່ມຕົ້ນການລາຍງານຂໍ້ຜິດພາດ ຈົນກວ່າຈະພ້ອມທີ່ຈະສົ່ງໄດ້, ກະລຸນາລໍຖ້າ." @@ -1076,6 +1077,17 @@ "Wi-Fi ບໍ່ມີການເຂົ້າເຖິງອິນເຕີເນັດ" "ແຕະເພື່ອເບິ່ງຕົວເລືອກ" + "ສະຫຼັບໄປໃຊ້ %1$s ແລ້ວ" + "ອຸປະກອນຈະໃຊ້ %1$s ເມື່ອ %2$s ບໍ່ມີການເຊື່ອມຕໍ່ອິນເຕີເນັດ. ອາດມີການຮຽກເກັບຄ່າບໍລິການ." + "ສະຫຼັບຈາກ %1$s ໄປໃຊ້ %2$s ແລ້ວ" + + "ຂໍ້ມູນອິນເຕີເນັດມືຖື" + "Wi-Fi" + "Bluetooth" + "ອີເທີເນັດ" + "VPN" + + "ບໍ່ຮູ້ຈັກປະເພດເຄືອຂ່າຍ" "ບໍ່ສາມາດເຊື່ອມຕໍ່ Wi-Fi ໄດ້" " ມີສັນຍານອິນເຕີເນັດທີ່ບໍ່ດີ." "​ອະ​ນຸ​ຍາດ​ການ​ເຊື່ອມ​ຕໍ່ຫຼື​ບໍ່?" @@ -1153,7 +1165,6 @@ "ແຕະເພື່ອເລືອກພາສາ ແລະ ໂຄງແປ້ນພິມ" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "ຕົວເລືອກ" "ກຳ​ລັງ​ກຽມ %s" "ກຳລັງກວດຫາຂໍ້ຜິດພາດ" "ກວດ​ພົບ %s ໃໝ່​ແລ້ວ" @@ -1232,8 +1243,9 @@ "ເຊື່ອມຕໍ່ກັບ %s ແລ້ວ. ແຕະເພື່ອຈັດການເຄືອຂ່າຍ." "ກຳລັງເຊື່ອມຕໍ່ Always-on VPN…" "ເຊື່ອມຕໍ່ VPN ແບບເປີດຕະຫຼອດເວລາແລ້ວ" + "ຕັດການເຊື່ອມຕໍ່ VPN ແບບເປີດໃຊ້ຕະຫຼອດເວລາແລ້ວ" "VPN ແບບເປີດຕະຫຼອດເກີດຄວາມຜິດພາດ" - "ແຕະເພື່ອຕັ້ງຄ່າ" + "ແຕະເພື່ອຕັ້ງຄ່າ" "ເລືອກໄຟລ໌" "ບໍ່ໄດ້ເລືອກໄຟລ໌ເທື່ອ" "ຣີເຊັດ" @@ -1317,7 +1329,7 @@ "%s USB ດ​ຣ້າຍ" "ບ່ອນຈັດເກັບຂໍ້ມູນ USB" "ແກ້ໄຂ" - "ເຕືອນກ່ຽວກັບການນຳໃຊ້ຂໍ້ມູນ" + "ແຈ້ງເຕືອນການໃຊ້ອິນເຕີເນັດ" "ແຕະເພື່ອເບິ່ງການນຳໃຊ້ ແລະ ການຕັ້ງຄ່າ." "ໃຊ້​ຂໍ້​ມູນ 2G-3G ຮອດ​ຈຳ​ນວນ​ທີ່​ຈຳ​ກັດ​ແລ້ວ" "ໃຊ້​ຂໍ້​ມູນ 4G ຮອດ​ຈຳ​ນວນ​ທີ່​ຈຳ​ກັດ​ແລ້ວ" @@ -1636,6 +1648,7 @@ "ພິມຊື່ພາສາ" "ແນະນຳ" "ທຸກພາ​ສາ​" + "ທຸກຂົງເຂດ" "ຄົ້ນຫາ" "ໂໝດບ່ອນເຮັດວຽກປິດຢູ່" "ອະນຸຍາດໃຫ້ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກສາມາດນຳໃຊ້ໄດ້ ເຊິ່ງຮວມທັງແອັບ, ການຊິ້ງຂໍ້ມູນໃນພື້ນຫຼັງ ແລະ ຄຸນສົມບັດທີ່ກ່ຽວຂ້ອງ." diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index ab38c0caf2ca0b9a34df5e3c82ac1ea395827e96..9952a7c5a109cea746b2dea56a60d658d8dee7a3 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -218,6 +218,7 @@ "Telefono parinktys" "Ekrano užraktas" "Išjungiamas maitinimas" + "Skambutis pagalbos numeriu" "Pranešimas apie riktą" "Pranešti apie riktą" "Bus surinkta informacija apie dabartinę įrenginio būseną ir išsiųsta el. pašto pranešimu. Šiek tiek užtruks, kol pranešimas apie riktą bus paruoštas siųsti; būkite kantrūs." @@ -1104,7 +1105,7 @@ "Medijos garsumas" "Pranešimo apimtis" "Numatytasis skambėjimo tonas" - "Numatytasis skambėjimo tonas (%1$s)" + "Numatytasis skambėjimo tonas („%1$s“)" "Nėra" "Skambėjimo tonai" "Nežinomas skambėjimo tonas" @@ -1126,6 +1127,17 @@ "„Wi-Fi“ tinkle nėra interneto ryšio" "Palieskite, kad būtų rodomos parinktys." + "Perjungta į tinklą %1$s" + "Įrenginys naudoja tinklą %1$s kai tinkle %2$s nėra interneto ryšio. Gali būti taikomi mokesčiai." + "Perjungta iš tinklo %1$s į tinklą %2$s" + + "mobiliojo ryšio duomenys" + "Wi-Fi" + "Bluetooth" + "Eternetas" + "VPN" + + "nežinomas tinklo tipas" "Nepavyko prisijungti prie „Wi-Fi“" " turi prastą interneto ryšį." "Leisti prisijungti?" @@ -1203,7 +1215,6 @@ "Palieskite, kad pasirinktumėte kalbą ir išdėstymą" " AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ" " 0123456789AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ" - "kandidatai" "Ruošiama %s" "Tikrinama, ar nėra klaidų" "Aptikta nauja %s" @@ -1282,8 +1293,9 @@ "Prisijungta prie %s. Jei norite valdyti tinklą, palieskite." "Prisijungiama prie visada įjungto VPN…" "Prisijungta prie visada įjungto VPN" + "Visada įjungtas VPN atjungtas" "Visada įjungto VPN klaida" - "Palieskite, kad konfigūruotumėte" + "Palieskite, kad nustatytumėte" "Pasirinkti failą" "Nepasirinktas joks failas" "Atstatyti" @@ -1369,7 +1381,7 @@ "„%s“ atmintukas" "USB atmintis" "Redaguoti" - "Įspėjimas dėl duomenų naudojimo" + "Duomenų naudojimo įspėjimas" "Pal. ir perž. naud. i. bei nust." "Pasiektas 2G–3G duomenų apribojimas" "Pasiektas 4G duomenų apribojimas" @@ -1708,6 +1720,7 @@ "Įveskite kalbos pav." "Siūloma" "Visos kalbos" + "Visi regionai" "Paieška" "Darbo režimas išjungtas" "Leisti veikti darbo profiliui, įskaitant programas, sinchronizavimą fone ir susijusias funkcijas." diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 35b699f8f9c3492cda057c3b3e3448887e03cf13..ff2e97482524838d3d033e5a9107b9fe44d7bbd7 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -216,6 +216,7 @@ "Tālruņa opcijas" "Ekrāna bloķētājs" "Strāvas padeve ir izslēgta." + "Ārkārtas" "Kļūdu ziņojums" "Kļūdu ziņojuma sagatavošana" "Veicot šo darbību, tiks apkopota informācija par jūsu ierīces pašreizējo stāvokli un nosūtīta e-pasta ziņojuma veidā. Kļūdu ziņojuma pabeigšanai un nosūtīšanai var būt nepieciešams laiks. Lūdzu, esiet pacietīgs." @@ -1101,6 +1102,17 @@ "Wi-Fi tīklā nav piekļuves internetam." "Pieskarieties, lai skatītu iespējas." + "Pārslēdzās uz tīklu %1$s" + "Kad tīklā %2$s nav piekļuves internetam, ierīcē tiek izmantots tīkls %1$s. Var tikt piemērota maksa." + "Pārslēdzās no tīkla %1$s uz tīklu %2$s" + + "mobilie dati" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "nezināms tīkla veids" "Nevarēja izveidot savienojumu ar Wi-Fi." " ir slikts interneta savienojums." "Vai atļaut savienojumu?" @@ -1178,7 +1190,6 @@ "Pieskarieties, lai atlasītu valodu un izkārtojumu" " AĀBCČDEĒFGĢHIĪJKĶLĻMNŅOPRSŠTUŪVZŽ" " 0123456789AĀBCČDEĒFGĢHIĪJKĶLĻMNŅOPRSŠTUŪVZŽ" - "kandidāti" "Notiek %s sagatavošana" "Tiek meklētas kļūdas" "Tika atrasta jauna %s." @@ -1257,8 +1268,9 @@ "Ir izveidots savienojums ar: %s. Pieskarieties, lai pārvaldītu tīklu." "Notiek savienojuma izveide ar vienmēr ieslēgtu VPN…" "Izveidots savienojums ar vienmēr ieslēgtu VPN." + "Vienmēr ieslēgts VPN ir atvienots" "Kļūda saistībā ar vienmēr ieslēgtu VPN" - "Pieskarieties, lai konfigurētu." + "Pieskarieties, lai iestatītu." "Izvēlēties failu" "Neviens fails nav izvēlēts" "Atiestatīt" @@ -1343,7 +1355,7 @@ "%s USB disks" "USB atmiņa" "Rediģēt" - "Datu izmantošanas brīdinājums" + "Brīdinājums par datu lietojumu" "Piesk., lai sk. lietoj. un iest." "Sasniegts 2G-3G datu ierobež." "Sasniegts 4G datu ierobežojums" @@ -1672,6 +1684,7 @@ "Ierakstiet valodas nosaukumu" "Ieteiktās" "Visas valodas" + "Visi reģioni" "Meklēt" "Darba režīms IZSLĒGTS" "Atļaujiet darboties darba profilam, tostarp lietotnēm, sinhronizācijai fonā un saistītajām funkcijām." diff --git a/core/res/res/values-mcc001/config.xml b/core/res/res/values-mcc001/config.xml new file mode 100644 index 0000000000000000000000000000000000000000..93cde03ba6a0ea7955fbaad3634e94c47653a819 --- /dev/null +++ b/core/res/res/values-mcc001/config.xml @@ -0,0 +1,21 @@ + + + + true + diff --git a/core/res/res/values-mcc222-mnc10/config.xml b/core/res/res/values-mcc222-mnc10/config.xml index cd6e8c6f46c2e6412e20cab30a9c45a0933c72bc..c819de2ba43cf4358fd405bcf5b4f8fd073a17e7 100644 --- a/core/res/res/values-mcc222-mnc10/config.xml +++ b/core/res/res/values-mcc222-mnc10/config.xml @@ -28,29 +28,4 @@ Tethering Internet,web.omnitel.it,,,,,,,,,222,10,,DUN - - - 21401 - 21402 - 21403 - 21404 - 21405 - 21406 - 21407 - 21408 - 21409 - 21410 - 21411 - 21412 - 21413 - 21414 - 21415 - 21416 - 21417 - 21418 - 21419 - 21420 - 21421 - - diff --git a/core/res/res/values-mcc232-mnc10/config.xml b/core/res/res/values-mcc232-mnc10/config.xml index 11e25854dc16199f029cba09840a365345d21bba..bdf83016d18eacc35b5d46ed29911acda930cd92 100644 --- a/core/res/res/values-mcc232-mnc10/config.xml +++ b/core/res/res/values-mcc232-mnc10/config.xml @@ -1,25 +1,26 @@ 23203 + 23205 diff --git a/core/res/res/values-mcc232-mnc13/config.xml b/core/res/res/values-mcc232-mnc13/config.xml new file mode 100644 index 0000000000000000000000000000000000000000..2c14f87374f61d4770a2d10429d72021e273592b --- /dev/null +++ b/core/res/res/values-mcc232-mnc13/config.xml @@ -0,0 +1,25 @@ + + + + + + + 23203 + + diff --git a/core/res/res/values-mcc302-mnc220/config.xml b/core/res/res/values-mcc302-mnc220/config.xml index d638b89d5c036d7b9d937aa02326b3815d13edc7..422f7c92648fa29e1acd007960e20ef56d842dbd 100644 --- a/core/res/res/values-mcc302-mnc220/config.xml +++ b/core/res/res/values-mcc302-mnc220/config.xml @@ -21,14 +21,6 @@ for different hardware and product builds. --> - - 302370 - 302610 - 302660 - 302720 - 302780 - - 1410 + + + + + 302 + + diff --git a/core/res/res/values-mcc302-mnc510/config.xml b/core/res/res/values-mcc302-mnc510/config.xml new file mode 100644 index 0000000000000000000000000000000000000000..77f64199a80bdfa62ef13783b631a0f97f7b3ad5 --- /dev/null +++ b/core/res/res/values-mcc302-mnc510/config.xml @@ -0,0 +1,25 @@ + + + + + + + 302 + + diff --git a/core/res/res/values-mcc722-mnc36/config.xml b/core/res/res/values-mcc722-mnc36/config.xml new file mode 100644 index 0000000000000000000000000000000000000000..daf5373f7b5b3c44005c4b240086317fc3e2cc2d --- /dev/null +++ b/core/res/res/values-mcc722-mnc36/config.xml @@ -0,0 +1,25 @@ + + + + + + + 72234 + + diff --git a/core/res/res/values-mk-rMK/strings.xml b/core/res/res/values-mk-rMK/strings.xml index e0ec16a0de9b4feeab8c22586a10c22e757f6149..eb86a77e0e5d2b3b3ba913bf423d8e34b6c9f6a9 100644 --- a/core/res/res/values-mk-rMK/strings.xml +++ b/core/res/res/values-mk-rMK/strings.xml @@ -214,6 +214,7 @@ "Опции на телефон" "Заклучи екран" "Исклучи" + "Итен случај" "Извештај за грешка" "Земи извештај за грешки" "Ова ќе собира информации за моменталната состојба на вашиот уред, за да ги испрати како порака по е-пошта. Тоа ќе одземе малку време почнувајќи од извештајот за грешки додека не се подготви за праќање; бидете трпеливи." @@ -1076,6 +1077,17 @@ "Wi-Fi нема пристап на интернет" "Допрете за опции" + "Префрлено на %1$s" + "Уредот користи %1$s кога %2$s нема пристап до интернет. Може да се наплатат трошоци." + "Префрлено од %1$s на %2$s" + + "мобилен интернет" + "Wi-Fi" + "Bluetooth" + "Етернет" + "VPN" + + "непознат тип мрежа" "Не можеше да се поврзе со Wi-Fi" " има слаба конекција на интернет." "Дозволете поврзување?" @@ -1153,7 +1165,6 @@ "Допрете за избирање јазик и распоред" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "кандидати" "Се подготвува %s" "Се проверува за грешки" "Откриена е нова %s" @@ -1232,8 +1243,9 @@ "Поврзани сте на %s. Допрете за да управувате со мрежата." "Поврзување со секогаш вклучена VPN..." "Поврзани со секогаш вклучена VPN" + "Секогаш вклучената VPN е неповрзана" "Грешка на секогаш вклучена VPN" - "Допрете за конфигурирање" + "Допрете за да поставите" "Избери датотека" "Не е избрана датотека" "Ресетирај" @@ -1319,7 +1331,7 @@ "%s УСБ-меморија" "УСБ меморија" "Уреди" - "Опомена за потрошен интернет" + "Известување за потрошен сообраќај" "Допрете за употреба и поставки." "Постигна лимит за 2G-3G податоци" "Постигнат лимит за 4G податоци" @@ -1638,6 +1650,7 @@ "Внеси име на јазик" "Предложени" "Сите јазици" + "Сите региони" "Пребарај" "Режимот на работа е ИСКЛУЧЕН" "Дозволете работниот профил да функционира, вклучувајќи ги апликациите, синхронизирањето во заднина и други поврзани функции." diff --git a/core/res/res/values-ml-rIN/strings.xml b/core/res/res/values-ml-rIN/strings.xml index 39d493a6ea5b8acfae4d06de2a23642beb6b6ce1..423db1d195991c14e515f33d870823a40bc1ace1 100644 --- a/core/res/res/values-ml-rIN/strings.xml +++ b/core/res/res/values-ml-rIN/strings.xml @@ -214,6 +214,7 @@ "ഫോൺ ഓപ്‌ഷനുകൾ" "സ്‌ക്രീൻ ലോക്ക്" "പവർ ഓഫാക്കുക" + "അടിയന്തിരാവശ്യം" "ബഗ് റിപ്പോർട്ട്" "ബഗ് റിപ്പോർട്ട് എടുക്കുക" "ഒരു ഇമെയിൽ സന്ദേശമായി അയയ്‌ക്കുന്നതിന്, ഇത് നിങ്ങളുടെ നിലവിലെ ഉപകരണ നിലയെക്കുറിച്ചുള്ള വിവരങ്ങൾ ശേഖരിക്കും. ബഗ് റിപ്പോർട്ട് ആരംഭിക്കുന്നതിൽ നിന്ന് ഇത് അയയ്‌ക്കാനായി തയ്യാറാകുന്നതുവരെ അൽപ്പസമയമെടുക്കും; ക്ഷമയോടെ കാത്തിരിക്കുക." @@ -1076,6 +1077,17 @@ "Wi-Fi-യിൽ ഇന്റർനെറ്റ് ആക്‌സസ് ഇല്ല." "ഓപ്ഷനുകൾക്ക് ടാപ്പുചെയ്യുക" + "%1$s എന്നതിലേക്ക് മാറി" + "%2$s നെറ്റ്‌വർക്കിന് ഇന്റർനെറ്റ് ആക്സസ്സ് ഇല്ലാത്തപ്പോൾ ഉപകരണം %1$s ഉപയോഗിക്കുന്നു. നിരക്കുകൾ ബാധകമായേക്കാം." + "%1$s നെറ്റ്‌വർക്കിൽ നിന്ന് %2$s നെറ്റ്‌വർക്കിലേക്ക് മാറി" + + "സെല്ലുലാർ ഡാറ്റ" + "വൈഫൈ" + "Bluetooth" + "ഇതര്‍നെറ്റ്" + "VPN" + + "തിരിച്ചറിയാനാകാത്ത ഒരു നെറ്റ്‌വർക്ക് തരം" "Wi-Fi-ലേക്ക് കണക്‌റ്റുചെയ്യാൻ കഴിഞ്ഞില്ല" " മോശം ഇന്റർനെറ്റ് കണക്ഷനാണുള്ളത്." "കണക്ഷൻ അനുവദിക്കണോ?" @@ -1153,7 +1165,6 @@ "ഭാഷയും ലേഔട്ടും തിരഞ്ഞെടുക്കുന്നതിന് ടാപ്പുചെയ്യുക" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "കാൻഡിഡേറ്റുകൾ" "%s തയ്യാറാകുന്നു" "പിശകുകളുണ്ടോയെന്നു പരിശോധിക്കുന്നു" "പുതിയ %s എന്നതിനെ തിരിച്ചറിഞ്ഞു" @@ -1232,8 +1243,9 @@ "%s എന്ന സെഷനിലേക്ക് കണക്റ്റുചെയ്തു. നെറ്റ്‌വർക്ക് മാനേജുചെയ്യാൻ ടാപ്പുചെയ്യുക." "എല്ലായ്‌പ്പോഴും ഓണായിരിക്കുന്ന VPN കണക്റ്റുചെയ്യുന്നു…" "എല്ലായ്‌പ്പോഴും ഓണായിരിക്കുന്ന VPN കണക്റ്റുചെയ്‌തു" + "\'എല്ലായ്‌പ്പോഴും ഓണായിരിക്കുന്ന VPN\' വിച്ഛേദിച്ചു" "എല്ലായ്‌പ്പോഴും ഓണായിരിക്കുന്ന VPN പിശക്" - "കോൺഫിഗർ ചെയ്യുന്നതിന് ടാപ്പുചെയ്യുക" + "സജ്ജമാക്കാൻ ടാപ്പുചെയ്യുക" "ഫയല്‍‌ തിരഞ്ഞെടുക്കുക" "ഫയലൊന്നും തിരഞ്ഞെടുത്തില്ല" "പുനഃസജ്ജമാക്കുക" @@ -1317,7 +1329,7 @@ "%s USB ഡ്രൈവ്" "USB സ്റ്റോറേജ്" "എഡിറ്റുചെയ്യുക" - "ഡാറ്റ ഉപയോഗ മുന്നറിയിപ്പ്" + "ഡാറ്റാ ഉപയോഗ മുന്നറിയിപ്പ്" "ഉപയോഗവും ക്രമീകരണവും കാണാൻ ടാപ്പുചെയ്യുക." "2G-3G ഡാറ്റ പരിധിയിലെത്തി" "4G ഡാറ്റ പരിധിയിലെത്തി" @@ -1636,6 +1648,7 @@ "ഭാഷയുടെ പേര് ടൈപ്പുചെയ്യുക" "നിര്‍‌ദ്ദേശിച്ചത്" "എല്ലാ ഭാഷകളും" + "എല്ലാ പ്രദേശങ്ങളും" "തിരയുക" "ഔദ്യോഗിക മോഡ് ഓഫാണ്" "ആപ്സും, പശ്ചാത്തല സമന്വയവും ബന്ധപ്പെട്ട ഫീച്ചറുകളും ഉൾപ്പെടെ, ഔദ്യോഗിക പ്രൊഫൈലിനെ പ്രവർത്തിക്കാൻ അനുവദിക്കുക." diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml index 5f384a17f3d0fe309b00b3c662278755858ee4d0..f936b85966a77323076b830e9674237dfaecce85 100644 --- a/core/res/res/values-mn-rMN/strings.xml +++ b/core/res/res/values-mn-rMN/strings.xml @@ -214,6 +214,7 @@ "Утасны сонголтууд" "Дэлгэцний түгжээ" "Унтраах" + "Яаралтай тусламж" "Алдаа мэдээллэх" "Согог репорт авах" "Энэ таны төхөөрөмжийн одоогийн статусын талаарх мэдээллийг цуглуулах ба имэйл мессеж болгон илгээнэ. Алдааны мэдэгдлээс эхэлж илгээхэд бэлэн болоход хэсэг хугацаа зарцуулагдана тэвчээртэй байна уу." @@ -1076,6 +1077,17 @@ "Wi-Fi-д интернет холболт байхгүй байна" "Сонголт хийхийн тулд товшино уу" + "%1$s руу шилжүүлсэн" + "%2$s интернэт холболтгүй үед төхөөрөмж %1$s-г ашигладаг. Төлбөр гарч болзошгүй." + "%1$s%2$s руу шилжүүлсэн" + + "мобайл дата" + "Wi-Fi" + "Bluetooth" + "Этернэт" + "VPN" + + "сүлжээний тодорхойгүй төрөл" "Wi-Fi-д холбогдож чадсангүй" " Интернет холболт муу байна." "Холболтыг зөвшөөрөх үү?" @@ -1153,7 +1165,6 @@ "Хэл болон бүдүүвчийг сонгохын тулд дарна уу" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "нэр дэвшигч" "%s-ыг бэлдэж байна" "Алдааг шалгаж байна" "Шинэ %s илэрлээ" @@ -1232,8 +1243,9 @@ "%s-д холбогдов. Сүлжээг удирдах бол товшино уу." "Байнгын VPN-д холбогдож байна..." "Байнга VPN холбоотой" + "Тогтмол асаалттай VPN салсан" "Байнгын VPN алдаа" - "Тохируулахын тулд товшино уу" + "Тохируулахын тулд товшино уу" "Файл сонгох" "Сонгосон файл байхгүй" "Бүгдийг цэвэрлэх" @@ -1317,7 +1329,7 @@ "%s USB диск" "USB сан" "Засах" - "Дата хэрэглээний анхааруулга" + "Дата ашиглалтын сануулга" "Хэрэглээ, тохиргоог харах бол товш." "2G-3G дата хязгаарт хүрсэн" "4G дата хязгаарт хүрсэн" @@ -1634,6 +1646,7 @@ "Улсын хэлийг бичнэ үү" "Санал болгосон" "Бүх хэл" + "Бүх бүс нутаг" "Хайх" "Ажлын горимыг УНТРААСАН байна" "Ажлын профайлд апп, дэвсгэр синхрончлол болон бусад холбоотой тохиргоог ажиллахыг зөвшөөрнө үү." diff --git a/core/res/res/values-mr-rIN/strings.xml b/core/res/res/values-mr-rIN/strings.xml index 36d6f6a453365b9e4051a501fa72fbbf92c9259b..8951643cfde01ae688b7bd93d0311f45cc05ccfb 100644 --- a/core/res/res/values-mr-rIN/strings.xml +++ b/core/res/res/values-mr-rIN/strings.xml @@ -214,6 +214,7 @@ "फोन पर्याय" "स्क्रीन लॉक" "बंद" + "आणीबाणी" "दोष अहवाल" "दोष अहवाल घ्या" "ई-मेल संदेश म्हणून पाठविण्यासाठी, हे आपल्या वर्तमान डिव्हाइस स्थितीविषयी माहिती संकलित करेल. दोष अहवाल प्रारंभ करण्यापासून तो पाठविण्यापर्यंत थोडा वेळ लागेल; कृपया धीर धरा." @@ -1074,8 +1075,19 @@ "नेटवर्कवर साइन इन करा" - "वाय-फाय मध्‍ये इंटरनेट प्रवेश नाही" + "वाय-फायवरून इंटरनेटवर प्रवेश नाही" "पर्यायांसाठी टॅप करा" + "%1$s वर स्विच केले" + "%2$s कडे इंटरनेट प्रवेश नसताना डिव्हाइस %1$s वापरतो. शुल्क लागू शकतील." + "%1$s वरून %2$s वर स्विच केले" + + "मोबाइल डेटा" + "वाय-फाय" + "ब्लूटुथ" + "इथरनेट" + "VPN" + + "अज्ञात नेटवर्क प्रकार" "वाय-फाय ला कनेक्ट करू शकलो नाही" " खराब इंटरनेट कनेक्शन आहे." "कनेक्शनला अनुमती द्यायची?" @@ -1153,7 +1165,6 @@ "भाषा आणि लेआउट निवडण्यासाठी टॅप करा" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "उमेदवार" "%s तयार करीत आहे" "त्रुटींसाठी तपासत आहे" "नवीन %s आढळले" @@ -1232,8 +1243,9 @@ "%s शी कनेक्ट केले. नेटवर्क व्यवस्थापित करण्यासाठी टॅप करा." "VPN कनेक्ट करणे नेहमी-चालू…" "VPN कनेक्ट केलेले नेहमी-चालू" + "नेहमी-चालू असलेले VPN डिस्कनेक्ट केले" "VPN त्रुटी नेहमी-चालू" - "कॉन्फिगर करण्यासाठी टॅप करा" + "सेट करण्यासाठी टॅप करा" "फाईल निवडा" "फाईल निवडली नाही" "रीसेट करा" @@ -1317,7 +1329,7 @@ "%s USB ड्राइव्‍ह" "USB संचयन" "संपादित करा" - "डेटा वापर चेतावणी" + "डेटा वापर सूचना" "वापर आणि सेटिंग्ज पाहण्यासाठी टॅप करा." "2G-3G डेटा मर्यादा गाठली" "4G डेटा मर्यादा गाठली" @@ -1636,6 +1648,7 @@ "भाषा नाव टाइप करा" "सूचित केलेले" "सर्व भाषा" + "सर्व प्रदेश" "शोध" "कार्य मोड बंद आहे" "कार्य प्रोफाइलला अॅप्स, पार्श्वभूमी संकालन आणि संबंधित वैशिष्ट्यांच्या समावेशासह कार्य करण्याची परवानगी द्या." diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml index 7db5c7473fb803efa1c6711f9715b06d5f3767ac..e096aecd018878a65cc226c104827c8301309314 100644 --- a/core/res/res/values-ms-rMY/strings.xml +++ b/core/res/res/values-ms-rMY/strings.xml @@ -214,6 +214,7 @@ "Pilihan telefon" "Kunci skrin" "Matikan kuasa" + "Kecemasan" "Laporan pepijat" "Ambil laporan pepijat" "Ini akan mengumpul maklumat tentang keadaan peranti semasa anda untuk dihantarkan sebagai mesej e-mel. Harap bersabar, mungkin perlu sedikit masa untuk memulakan laporan sehingga siap untuk dihantar." @@ -1076,6 +1077,17 @@ "Wi-Fi tiada akses Internet" "Ketik untuk mendapatkan pilihan" + "Beralih kepada %1$s" + "Peranti menggunakan %1$s apabila %2$s tiada akses Internet. Bayaran mungkin dikenakan." + "Beralih daripada %1$s kepada %2$s" + + "data selular" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "jenis rangkaian tidak diketahui" "Tidak boleh menyambung kepada Wi-Fi" " mempunyai sambungan internet yang kurang baik." "Benarkan sambungan?" @@ -1153,7 +1165,6 @@ "Ketik untuk memilih bahasa dan susun atur" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "calon" "Menyediakan %s" "Menyemak untuk mengesan ralat" "%s baharu dikesan" @@ -1232,8 +1243,9 @@ "Bersambung kepada %s. Ketik untuk mengurus rangkaian." "VPN sentiasa hidup sedang disambungkan..." "VPN sentiasa hidup telah disambungkan" + "VPN sentiasa hidup diputuskan sambungannya" "Ralat VPN sentiasa hidup" - "Ketik untuk membuat konfigurasi" + "Ketik untuk menyediakan" "Pilih fail" "Tiada fail dipilih" "Tetapkan semula" @@ -1317,7 +1329,7 @@ "Pemacu USB %s" "Storan USB" "Edit" - "Amaran penggunaan data" + "Makluman penggunaan data" "Ketik utk lihat p\'gunaan & ttpn." "Mencapai had data 2G-3G" "Mencapai had data 4G" @@ -1636,6 +1648,7 @@ "Taipkan nama bahasa" "Dicadangkan" "Semua bahasa" + "Semua rantau" "Cari" "Mod kerja DIMATIKAN" "Benarkan profil kerja berfungsi, termasuk apl, penyegerakan latar belakang dan ciri yang berkaitan." diff --git a/core/res/res/values-my-rMM/strings.xml b/core/res/res/values-my-rMM/strings.xml index 077b88967d191c9a1ba796667e50f0ae2f643a94..80d331d6ec34e263419732e511256114535b544e 100644 --- a/core/res/res/values-my-rMM/strings.xml +++ b/core/res/res/values-my-rMM/strings.xml @@ -214,6 +214,7 @@ "ဖုန်းဆိုင်ရာရွေးချယ်မှုများ" "ဖုန်းမျက်နှာပြင်အား သော့ချရန်" "ပါဝါပိတ်ရန်" + "အရေးပေါ်" "အမှားရှာဖွေပြင်ဆင်မှုမှတ်တမ်း" "အမှားရှာဖွေပြင်ဆင်မှုမှတ်တမ်းအား ယူရန်" "သင့်ရဲ့ လက်ရှိ စက်အခြေအနေ အချက်အလက်များကို အီးမေးလ် အနေဖြင့် ပေးပို့ရန် စုဆောင်းပါမည်။ အမှားရှာဖွေပြင်ဆင်မှုမှတ်တမ်းမှ ပေးပို့ရန် အသင့်ဖြစ်သည်အထိ အချိန် အနည်းငယ်ကြာမြင့်မှာ ဖြစ်သဖြင့် သည်းခံပြီး စောင့်ပါရန်" @@ -1076,6 +1077,17 @@ "ဝိုင်-ဖို်ငတွင် အင်တာနက် ဝင်ရောက်သုံးခွင့် မရှိပါ" "အခြားရွေးချယ်စရာများကိုကြည့်ရန် တို့ပါ" + "%1$s သို့ ပြောင်းလိုက်ပြီ" + "စက်ပစ္စည်းသည် %2$s ဖြင့် အင်တာနက် အသုံးမပြုနိုင်သည့်အချိန်တွင် %1$s ကို သုံးပါသည်။ ဒေတာသုံးစွဲခ ကျသင့်နိုင်ပါသည်။" + "%1$s မှ %2$s သို့ ပြောင်းလိုက်ပြီ" + + "ဆယ်လူလာဒေတာ" + "Wi-Fi" + "ဘလူးတုသ်" + "အီသာနက်" + "VPN" + + "အမည်မသိကွန်ရက်အမျိုးအစား" "ဝိုင်ဖိုင်ကိုချိတ်ဆက်မရပါ" " အင်တာနက် ဆက်သွယ်မှု ကောင်းကောင်းမရှိပါ" "ချိတ်ဆက်မှုကို ခွင့်ပြုမလား?" @@ -1153,7 +1165,6 @@ "ဘာသာစကားနှင့် အသွင်အပြင်ရွေးချယ်ရန် တို့ပါ" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "ရွေးချယ်ခံမည့်သူ" "%s ပြင်ဆင်နေသည်" "အမှားအယွင်းများ စစ်ဆေးနေသည်" "%s အသစ်တွေ့ရှိပါသည်" @@ -1232,8 +1243,9 @@ "%s သို့ ချိတ်ဆက်ထားသည်။ ကွန်ရက်ကို စီမံခန့်ခွဲရန် တို့ပါ။" "အမြဲတမ်းဖွင့်ထား VPN ဆက်သွယ်နေစဉ်…" "အမြဲတမ်းဖွင့်ထား VPN ဆက်သွယ်မှုရှိ" + "အမြဲတမ်းဖွင့်ထားရသော VPN ပြတ်တောက်နေသည်" "အမြဲတမ်းဖွင့်ထား VPN အမှား" - "ပြင်ဆင်သတ်မှတ်ရန် တို့ပါ" + "ပြင်ဆင်သတ်မှတ်ရန် တို့ပါ" "ဖိုင်ရွေးချယ်ရန်" "မည်သည့်ဖိုင်ကိုမှမရွေးပါ" "ပြန်လည်သတ်မှတ်ရန်" @@ -1317,7 +1329,7 @@ "%s USB ဒရိုက်ဗ်" "USBဖြင့် သိမ်းဆည်း" "ပြင်ဆင်ရန်" - "ဒေတာအသုံးပြုမှုသတိပေးချက်" + "ဒေတာအသုံးပြုမှုသတိပေးချက်" "အသုံးပြုမှုနှင့် ဆက်တင်များကိုကြည့်ရန် တို့ပါ။" "2G-3G ဒေတာ ကန့်သတ်ချက် ပြည့်မီသွားပြီ" "4G ဒေတာ ကန့်သတ်ချက် ပြည့်မီသွားပြီ" @@ -1636,6 +1648,7 @@ "ဘာသာစကားအမည် ထည့်ပါ" "အကြံပြုထားသော" "ဘာသာစကားများအားလုံး" + "ဒေသအားလုံး" "ရှာဖွေရန်" "အလုပ်မုဒ် ပိတ်ထားသည်" "အက်ပ်များ၊ နောက်ခံစင့်ခ်လုပ်ခြင်း၊ နှင့်သက်ဆိုင်သည့်အင်္ဂါရပ်များကို ဆောင်ရွက်ရန် အလုပ်ပရိုဖိုင်ကိုခွင့်ပြုပါ။" diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index c9b275c1f7d47a99685683e842f65db5d65db095..691da31748c685b94d1e53ae759f809693e1c738 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -214,6 +214,7 @@ "Telefoninnstillinger" "Lås skjermen" "Slå av" + "Nødssituasjon" "Feilrapport" "Utfør feilrapport" "Informasjon om tilstanden til enheten din samles inn og sendes som en e-post. Det tar litt tid fra du starter feilrapporten til e-posten er klar, så vær tålmodig." @@ -1076,6 +1077,17 @@ "Wi-Fi har ikke Internett-tilgang" "Trykk for å få alternativer" + "Byttet til %1$s" + "Enheten bruker %1$s når %2$s ikke har Internett-tilgang. Avgifter kan påløpe." + "Byttet fra %1$s til %2$s" + + "mobildata" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "en ukjent nettverkstype" "Kan ikke koble til Wi-Fi" " har en dårlig Internett-tilkobling." "Vil du tillat tilkoblingen?" @@ -1153,7 +1165,6 @@ "Trykk for å velge språk og layout" " ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ" - "TAG_FONT""kandidater""CLOSE_FONT" "Forbereder %s" "Sjekker for feil" "%s ble oppdaget" @@ -1232,8 +1243,9 @@ "Koblet til %s. Trykk for å administrere nettverket." "Alltid-på VPN kobler til ..." "Alltid-på VPN er tilkoblet" + "Alltid på-VPN er frakoblet" "Alltid-på VPN-feil" - "Trykk for å konfigurere" + "Trykk for å konfigurere" "Velg fil" "Ingen fil er valgt" "Tilbakestill" @@ -1317,7 +1329,7 @@ "%s USB-stasjon" "USB-lagring" "Rediger" - "Advarsel for høyt dataforbruk" + "Varsel om databruk" "Trykk for å se bruken og innstillingene." "Datagrensen for 2G-3G er nådd" "Datagrensen for 4G er nådd" @@ -1636,6 +1648,7 @@ "Skriv inn språknavn" "Foreslått" "Alle språk" + "Alle områder" "Søk" "Jobbmodus er AV" "Slå på jobbprofilen, inkludert apper, synkronisering i bakgrunnen og relaterte funksjoner." diff --git a/core/res/res/values-ne-rNP/strings.xml b/core/res/res/values-ne-rNP/strings.xml index a0dcfeb8944050a89ccb1f974d8caacb7d0f0307..3d5cfeddd91c8dfe5351bf6e9e2f5f9ef262b92d 100644 --- a/core/res/res/values-ne-rNP/strings.xml +++ b/core/res/res/values-ne-rNP/strings.xml @@ -214,6 +214,7 @@ "फोन विकल्पहरू" "स्क्रिन बन्द" "बन्द गर्नुहोस्" + "आपतकालीन" "बग रिपोर्ट" "बग रिपोर्ट लिनुहोस्" "एउटा इमेल सन्देशको रूपमा पठाउनलाई यसले तपाईँको हालैको उपकरणको अवस्थाको बारेमा सूचना जम्मा गर्ने छ। बग रिपोर्ट सुरु गरेदेखि पठाउन तयार नभएसम्म यसले केही समय लिन्छ; कृपया धैर्य गर्नुहोस्।" @@ -255,7 +256,7 @@ "माइक्रोफोन" "अडियो रेकर्ड गर्नुहोस्" "क्यामेरा" - "तस्बिर खिच्नुहोस् तथा भिडियो रेकर्ड गर्नुहोस्" + "तस्बिर खिच्नुका साथै भिडियो रेकर्ड गर्नुहोस्" "फोन" "फोन कलहरू गर्नुहोस् र व्यवस्थापन गर्नुहोस्" "शारीरिक सेन्सर" @@ -1082,6 +1083,17 @@ "Wi-Fi मा इन्टरनेट पहुँच छैन" "विकल्पहरूका लागि ट्याप गर्नुहोस्" + "%1$s मा बदल्नुहोस्" + "%2$s मा इन्टरनेट माथिको पहुँच नहुँदा यन्त्रले %1$s को प्रयोग गर्दछ। शुल्कहरू लागू हुन सक्छन्।" + "%1$s बाट %2$s मा परिवर्तन गरियो" + + "सेलुलर डेटा" + "Wi-Fi" + "ब्लुटुथ" + "इथरनेट" + "VPN" + + "नेटवर्कको कुनै अज्ञात प्रकार" "वाइ-फाइसँग जडान गर्न सकेन" " कमजोर इन्टरनेट जडान छ।" "जडान अनुमति दिने हो?" @@ -1159,7 +1171,6 @@ "भाषा र लेआउट चयन गर्न ट्याप गर्नुहोस्" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "उम्मेदवार" "तयारी गर्दै %s" "त्रुटिहरूको लागि जाँच गर्दै" "नयाँ %s भेटियो" @@ -1238,8 +1249,9 @@ "%sसँग जोडिएको। नेटवर्क प्रबन्ध गर्न हान्नुहोस्।" "VPN जडान सधै जोड्दै…" "सधैँ खुल्ला हुने VPN जोडिएको" + "सधैँ-सक्रिय VPN लाई विच्छेद गरियो" "सधैँ भरि VPN त्रुटिमा" - "कन्फिगर गर्न ट्याप गर्नुहोस्" + "सेट अप गर्न ट्याप गर्नुहोस्" "फाइल छान्नुहोस्" "कुनै फाइल छानिएको छैन" "पुनःसेट गर्नु" @@ -1323,7 +1335,7 @@ "%s USB ड्राइभ" "USB भण्डारण" "सम्पादन गर्नुहोस्" - "डेटाको प्रयोग चेतावनी" + "डेटा प्रयोग बारे सतर्कता" "प्रयोग र सेटिङहरू हेर्न ट्याप गर्नुहोस्।" "2G-3G डेटा सीमा पुग्यो" "4G डेटा सीमा पुग्यो" @@ -1642,6 +1654,7 @@ "भाषाको नाम टाइप गर्नुहोस्" "सुझाव दिइयो" "सम्पूर्ण भाषाहरू" + "सबै क्षेत्रहरू" "खोज" "कार्य मोड बन्द छ" "अनुप्रयोग, पृष्ठभूमि सिंक र सम्बन्धित विशेषताहरू सहित, कार्य प्रोफाइललाई कार्य गर्न अनुमति दिनुहोस्।" diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index d7f10d3f1d170dcafd9ca3d0fae7b8f9e5bd7b70..1f53e8dc1bfde1b5a8b1b5a59068fb87ff37acbe 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -214,6 +214,7 @@ "Telefoonopties" "Schermvergrendeling" "Uitschakelen" + "Noodgeval" "Foutenrapport" "Foutenrapport genereren" "Hiermee worden gegevens over de huidige status van je apparaat verzameld en als e-mail verzonden. Wanneer u een foutenrapport start, duurt het even voordat het kan worden verzonden. Even geduld alstublieft." @@ -236,7 +237,7 @@ "Spraakassistent" "Nu vergrendelen" "999 +" - "Inhoud verborgen" + "Content verborgen" "Content verborgen op basis van beleid" "Veilige modus" "Android-systeem" @@ -260,12 +261,12 @@ "bellen en telefoontjes beheren" "Lichaamssensoren" "toegang krijgen tot sensorgegevens over je vitale functies" - "Inhoud van vensters ophalen" - "De inhoud inspecteren van een venster waarmee je interactie hebt." + "Content van vensters ophalen" + "De content inspecteren van een venster waarmee je interactie hebt." "\'Verkennen via aanraking\' inschakelen" "Aangetikte items worden hardop benoemd en het scherm kan worden verkend door middel van gebaren." "Verbeterde internettoegankelijkheid inschakelen" - "Er kunnen scripts worden geïnstalleerd om app-inhoud toegankelijker te maken." + "Er kunnen scripts worden geïnstalleerd om app-content toegankelijker te maken." "Tekst observeren die u typt" "Omvat persoonlijke gegevens zoals creditcardnummers en wachtwoorden." "Schermvergroting bedienen" @@ -295,9 +296,9 @@ "sms\'jes verzenden en bekijken" "Hiermee kan de app sms-berichten verzenden. Dit kan tot onverwachte kosten leiden. Schadelijke apps kunnen u geld kosten doordat ze zonder je bevestiging berichten kunnen verzenden." "je tekstberichten (SMS of MMS) lezen" - "Hiermee kan de app sms-berichten lezen die zijn opgeslagen op je tablet of simkaart. De app kan alle sms-berichten lezen, ongeacht inhoud of vertrouwelijkheid." - "Hiermee kan de app sms-berichten lezen die zijn opgeslagen op je tv of simkaart. De app kan alle sms-berichten lezen, ongeacht inhoud of vertrouwelijkheid." - "Hiermee kan de app sms-berichten lezen die zijn opgeslagen op je telefoon of simkaart. De app kan alle sms-berichten lezen, ongeacht inhoud of vertrouwelijkheid." + "Hiermee kan de app sms-berichten lezen die zijn opgeslagen op je tablet of simkaart. De app kan alle sms-berichten lezen, ongeacht content of vertrouwelijkheid." + "Hiermee kan de app sms-berichten lezen die zijn opgeslagen op je tv of simkaart. De app kan alle sms-berichten lezen, ongeacht content of vertrouwelijkheid." + "Hiermee kan de app sms-berichten lezen die zijn opgeslagen op je telefoon of simkaart. De app kan alle sms-berichten lezen, ongeacht content of vertrouwelijkheid." "tekstberichten (WAP) ontvangen" "Hiermee kan de app WAP-berichten ontvangen en verwerken. Dit betekent dat de app berichten die naar je apparaat zijn verzonden, kan bijhouden of verwijderen zonder deze aan u weer te geven." "actieve apps ophalen" @@ -459,12 +460,12 @@ "Hiermee kan een app de synchronisatie-instellingen aanpassen voor een account. Deze toestemming kan bijvoorbeeld worden gebruikt om synchronisatie van de app Personen in te schakelen voor een account." "synchronisatiestatistieken lezen" "Hiermee kan een app de synchronisatiestatistieken voor een account lezen, inclusief de geschiedenis van synchronisatie-activiteiten en hoeveel gegevens zijn gesynchroniseerd." - "de inhoud van je USB-opslag lezen" - "de inhoud van je SD-kaart lezen" - "De app toestaan de inhoud van je USB-opslag te lezen." - "De app toestaan de inhoud van je SD-kaart te lezen." - "de inhoud van je USB-opslag aanpassen of verwijderen" - "de inhoud van je SD-kaart aanpassen of verwijderen" + "de content van je USB-opslag lezen" + "de content van je SD-kaart lezen" + "De app toestaan de content van je USB-opslag te lezen." + "De app toestaan de content van je SD-kaart te lezen." + "de content van je USB-opslag aanpassen of verwijderen" + "de content van je SD-kaart aanpassen of verwijderen" "Hiermee kan de app schrijven naar de USB-opslag." "Hiermee kan de app schrijven naar de SD-kaart." "SIP-oproepen plaatsen/ontvangen" @@ -1076,6 +1077,17 @@ "Wifi-netwerk heeft geen internettoegang" "Tik voor opties" + "Overgeschakeld naar %1$s" + "Apparaat gebruikt %1$s wanneer %2$s geen internetverbinding heeft. Er kunnen kosten in rekening worden gebracht." + "Overgeschakeld van %1$s naar %2$s" + + "mobiele data" + "Wifi" + "Bluetooth" + "Ethernet" + "VPN" + + "een onbekend netwerktype" "Kan geen verbinding maken met wifi" " heeft een slechte internetverbinding." "Verbinding toestaan?" @@ -1153,7 +1165,6 @@ "Tik om een taal en indeling te selecteren" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "kandidaten" "%s voorbereiden" "Controleren op fouten" "Nieuwe %s gedetecteerd" @@ -1232,8 +1243,9 @@ "Verbonden met %s. Tik om het netwerk te beheren." "Always-on VPN-verbinding maken…" "Always-on VPN-verbinding" + "Always-on VPN-verbinding ontkoppeld" "Fout met Always-on VPN" - "Tik om te configureren" + "Tik om in te stellen" "Bestand kiezen" "Geen bestand geselecteerd" "Resetten" @@ -1317,7 +1329,7 @@ "%s USB-drive" "USB-opslag" "Bewerken" - "Waarschuwing v. gegevensgebruik" + "Melding voor datagebruik" "Tik voor gebruik en instellingen" "Gegevenslimiet van 2G-3G bereikt" "Gegevenslimiet van 4G bereikt" @@ -1515,7 +1527,7 @@ "Onbekend portret" "Onbekend landschap" "Geannuleerd" - "Fout bij schrijven van inhoud" + "Fout bij schrijven van content" "onbekend" "Afdrukservice niet ingeschakeld" "%s-service geïnstalleerd" @@ -1636,6 +1648,7 @@ "Typ een taalnaam" "Voorgesteld" "Alle talen" + "Alle regio\'s" "Zoeken" "Werkmodus is UIT" "Functioneren van werkprofiel toestaan, waaronder apps, synchronisatie op de achtergrond en gerelateerde functies." diff --git a/core/res/res/values-pa-rIN/strings.xml b/core/res/res/values-pa-rIN/strings.xml index e717e697f178bd1ca5a1ba71b3d6f4a536f4af18..9658e1e1579096b781323a7d0406ca975be8091f 100644 --- a/core/res/res/values-pa-rIN/strings.xml +++ b/core/res/res/values-pa-rIN/strings.xml @@ -214,6 +214,7 @@ "ਫੋਨ ਚੋਣਾਂ" "ਸਕ੍ਰੀਨ ਲੌਕ" "ਪਾਵਰ ਬੰਦ" + "ਸੰਕਟਕਾਲ" "ਬਗ ਰਿਪੋਰਟ" "ਬਗ ਰਿਪੋਰਟ ਲਓ" "ਇਹ ਇੱਕ ਈ-ਮੇਲ ਸੁਨੇਹਾ ਭੇਜਣ ਲਈ, ਤੁਹਾਡੀ ਵਰਤਮਾਨ ਡੀਵਾਈਸ ਬਾਰੇ ਜਾਣਕਾਰੀ ਇਕੱਤਰ ਕਰੇਗਾ। ਬਗ ਰਿਪੋਰਟ ਸ਼ੁਰੂ ਕਰਨ ਵਿੱਚ ਥੋੜ੍ਹਾ ਸਮਾਂ ਲੱਗੇਗਾ ਜਦੋਂ ਤੱਕ ਇਹ ਭੇਜੇ ਜਾਣ ਲਈ ਤਿਆਰ ਨਾ ਹੋਵੇ, ਕਿਰਪਾ ਕਰਕੇ ਧੀਰਜ ਰੱਖੋ।" @@ -362,7 +363,7 @@ "ਐਪ ਨੂੰ ਤੁਹਾਡਾ ਅਨੁਮਾਨਿਤ ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਨੈੱਟਵਰਕ ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਸਰੋਤ ਵਰਤਦੇ ਹੋਏ ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਸੇਵਾਵਾਂ ਰਾਹੀਂ ਪ੍ਰਾਪਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਜਿਵੇਂ ਸੈਲ ਟਾਵਰ ਅਤੇ Wi-Fi. ਇਹ ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਸੇਵਾਵਾਂ ਚਾਲੂ ਅਤੇ ਐਪ ਨੂੰ ਉਹਨਾਂ ਨੂੰ ਵਰਤਣ ਲਈ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਤੇ ਹੋਣੀਆਂ ਚਾਹੀਦੀਆਂ ਹਨ। ਐਪਸ ਇਸਦੀ ਵਰਤੋਂ ਇਹ ਅਨੁਮਾਨ ਲਗਾਉਣ ਲਈ ਕਰ ਸਕਦੇ ਹਨ ਕਿ ਤੁਸੀਂ ਕਿੱਥੇ ਹੋ।" "ਆਪਣੀਆਂ ਔਡੀਓ ਸੈਟਿੰਗਾਂ ਬਦਲੋ" "ਔਪ ਨੂੰ ਗਲੋਬਲ ਔਡੀਓ ਸੈਟਿੰਗਾਂ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ ਜਿਵੇਂ ਵੌਲਿਊਮ ਅਤੇ ਆਊਟਪੁਟ ਲਈ ਕਿਹੜਾ ਸਪੀਕਰ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ।" - "ਔਡੀਓ ਰਿਕਾਰਡ ਕਰੋ" + "ਔਡੀਓ ਰਿਕਾਰਡ ਕਰਨ" "ਐਪ ਨੂੰ ਮਾਈਕ੍ਰੋਫੋਨ ਨਾਲ ਔਡੀਓ ਰਿਕਾਰਡ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ ਅਨੁਮਤੀ ਐਪ ਨੂੰ ਤੁਹਾਡੀ ਪੁਸ਼ਟੀ ਤੋਂ ਬਿਨਾਂ ਕਿਸੇ ਵੀ ਸਮੇਂ ਔਡੀਓ ਰਿਕਾਰਡ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦੀ ਹੈ।" "SIM ਨੂੰ ਕਮਾਂਡਾਂ ਭੇਜੋ" "ਐਪ ਨੂੰ SIM ਨੂੰ ਕਮਾਂਡਾਂ ਭੇਜਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ ਬਹੁਤ ਘਾਤਕ ਹੈ।" @@ -1076,6 +1077,17 @@ "Wi-Fi ਦੀ ਕੋਈ ਇੰਟਰਨੈਟ ਪਹੁੰਚ ਨਹੀਂ ਹੈ" "ਵਿਕਲਪਾਂ ਲਈ ਟੈਪ ਕਰੋ" + "ਬਦਲਕੇ %1$s ਲਿਆਂਦਾ ਗਿਆ" + "%2$s ਦੀ ਇੰਟਰਨੈੱਟ \'ਤੇ ਪਹੁੰਚ ਨਾ ਹੋਣ \'ਤੇ ਡੀਵਾਈਸ %1$s ਦੀ ਵਰਤੋਂ ਕਰਦੀ ਹੈ। ਖਰਚੇ ਲਾਗੂ ਹੋ ਸਕਦੇ ਹਨ।" + "%1$s ਤੋਂ ਬਦਲਕੇ %2$s \'ਤੇ ਕੀਤਾ ਗਿਆ" + + "ਸੈਲਿਊਲਰ ਡੈਟਾ" + "Wi-Fi" + "ਬਲੂਟੁੱਥ" + "ਈਥਰਨੈੱਟ" + "VPN" + + "ਇੱਕ ਅਗਿਆਤ ਨੈੱਟਵਰਕ ਕਿਸਮ" "Wi-Fi ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਕਰ ਸਕਿਆ" " ਇਸਦਾ ਇੱਕ ਖ਼ਰਾਬ ਇੰਟਰਨੈਟ ਕਨੈਕਸ਼ਨ ਹੈ।" "ਕੀ ਕਨੈਕਸ਼ਨ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?" @@ -1153,7 +1165,6 @@ "ਭਾਸ਼ਾ ਅਤੇ ਖਾਕਾ ਚੁਣਨ ਲਈ ਟੈਪ ਕਰੋ" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "ਉਮੀਦਵਾਰ" "%s ਤਿਆਰ ਹੋ ਰਿਹਾ ਹੈ" "ਤਰੁੱਟੀਆਂ ਦੀ ਜਾਂਚ ਕਰ ਰਿਹਾ ਹੈ" "ਨਵੇਂ %s ਦਾ ਪਤਾ ਲਗਾਇਆ ਗਿਆ" @@ -1232,8 +1243,9 @@ "%s ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ। ਨੈੱਟਵਰਕ ਦੇ ਪ੍ਰਬੰਧਨ ਲਈ ਟੈਪ ਕਰੋ।" "ਹਮੇਸ਼ਾਂ-ਚਾਲੂ VPN ਕਨੈਕਟ ਕਰ ਰਿਹਾ ਹੈ..." "ਹਮੇਸ਼ਾਂ-ਚਾਲੂ VPN ਕਨੈਕਟ ਕੀਤਾ" + "ਹਮੇਸ਼ਾ-ਚਾਲੂ VPN ਡਿਸਕਨੈਕਟ ਕੀਤਾ ਗਿਆ" "ਹਮੇਸ਼ਾਂ-ਚਾਲੂ VPN ਅਸ਼ੁੱਧੀ" - "ਸੰਰੂਪਣ ਲਈ ਟੈਪ ਕਰੋ" + "ਸਥਾਪਤ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ" "ਫਾਈਲ ਚੁਣੋ" "ਕੋਈ ਫਾਈਲ ਨਹੀਂ ਚੁਣੀ ਗਈ" "ਰੀਸੈੱਟ ਕਰੋ" @@ -1317,7 +1329,7 @@ "%s USB ਡ੍ਰਾਇਵ" "USB ਸਟੋਰੇਜ" "ਸੰਪਾਦਿਤ ਕਰੋ" - "ਡੈਟਾ ਉਪਯੋਗ ਚਿਤਾਵਨੀ" + "ਡੈਟਾ ਵਰਤੋਂ ਚੇਤਾਵਨੀ" "ਵਰਤੋਂ ਅਤੇ ਸੈਟਿੰਗਾਂ ਨੂੰ ਵੇਖਣ ਲਈ ਟੈਪ ਕਰੋ।" "2G-3G ਡੈਟਾ ਸੀਮਾ ਪੂਰੀ ਹੋ ਗਈ" "4G ਡੈਟਾ ਸੀਮਾ ਪੂਰੀ ਹੋਈ" @@ -1636,6 +1648,7 @@ "ਭਾਸ਼ਾ ਨਾਮ ਟਾਈਪ ਕਰੋ" "ਸੁਝਾਈਆਂ ਗਈਆਂ" "ਸਾਰੀਆਂ ਭਾਸ਼ਾਵਾਂ" + "ਸਾਰੇ ਖੇਤਰ" "ਖੋਜ" "ਕੰਮ ਮੋਡ ਬੰਦ ਹੈ" "ਐਪਾਂ, ਬੈਕਗ੍ਰਾਊਂਡ ਸਮਕਾਲੀਕਰਨ, ਅਤੇ ਸਬੰਧਿਤ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਸ਼ਾਮਲ ਕਰਦੇ ਹੋਏ ਕੰਮ ਪ੍ਰੋਫਾਈਲ ਨੂੰ ਕੰਮ ਕਰਨ ਦੀ ਮਨਜ਼ੂਰੀ ਦਿਓ।" diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index d9e63a626d3180c0574c656cc073171978f52280..dbe29ee33993a30b047c7263b76974dbe123c46e 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -218,6 +218,7 @@ "Opcje telefonu" "Blokada ekranu" "Wyłącz" + "Alarmowy" "Zgłoszenie błędu" "Zgłoś błąd" "Informacje o bieżącym stanie urządzenia zostaną zebrane i wysłane e-mailem. Przygotowanie zgłoszenia błędu do wysłania chwilę potrwa, więc zachowaj cierpliwość." @@ -1126,6 +1127,17 @@ "Sieć Wi-Fi nie ma dostępu do internetu" "Kliknij, by wyświetlić opcje" + "Zmieniono na połączenie typu %1$s" + "Urządzenie korzysta z połączenia typu %1$s, gdy %2$s nie dostępu do internetu. Mogą zostać naliczone opłaty." + "Przełączono z połączenia typu %1$s na %2$s." + + "komórkowa transmisja danych" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "nieznany typ sieci" "Nie można połączyć się z siecią Wi-Fi." " ma powolne połączenie internetowe." "Zezwolić na połączenie?" @@ -1203,7 +1215,6 @@ "Kliknij, by wybrać język i układ" " AĄBCĆDEĘFGHIJKLŁMNŃOÓPQRSŚTUVWXYZŹŻ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "kandydaci" "Przygotowuję: %s" "Sprawdzanie w poszukiwaniu błędów" "Wykryto nowy nośnik: %s" @@ -1282,8 +1293,9 @@ "Nawiązano połączenie: %s. Dotknij, aby zarządzać siecią." "Łączę ze stałą siecią VPN…" "Połączono ze stałą siecią VPN" + "Rozłączono ze stałą siecią VPN" "Błąd stałej sieci VPN" - "Kliknij, by skonfigurować" + "Kliknij, by skonfigurować" "Wybierz plik" "Nie wybrano pliku" "Resetuj" @@ -1369,7 +1381,7 @@ "Dysk USB (%s)" "Nośnik USB" "Edytuj" - "Ostrzeżenie o transmisji danych" + "Alert transmisji danych" "Kliknij, by wyświetlić użycie i ustawienia." "Osiągnięto limit danych 2G/3G" "Osiągnięto limit danych 4G" @@ -1708,6 +1720,7 @@ "Wpisz nazwę języka" "Sugerowane" "Wszystkie języki" + "Wszystkie kraje" "Szukaj" "Tryb pracy jest WYŁĄCZONY" "Włącz profil do pracy, w tym aplikacje, synchronizację w tle i inne funkcje." diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index eaaad25c91d8585f479ec8e46617175c98c32ece..4f3b09fd5ca6a5a385911a9b4505f87d3c689da9 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -214,6 +214,7 @@ "Opções do telefone" "Bloquear tela" "Desligar" + "Emergência" "Relatório de bugs" "Obter relatório de bugs" "Isto coletará informações sobre o estado atual do dispositivo para enviá-las em uma mensagem de e-mail. Após iniciar o relatório de bugs, será necessário aguardar algum tempo até que esteja pronto para ser enviado." @@ -1076,6 +1077,17 @@ "O Wi-Fi não tem acesso à Internet" "Toque para ver opções" + "Alternado para %1$s" + "O dispositivo usa %1$s quando %2$s não tem acesso à Internet. Cobranças podem ser aplicadas." + "Alternado de %1$s para %2$s" + + "dados da rede celular" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "um tipo de rede desconhecido" "Não foi possível se conectar a redes Wi-Fi" " tem uma conexão de baixa qualidade com a Internet." "Permitir conexão?" @@ -1153,7 +1165,6 @@ "Toque para selecionar o idioma e o layout" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "candidatos" "Preparando %s" "Procurando erros" "Novo %s detectado" @@ -1232,8 +1243,9 @@ "Conectado a %s. Toque para gerenciar a rede." "VPN sempre ativa conectando..." "VPN sempre ativa conectada" + "VPN sempre ativa desconectada" "Erro na VPN sempre ativa" - "Toque para configurar" + "Toque para configurar" "Escolher arquivo" "Nenhum arquivo escolhido" "Redefinir" @@ -1317,7 +1329,7 @@ "Drive USB %s" "Armazenamento USB" "Editar" - "Aviso sobre uso de dados" + "Alerta de uso de dados" "Toque para ver uso e config." "Limite de dados 2G-3G atingido" "Limite de dados 4G atingido" @@ -1636,6 +1648,7 @@ "Digitar nome do idioma" "Sugeridos" "Todos os idiomas" + "Todas as regiões" "Pesquisa" "Modo de trabalho DESATIVADO" "Permitir que o perfil de trabalho funcione, incluindo apps, sincronização em segundo plano e recursos relacionados" diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index ae115d8775880994492c0bdc3b0c0138923cc837..64db1c2ad70b7dac5b2ee9a5592e7cca8f3f692c 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -214,6 +214,7 @@ "Opções do telefone" "Bloqueio de ecrã" "Desligar" + "Emergência" "Relatório de erros" "Criar relatório de erros" "Será recolhida informação sobre o estado atual do seu dispositivo a enviar através de uma mensagem de email. Demorará algum tempo até que o relatório de erro esteja pronto para ser enviado. Aguarde um pouco." @@ -1076,6 +1077,17 @@ "O Wi-Fi não tem acesso à Internet" "Toque para obter mais opções" + "Mudou para %1$s" + "O dispositivo utiliza %1$s quando %2$s não tem acesso à Internet. Podem ser aplicados custos." + "Mudou de %1$s para %2$s" + + "dados móveis" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "um tipo de rede desconhecido" "Não foi possível ligar a Wi-Fi" " tem uma ligação à internet fraca." "Permitir ligação?" @@ -1153,7 +1165,6 @@ "Toque para selecionar o idioma e o esquema" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "candidatos" "A preparar o %s" "A verificar a presença de erros" "Novo %s detetado" @@ -1232,8 +1243,9 @@ "Ligado a %s. Toque para gerir a rede." "A ligar VPN sempre ativa..." "VPN sempre ativa ligada" + "VPN sempre ativa desligada" "Erro da VPN sempre ativa" - "Toque para configurar" + "Tocar para configurar" "Escolher ficheiro" "Não foi selecionado nenhum ficheiro" "Repor" @@ -1310,14 +1322,14 @@ "Mais opções" "%1$s, %2$s" "%1$s, %2$s, %3$s" - "Armazenamento interno partilhado" + "Armazen. interno partilhado" "Cartão SD" "Cartão SD %s" "Unidade USB" "Unidade USB %s" "Armazenamento USB" "Editar" - "Aviso de utilização de dados" + "Alerta de utilização de dados" "Toque para ver a utilização e definições" "Limite de dados 2G/3G atingido" "Limite de dados 4G atingido" @@ -1636,6 +1648,7 @@ "Intr. nome do idioma" "Sugeridos" "Todos os idiomas" + "Todas as regiões" "Pesquisa" "Modo de trabalho DESATIVADO" "Permitir o funcionamento do perfil de trabalho, incluindo as aplicações, a sincronização em segundo plano e as funcionalidades relacionadas." diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index eaaad25c91d8585f479ec8e46617175c98c32ece..4f3b09fd5ca6a5a385911a9b4505f87d3c689da9 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -214,6 +214,7 @@ "Opções do telefone" "Bloquear tela" "Desligar" + "Emergência" "Relatório de bugs" "Obter relatório de bugs" "Isto coletará informações sobre o estado atual do dispositivo para enviá-las em uma mensagem de e-mail. Após iniciar o relatório de bugs, será necessário aguardar algum tempo até que esteja pronto para ser enviado." @@ -1076,6 +1077,17 @@ "O Wi-Fi não tem acesso à Internet" "Toque para ver opções" + "Alternado para %1$s" + "O dispositivo usa %1$s quando %2$s não tem acesso à Internet. Cobranças podem ser aplicadas." + "Alternado de %1$s para %2$s" + + "dados da rede celular" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "um tipo de rede desconhecido" "Não foi possível se conectar a redes Wi-Fi" " tem uma conexão de baixa qualidade com a Internet." "Permitir conexão?" @@ -1153,7 +1165,6 @@ "Toque para selecionar o idioma e o layout" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "candidatos" "Preparando %s" "Procurando erros" "Novo %s detectado" @@ -1232,8 +1243,9 @@ "Conectado a %s. Toque para gerenciar a rede." "VPN sempre ativa conectando..." "VPN sempre ativa conectada" + "VPN sempre ativa desconectada" "Erro na VPN sempre ativa" - "Toque para configurar" + "Toque para configurar" "Escolher arquivo" "Nenhum arquivo escolhido" "Redefinir" @@ -1317,7 +1329,7 @@ "Drive USB %s" "Armazenamento USB" "Editar" - "Aviso sobre uso de dados" + "Alerta de uso de dados" "Toque para ver uso e config." "Limite de dados 2G-3G atingido" "Limite de dados 4G atingido" @@ -1636,6 +1648,7 @@ "Digitar nome do idioma" "Sugeridos" "Todos os idiomas" + "Todas as regiões" "Pesquisa" "Modo de trabalho DESATIVADO" "Permitir que o perfil de trabalho funcione, incluindo apps, sincronização em segundo plano e recursos relacionados" diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 6198f126379fbc93e9052bec51d17fc0cba3efe6..192d9c1a1f95470d71794949b1a50bbc3a684058 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -216,6 +216,7 @@ "Opțiuni telefon" "Blocați ecranul" "Opriți alimentarea" + "Urgență" "Raport despre erori" "Executați un raport despre erori" "Acest raport va colecta informații despre starea actuală a dispozitivului, pentru a le trimite într-un e-mail. Aveți răbdare după pornirea raportului despre erori până când va fi gata de trimis." @@ -1101,6 +1102,17 @@ "Rețeaua Wi-Fi nu are acces la internet" "Atingeți pentru opțiuni" + "S-a comutat la %1$s" + "Dispozitivul folosește %1$s când %2$s nu are acces la internet. Se pot aplica taxe." + "S-a comutat de la %1$s la %2$s" + + "date mobile" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "un tip de rețea necunoscut" "Nu se poate conecta la Wi-Fi" " are o conexiune la internet slabă." "Permiteți conectarea?" @@ -1178,7 +1190,6 @@ "Atingeți pentru a selecta limba și aspectul" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "candidați" "Se pregătește %s" "Se verifică dacă există erori" "A fost detectat un nou %s" @@ -1257,8 +1268,9 @@ "Conectat la %s. Apăsați pentru a gestiona rețeaua." "Se efectuează conectarea la rețeaua VPN activată permanent…" "Conectat(ă) la rețeaua VPN activată permanent" + "Rețeaua VPN activată permanent a fost deconectată" "Eroare de rețea VPN activată permanent" - "Atingeți ca să configurați" + "Atingeți pentru a configura" "Alegeți un fișier" "Nu au fost găsite fișiere" "Resetați" @@ -1343,7 +1355,7 @@ "Unitate USB %s" "Dsipozitiv de stocare USB" "Editați" - "Avertisment de utiliz. a datelor" + "Alertă pentru utilizarea datelor" "Atingeți ca să vedeți utilizarea/setările." "Ați atins limita de date 2G-3G" "Ați atins limita de date 4G" @@ -1672,6 +1684,7 @@ "Numele limbii" "Sugerate" "Toate limbile" + "Toate regiunile" "Căutați" "Modul de serviciu e DEZACTIVAT" "Permiteți profilului de serviciu să funcționeze, inclusiv aplicațiile, sincronizarea în fundal și funcțiile asociate." diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 0ef96afb12199aceb916d0dcde0d8d608b52b812..b1b14f9d22922d512984fca6b6fc7dbad46eea2a 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -218,6 +218,7 @@ "Параметры телефона" "Блокировка экрана" "Отключить питание" + "Экстренный вызов" "Отчет об ошибке" "Отчет об ошибке" "Информация о текущем состоянии вашего устройства будет собрана и отправлена по электронной почте. Подготовка отчета займет некоторое время." @@ -1126,6 +1127,17 @@ "Сеть Wi-Fi не подключена к Интернету" "Нажмите, чтобы показать варианты." + "Новое подключение: %1$s" + "Устройство использует %1$s, если подключение к сети %2$s недоступно. Может взиматься плата за передачу данных." + "Устройство отключено от сети %2$s и теперь использует %1$s" + + "мобильные данные" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "неизвестный тип сети" "Не удалось подключиться к сети Wi-Fi" " – плохое интернет-соединение." "Разрешить подключение?" @@ -1203,7 +1215,6 @@ "Нажмите, чтобы выбрать язык и раскладку" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "варианты" "Подготовка карты \"%s\"…" "Поиск ошибок" "Обнаружена новая карта \"%s\"" @@ -1282,8 +1293,9 @@ "Подключено: \"%s\". Нажмите здесь, чтобы изменить настройки сети." "Подключение…" "Подключено" + "Отключено" "Ошибка" - "Нажмите, чтобы настроить." + "Нажмите, чтобы настроить" "Выбрать файл" "Не выбран файл" "Сбросить" @@ -1369,7 +1381,7 @@ "USB-накопитель %s" "USB-накопитель" "Изменить" - "Осталось мало трафика" + "Лимит на передачу данных" "Нажмите, чтобы проверить трафик и настройки." "Достигнут лимит трафика 2G/3G" "Достигнут лимит трафика 4G" @@ -1708,6 +1720,7 @@ "Введите язык" "Рекомендуемые" "Все языки" + "Все регионы" "Поиск" "Рабочий режим отключен" "Включить рабочий профиль: приложения, фоновую синхронизацию и связанные функции." diff --git a/core/res/res/values-si-rLK/strings.xml b/core/res/res/values-si-rLK/strings.xml index 4f90b57d89978e2d115e6f58e84efc7dc4581399..f3c8e7bad0d6c9ad15795733ddb8e6e8a9cc7e9a 100644 --- a/core/res/res/values-si-rLK/strings.xml +++ b/core/res/res/values-si-rLK/strings.xml @@ -214,6 +214,7 @@ "දුරකථන විකල්ප" "තිර අගුල" "බලය අක්‍රිය කරන්න" + "හදිසි" "දෝෂ වර්තාව" "දෝෂ වාර්තාවක් ගන්න" "ඊ-තැපැල් පණිවිඩයක් ලෙස යැවීමට මෙය ඔබගේ වත්මන් උපාංග තත්වය ගැන තොරතුරු එකතු කරනු ඇත. දෝෂ වාර්තාව ආරම්භ කර එය යැවීමට සූදානම් කරන තෙක් එයට කිසියම් කාලයක් ගතවනු ඇත; කරුණාකර ඉවසන්න." @@ -1078,6 +1079,17 @@ "Wi-Fi හට අන්තර්ජාල ප්‍රවේශය නැත" "විකල්ප සඳහා තට්ටු කරන්න" + "%1$s වෙත මාරු විය" + "උපාංගය %1$s %2$s සඳහා අන්තර්ජාල ප්‍රවේශය නැති විට භාවිත කරයි. ගාස්තු අදාළ විය හැකිය." + "%1$s සිට %2$s වෙත මාරු විය" + + "සෙලියුලර් දත්ත" + "Wi-Fi" + "බ්ලූටූත්" + "ඊතර්නෙට්" + "VPN" + + "නොදන්නා ජාල වර්ගයකි" "Wi-Fi වෙත සම්බන්ධ විය නොහැක" " දුබල අන්තර්ජාල සම්බන්ධතාවයක් ඇත." "සම්බන්ධතාවයට ඉඩ දෙන්නද?" @@ -1155,7 +1167,6 @@ "භාෂාව හා පිරිසැලසුම තේරීමට තට්ටු කරන්න" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "අපේක්ෂකයන්" "%s සූදානම් කරමින්" "වැරදි සඳහා පරීක්ෂා කරමින්" "නව %s අනාවරණය කරන ලදි" @@ -1234,8 +1245,9 @@ "%s වෙත සම්බන්ධිතයි. ජාලය කළමනාකරණය කිරීමට තට්ටු කරන්න." "සැමවිටම VPN සම්බන්ධ වෙමින්…" "නිරතුරුවම VPN සම්බන්ධ කර ඇත" + "සැමවිට ක්‍රියාත්මක VPN විසන්ධි කරන ලදී" "සැමවිට සක්‍රිය VPN දෝෂය" - "වින්‍යාස කිරීමට තට්ටු කරන්න" + "පිහිටුවීමට තට්ටු කරන්න" "ගොනුව තෝරන්න" "ගොනුවක් තෝරාගෙන නැත" "යළි පිහිටුවන්න" @@ -1319,7 +1331,7 @@ "%s USB ධාවකය" "USB ආචයනය" "සංස්කරණය කරන්න" - "දත්ත භාවිතා අවවාදය" + "දත්ත භාවිතය ගැන ඇඟවීම" "භාවිතය සහ සැකසීම් බැලීමට තට්ටු කරන්න." "2G-3G දත්ත සීමාවට ළඟාවී ඇත" "4G දත්ත සීමාවට ළඟාවී ඇත" @@ -1638,6 +1650,7 @@ "භාෂා නම ටයිප් කරන්න" "යෝජිත" "සියලු භාෂා" + "සියලු ප්‍රදේශ" "සෙවීම" "වැඩ ප්‍රකාරය ක්‍රියාවිරහිතයි" "යෙදුම්, පසුබිම සමමුහුර්ත කිරීම, සහ සම්බන්ධිත විශේෂාංග ඇතුළුව, ක්‍රියා කිරීමට කාර්යාල පැතිකඩට ඉඩ දෙන්න" diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 0a4869327367f65a553d4825d81f18e61f681a6d..a94c3b40d5dc05cb2cddb0a632d856743caf38ab 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -218,6 +218,7 @@ "Možnosti telefónu" "Zámka obrazovky" "Vypnúť" + "Tiesňové volanie" "Hlásenie o chybách" "Vytvoriť hlásenie chyby" "Týmto zhromaždíte informácie o aktuálnom stave zariadenia. Informácie je potom možné odoslať e-mailom, chvíľu však potrvá, kým bude hlásenie chyby pripravené na odoslanie. Prosíme vás preto o trpezlivosť." @@ -1126,6 +1127,17 @@ "Sieť Wi-Fi nemá prístup k internetu" "Klepnutím získate možnosti" + "Prepnuté na sieť: %1$s" + "Keď sieť %2$s nemá prístup k internetu, zariadenie používa sieť %1$s. Môžu sa účtovať poplatky." + "Prepnuté zo siete %1$s na sieť %2$s" + + "mobilné dáta" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "neznámy typ siete" "Nepodarilo sa pripojiť k sieti Wi-Fi" " má nekvalitné internetové pripojenie." "Povoliť pripojenie?" @@ -1203,7 +1215,6 @@ "Klepnutím vyberte jazyk a rozloženie" " AÁÄBCČDĎDZDŽEÉFGHCHIÍJKLĽMNŇOÓÔPRŔSŠTŤUÚVWXYÝZŽ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "kandidáti" "Pripravuje sa úložisko %s" "Prebieha kontrola chýb" "Bolo zistené nové úložisko %s" @@ -1282,8 +1293,9 @@ "Pripojené k relácii %s. Po klepnutí môžete sieť spravovať." "Pripájanie k vždy zapnutej sieti VPN…" "Pripojenie k vždy zapnutej sieti VPN" + "Vždy zapnutá sieť VPN bola odpojená" "Chyba vždy zapnutej siete VPN" - "Klepnutím spustíte konfiguráciu" + "Klepnutím prejdete do Nastavení" "Zvoliť súbor" "Nie je vybratý žiadny súbor" "Obnoviť" @@ -1369,7 +1381,7 @@ "Disk USB %s" "Ukladací priestor USB" "Upraviť" - "Upozornenie o využití dát" + "Upozornenie na spotrebu dát" "Klepnutím zobrazíte využitie a nastavenia." "Bol dosiahnutý limit 2G–3G" "Bol dosiahnutý limit 4G" @@ -1664,7 +1676,7 @@ "Do %1$s" "Do %1$s (ďalší budík)" - "Dokým túto funkciu nevypnete" + "Kým túto funkciu nevypnete" "Dokým nevypnete stav Nerušiť" "%1$s / %2$s" "Zbaliť" @@ -1708,6 +1720,7 @@ "Zadajte názov jazyka" "Navrhované" "Všetky jazyky" + "Všetky regióny" "Vyhľadávanie" "Pracovný režim je VYPNUTÝ" "Povoľte fungovanie pracovného profilu vrátane aplikácií, synchronizácie na pozadí a súvisiacich funkcií." diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 7b8a03aa19abe923b753d013a36a5adbd1713537..a19643b13533ca63e0391fa7000df5243a033e95 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -218,6 +218,7 @@ "Možnosti telefona" "Zaklep zaslona" "Izklopi" + "Klic v sili" "Poročilo o napakah" "Ustvari poročilo o napakah" "S tem bodo zbrani podatki o trenutnem stanju naprave, ki bodo poslani v e-poštnem sporočilu. Izvedba poročila o napakah in priprava trajata nekaj časa, zato bodite potrpežljivi." @@ -1126,6 +1127,17 @@ "Omrežje Wi-Fi nima dostopa do interneta" "Dotaknite se za možnosti" + "Preklopljeno na omrežje vrste %1$s" + "Naprava uporabi omrežje vrste %1$s, ko omrežje vrste %2$s nima dostopa do interneta. Prenos podatkov se lahko zaračuna posebej." + "Preklopljeno z omrežja vrste %1$s na omrežje vrste %2$s" + + "prenos podatkov v mobilnih omrežjih" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "neznana vrsta omrežja" "Z omrežjem Wi-Fi se ni mogoče povezati" " ima slabo internetno povezavo." "Ali dovolite vzpostavitev povezave?" @@ -1203,7 +1215,6 @@ "Dotaknite se, če želite izbrati jezik in postavitev." " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "kandidati" "Pripravljanje shrambe %s" "Iskanje napak" "Zaznana je bila nova shramba %s" @@ -1282,8 +1293,9 @@ "Povezan z mestom %s. Tapnite za upravljanje omrežja." "Povezovanje v stalno vklopljeno navidezno zasebno omrežje ..." "Vzpostavljena povezava v stalno vklopljeno navidezno zasebno omrežje" + "Povezava s stalno vklopljenim VPN-jem je prekinjena" "Napaka stalno vklopljenega navideznega zasebnega omrežja" - "Dotanite se, če želite konfigurirati" + "Dotaknite se, če želite nastaviti" "Izberi datoteko" "Nobena datoteka ni izbrana" "Ponastavi" @@ -1369,7 +1381,7 @@ "Pogon USB %s" "Pomnilnik USB" "Uredi" - "Opozorilo o uporabi podatkov" + "Opozorilo o preneseni količini podatkov" "Dot. se za ogled upor. in nast." "Dosežena pod. omejitev za 2G/3G" "Dosežena pod. omejitev za 4G" @@ -1708,6 +1720,7 @@ "Vnesite ime jezika" "Predlagano" "Vsi jeziki" + "Vse regije" "Išči" "Delovni način IZKLOPLJEN" "Dovoljeno delovanje delovnega profila, vključno z aplikacijami, sinhronizacijo v ozadju in povezanimi funkcijami." diff --git a/core/res/res/values-sq-rAL/strings.xml b/core/res/res/values-sq-rAL/strings.xml index 05f0e597c5e7ad1ccdbc15ef0987b5254c834def..624b00466a757e02626b15630e09520f7eac0d46 100644 --- a/core/res/res/values-sq-rAL/strings.xml +++ b/core/res/res/values-sq-rAL/strings.xml @@ -214,6 +214,7 @@ "Opsionet e telefonit" "Kyçja e ekranit" "Fik" + "Urgjenca" "Raporti i defekteve në kod" "Merr raportin e defekteve në kod" "Ky funksion mundëson mbledhjen e informacioneve mbi gjendjen aktuale të pajisjes për ta dërguar si mesazh mail-i. Do të duhet pak kohë nga nisja e raportit të defekteve në kod. Faleminderit për durimin." @@ -1076,6 +1077,17 @@ "Wi-Fi nuk ka qasje në internet" "Trokit për opsionet" + "Kaloi te %1$s" + "Pajisja përdor %1$s kur %2$s nuk ka qasje në internet. Mund të zbatohen tarifa." + "Kaloi nga %1$s te %2$s" + + "të dhënat celulare" + "Wi-Fi" + "Bluetooth" + "Eternet" + "VPN" + + "një lloj rrjeti i panjohur" "Nuk mund të lidhej me Wi-Fi" " ka një lidhje të dobët interneti." "Të lejohet lidhja?" @@ -1153,7 +1165,6 @@ "Trokit për të zgjedhur gjuhën dhe strukturën" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "kandidatë" "Po përgatit %s" "Po kontrollon për gabime" "U zbulua karta e re %s" @@ -1232,8 +1243,9 @@ "Lidhur me %s. Trokit për të menaxhuar rrjetin." "Po lidh VPN-në për aktivizim të përhershëm…" "VPN e lidhur në mënyrë të përhershme" + "Rrjeti VPN gjithmonë aktiv u shkëput" "Gabimi VPN-je për aktivizimin e përhershëm" - "Trokit për të konfiguruar" + "Trokit për ta konfiguruar" "Zgjidh skedarin" "Nuk u zgjodh asnjë skedar" "Rivendos" @@ -1317,7 +1329,7 @@ "USB-ja nga %s" "Hapësira ruajtëse e USB-së" "Redakto" - "Paralajmërim për përdorimin e të dhënave" + "Sinjalizimi i të dhënave" "Trokit për të parë përdorimin dhe cilësimet." "Kufiri i të dhënave 2G-3G u arrit" "Kufiri i të dhënave 4G u arrit" @@ -1636,6 +1648,7 @@ "Shkruaj emrin e gjuhës" "Sugjeruar" "Të gjitha gjuhët" + "Të gjitha rajonet" "Kërko" "Modaliteti i punës është JOAKTIV" "Lejoje profilin e punës të funksionojë, duke përfshirë aplikacionet, sinkronizimin në sfond dhe funksionet e lidhura." diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 517d77752293847694291f156694138c6ed4009d..395b049c1d2d700b16ce72adcc37014f889fdbcd 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -152,7 +152,7 @@ "Није могуће потврдити аутентичност." "Потврда идентитета преко прокси сервера није успела." "Није могуће повезати се са сервером." - "Није могуће комуницирати са сервером. Покушајте поново касније." + "Није могуће комуницирати са сервером. Пробајте поново касније." "Веза са сервером је истекла." "Страница садржи превише веза за преусмеравање са сервера." "Протокол није подржан." @@ -160,7 +160,7 @@ "Страницу није могуће отворити зато што је URL адреса неважећа." "Није могуће приступити датотеци." "Није могуће пронаћи тражену датотеку." - "Превише захтева се обрађује. Покушајте поново касније." + "Превише захтева се обрађује. Пробајте поново касније." "Грешка при пријављивању за %1$s" "Синхронизација" "Синхронизација" @@ -216,6 +216,7 @@ "Опције телефона" "Закључај екран" "Искључи" + "Хитни позив" "Извештај о грешци" "Направи извештај о грешци" "Овим ће се прикупити информације о тренутном стању уређаја како би биле послате у поруци е-поште. Од започињања извештаја о грешци до тренутка за његово слање проћи ће неко време; будите стрпљиви." @@ -256,9 +257,9 @@ "Складиште" "приступа сликама, медијима и датотекама на уређају" "Микрофон" - "снима аудио снимке" + "снима аудио" "Камера" - "снима слике и видео снимке" + "снима слике и видео" "Телефон" "упућује телефонске позиве и управља њима" "Сензори за тело" @@ -439,19 +440,19 @@ "Дозвољава апликацији да активира методе за додавање и брисање шаблона отисака прстију који ће се користити." "користи хардвер за отиске прстију" "Дозвољава апликацији да користи хардвер за отиске прстију ради потврде аутентичности" - "Откривен је делимични отисак прста. Покушајте поново." - "Није успела обрада отиска прста. Покушајте поново." + "Откривен је делимични отисак прста. Пробајте поново." + "Није успела обрада отиска прста. Пробајте поново." "Сензор за отиске прстију је прљав. Очистите га и покушајте поново." - "Пребрзо сте померили прст. Покушајте поново." - "Превише споро сте померили прст. Покушајте поново." + "Пребрзо сте померили прст. Пробајте поново." + "Превише споро сте померили прст. Пробајте поново." "Хардвер за отиске прстију није доступан." "Није могуће сачувати отисак прста. Уклоните неки од постојећих отисака прстију." - "Временско ограничење за отисак прста је истекло. Покушајте поново." + "Временско ограничење за отисак прста је истекло. Пробајте поново." "Радња са отиском прста је отказана." - "Превише покушаја. Покушајте поново касније." - "Покушајте поново." + "Превише покушаја. Пробајте поново касније." + "Пробајте поново." "Прст %d" @@ -679,8 +680,8 @@ "Хитне службе" "Назад на позив" "Тачно!" - "Покушајте поново" - "Покушајте поново" + "Пробајте поново" + "Пробајте поново" "Откључај за све функције и податке" "Премашен је највећи дозвољени број покушаја Откључавања лицем" "Нема SIM картице" @@ -704,19 +705,19 @@ "Погледајте Кориснички водич или контактирајте Корисничку подршку." "SIM картица је закључана." "Откључавање SIM картице…" - "%1$d пута сте неправилно нацртали шаблон за откључавање. \n\nПокушајте поново за %2$d секунде(и)." - "%1$d пута сте погрешно унели лозинку. \n\nПокушајте поново за %2$d секунде(и)." - "%1$d пута сте погрешно унели PIN. \n\nПокушајте поново за %2$d секунде(и)." - "%1$d пута сте нетачно унели шаблон за откључавање. Након још %2$d несупешна(их) покушаја, од вас ће бити затражено да откључате таблет помоћу података за пријављивање на Google.\n\n Покушајте поново за %3$d секунде(и)." - "Неисправно сте нацртали шаблон за откључавање %1$d пута. После још %2$d неуспешна(их) покушаја од вас ће бити затражено да откључате ТВ помоћу података за пријављивање на Google.\n\n Покушајте поново за %3$d сек." - "%1$d пута сте нетачно унели шаблон за откључавање. Након још %2$d несупешна(их) покушаја, од вас ће бити затражено да откључате телефон помоћу података за пријављивање на Google.\n\n Покушајте поново за %3$d секунде(и)." + "%1$d пута сте неправилно нацртали шаблон за откључавање. \n\nПробајте поново за %2$d секунде(и)." + "%1$d пута сте погрешно унели лозинку. \n\nПробајте поново за %2$d секунде(и)." + "%1$d пута сте погрешно унели PIN. \n\nПробајте поново за %2$d секунде(и)." + "%1$d пута сте нетачно унели шаблон за откључавање. Након још %2$d несупешна(их) покушаја, од вас ће бити затражено да откључате таблет помоћу података за пријављивање на Google.\n\n Пробајте поново за %3$d секунде(и)." + "Неисправно сте нацртали шаблон за откључавање %1$d пута. После још %2$d неуспешна(их) покушаја од вас ће бити затражено да откључате ТВ помоћу података за пријављивање на Google.\n\n Пробајте поново за %3$d сек." + "%1$d пута сте нетачно унели шаблон за откључавање. Након још %2$d несупешна(их) покушаја, од вас ће бити затражено да откључате телефон помоћу података за пријављивање на Google.\n\n Пробајте поново за %3$d секунде(и)." "Неправилно сте покушали да откључате таблет %1$d пута. Након још неуспешних покушаја (%2$d) таблет ће бити ресетован на фабричка подешавања и сви кориснички подаци ће бити изгубљени." "Покушали сте да откључате ТВ нетачно %1$d пута. После још %2$d неуспешна(их) покушаја ТВ ће бити ресетован на подразумевана фабричка подешавања и сви кориснички подаци ће бити изгубљени." "Неисправно сте покушали да откључате телефон %1$d пута. Након још неуспешних покушаја (%2$d) телефон ће бити ресетован на фабричка подешавања и сви кориснички подаци ће бити изгубљени." "Неисправно сте покушали да откључате таблет %d пута. Таблет ће сада бити враћен на подразумевана фабричка подешавања." "Покушали сте да откључате ТВ нетачно %d пута. ТВ ће сада бити ресетован на подразумевана фабричка подешавања." "Неисправно сте покушали да откључате телефон %d пута. Телефон ће сада бити враћен на подразумевана фабричка подешавања." - "Покушајте поново за %d секунде(и)." + "Пробајте поново за %d секунде(и)." "Заборавили сте шаблон?" "Откључавање налога" "Превише покушаја уноса шаблона" @@ -1101,6 +1102,17 @@ "Wi-Fi нема приступ интернету" "Додирните за опције" + "Прешли сте на тип мреже %1$s" + "Уређај користи тип мреже %1$s када тип мреже %2$s нема приступ интернету. Можда ће се наплаћивати трошкови." + "Прешли сте са типа мреже %1$s на тип мреже %2$s" + + "мобилни подаци" + "Wi-Fi" + "Bluetooth" + "Етернет" + "VPN" + + "непознат тип мреже" "Није могуће повезати са Wi-Fi мрежом" " има лошу интернет везу." "Желите ли да дозволите повезивање?" @@ -1172,13 +1184,12 @@ "ДЕЛИ" "ОДБИЈ" "Промените тастатуру" - "Задржи га на екрану док је физичка тастатура активна" + "Задржи је на екрану док је физичка тастатура активна" "Прикажи виртуелну тастатуру" "Конфигуришите физичку тастатуру" "Додирните да бисте изабрали језик и распоред" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "кандидати" "%s се припрема" "Проверава се да ли постоје грешке" "Нови уређај %s је откривен" @@ -1257,8 +1268,9 @@ "Повезано са сесијом %s. Додирните да бисте управљали мрежом." "Повезивање стално укљученог VPN-а..." "Стално укључени VPN је повезан" + "Веза са стално укљученим VPN-ом је прекинута" "Грешка стално укљученог VPN-а" - "Додирните да бисте конфигурисали" + "Додирните да бисте подесили" "Одабери датотеку" "Није изабрана ниједна датотека" "Поново постави" @@ -1343,7 +1355,7 @@ "%s USB диск" "USB меморија" "Измени" - "Упозорење о потрошњи података" + "Обавештење о потрошњи података" "Додирните за потрошњу и подешавања." "Нема више 2G-3G података" "Нема више 4G података" @@ -1409,7 +1421,7 @@ "Погрешан шаблон" "Погрешна лозинка" "Погрешан PIN" - "Покушајте поново за %1$d секунде(и)." + "Пробајте поново за %1$d секунде(и)." "Нацртајте шаблон" "Унесите PIN SIM картице" "Унесите PIN" @@ -1431,18 +1443,18 @@ "Неважеће корисничко име или лозинка." "Заборавили сте корисничко име или лозинку?\nПосетите адресу ""google.com/accounts/recovery""." "Провера налога…" - "Унели сте нетачни PIN %1$d пута. \n\nПокушајте поново за %2$d секунде(и)." - "Унели сте нетачну лозинку %1$d пута. \n\nПокушајте поново за %2$d секунде(и)." - "Нацртали сте шаблон за откључавање нетачно %1$d пута. \n\nПокушајте поново за %2$d секунде(и)." + "Унели сте нетачни PIN %1$d пута. \n\nПробајте поново за %2$d секунде(и)." + "Унели сте нетачну лозинку %1$d пута. \n\nПробајте поново за %2$d секунде(и)." + "Нацртали сте шаблон за откључавање нетачно %1$d пута. \n\nПробајте поново за %2$d секунде(и)." "Покушали сте да откључате таблет нетачно %1$d пута. Након још %2$d неуспешна(их) покушаја таблет ће бити ресетован на фабричка подешавања и сви кориснички подаци ће бити изгубљени." "Покушали сте да откључате ТВ нетачно %1$d пута. После још %2$d неуспешна(их) покушаја ТВ ће бити ресетован на подразумевана фабричка подешавања и сви кориснички подаци ће бити изгубљени." "Покушали сте да откључате телефон нетачно %1$d пута. После још %2$d неуспешна(их) покушаја телефон ће бити ресетован на фабричка подешавања и сви кориснички подаци ће бити изгубљени." "Покушали сте да откључате таблет нетачно %d пута. Таблет ће сада бити враћен на подразумевана фабричка подешавања." "Покушали сте да откључате ТВ нетачно %d пута. ТВ ће сада бити ресетован на подразумевана фабричка подешавања." "Покушали сте да откључате телефон нетачно %d пута. Телефон ће сада бити враћен на подразумевана фабричка подешавања." - "Нацртали сте шаблон за откључавање нетачно %1$d пута. После још %2$d неуспешна(их) покушаја, од вас ће бити затражено да откључате таблет помоћу налога е-поште.\n\nПокушајте поново за %3$d секунде(и)." - "Неисправно сте нацртали шаблон за откључавање %1$d пута. После још %2$d неуспешна(их) покушаја, од вас ће бити затражено да откључате ТВ помоћу налога е-поште.\n\n Покушајте поново за %3$d сек." - "Нацртали сте шаблон за откључавање нетачно %1$d пута. После још %2$d неуспешна(их) покушаја, од вас ће бити затражено да откључате телефон помоћу налога е-поште.\n\nПокушајте поново за %3$d секунде(и)." + "Нацртали сте шаблон за откључавање нетачно %1$d пута. После још %2$d неуспешна(их) покушаја, од вас ће бити затражено да откључате таблет помоћу налога е-поште.\n\nПробајте поново за %3$d секунде(и)." + "Неисправно сте нацртали шаблон за откључавање %1$d пута. После још %2$d неуспешна(их) покушаја, од вас ће бити затражено да откључате ТВ помоћу налога е-поште.\n\n Пробајте поново за %3$d сек." + "Нацртали сте шаблон за откључавање нетачно %1$d пута. После још %2$d неуспешна(их) покушаја, од вас ће бити затражено да откључате телефон помоћу налога е-поште.\n\nПробајте поново за %3$d секунде(и)." " – " "Уклони" "Желите да појачате звук изнад препорученог нивоа?\n\nСлушање гласне музике дуже време може да вам оштети слух." @@ -1553,14 +1565,14 @@ "Нови PIN" "Потврдите нови PIN" "Направите PIN за измену ограничења" - "PIN-ови се не подударају. Покушајте поново." + "PIN-ови се не подударају. Пробајте поново." "PIN је прекратак. Мора да садржи најмање 4 цифре." - Покушајте поново за %d секунду - Покушајте поново за %d секунде - Покушајте поново за %d секунди + Пробајте поново за %d секунду + Пробајте поново за %d секунде + Пробајте поново за %d секунди - "Покушајте поново касније" + "Пробајте поново касније" "Приказује се цео екран" "Да бисте изашли, превуците надоле одозго." "Важи" @@ -1672,6 +1684,7 @@ "Унесите назив језика" "Предложени" "Сви језици" + "Сви региони" "Претражи" "Режим за Work је ИСКЉУЧЕН" "Дозвољава профилу за Work да функционише, укључујући апликације, синхронизацију у позадини и сродне функције." diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index cf1b19ccffc993cf5c1ad604326d61d04c37e1ab..d43282db768683d9f2452cce443be0218c8d536a 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -214,6 +214,7 @@ "Telefonalternativ" "Skärmlås" "Stäng av" + "Nödsituation" "Felrapport" "Skapa felrapport" "Nu hämtas information om aktuell status för enheten, som sedan skickas i ett e-postmeddelade. Det tar en liten stund innan felrapporten är färdig och kan skickas, så vi ber dig ha tålamod." @@ -671,7 +672,7 @@ "Ingen tjänst" "Skärmen har låsts." "Tryck på Menu om du vill låsa upp eller ringa nödsamtal." - "Tryck på Menu om du vill låsa upp." + "Tryck på Menu för att låsa upp." "Rita grafiskt lösenord för att låsa upp" "Nödsamtal" "Tillbaka till samtal" @@ -1076,6 +1077,17 @@ "Wi-Fi-nätverket är inte anslutet till internet" "Tryck för alternativ" + "Byte av nätverk till %1$s" + "%1$s används på enheten när det inte finns internetåtkomst via %2$s. Avgifter kan tillkomma." + "Byte av nätverk från %1$s till %2$s" + + "mobildata" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "en okänd nätverkstyp" "Det gick inte att ansluta till Wi-Fi" " har en dålig Internetanslutning." "Tillåt anslutning?" @@ -1153,7 +1165,6 @@ "Tryck om du vill välja språk och layout" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "kandidater" "Förbereder ditt %s" "Söker efter fel" "Nytt %s har hittats" @@ -1232,8 +1243,9 @@ "Ansluten till %s. Knacka lätt för att hantera nätverket." "Ansluter till Always-on VPN ..." "Ansluten till Always-on VPN" + "Always-on VPN har kopplats från" "Fel på Always-on VPN" - "Tryck om du vill konfigurera" + "Tryck för att konfigurera" "Välj fil" "Ingen fil har valts" "Återställ" @@ -1317,7 +1329,7 @@ "USB-enhet (%s)" "USB-lagring" "Redigera" - "Varning angående dataanvändning" + "Varning – dataanvändning" "Visa användning och inställning." "Datagränsen för 2G-3G har uppnåtts" "Datagränsen för 4G har uppnåtts" @@ -1636,6 +1648,7 @@ "Ange språket" "Förslag" "Alla språk" + "Alla regioner" "Söka" "Arbetsläget är inaktiverat" "Tillåt att jobbprofilen är aktiv, inklusive appar, bakgrundssynkronisering och andra tillhörande funktioner." @@ -1643,7 +1656,7 @@ "Du har nya meddelanden" "Öppna sms-appen och visa meddelandet" "Vissa funktioner är begränsade" - "Tryck om du vill låsa upp" + "Tryck för att låsa upp" "Användaruppgifterna är låsta" "Jobbprofilen är låst" "Tryck och lås upp jobbprofilen" diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 3daaf93ee3306d63eec663f67b00ba5f4487df13..cc750d6f37bbb66c90c1548e235fd0e821c40370 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -212,6 +212,7 @@ "Chaguo za simu" "Funga skrini" "Zima" + "Dharura" "Ripoti ya hitilafu" "Chukua ripoti ya hitilafu" "Hii itakusanya maelezo kuhusu hali ya kifaa chako kwa sasa, na itume kama barua pepe. Itachukua muda mfupi tangu ripoti ya hitilafu ianze kuzalishwa hadi iwe tayari kutumwa; vumilia." @@ -1074,6 +1075,17 @@ "Wi-Fi haina muunganisho wa intaneti" "Gonga ili upate chaguo" + "Sasa inatumia %1$s" + "Kifaa hutumia %1$s wakati %2$s haina Intaneti. Huenda ukalipishwa." + "Imebadilisha mtandao kutoka %1$s na sasa inatumia %2$s" + + "data ya simu za mkononi" + "Wi-Fi" + "Bluetooth" + "Ethaneti" + "VPN" + + "aina ya mtandao isiyojulikana" "Haikuweza kuunganisha kwa Mtandao-Hewa" " ina muunganisho duni wa Mtandao." "Ungepenga kuruhusu muunganisho?" @@ -1151,7 +1163,6 @@ "Gonga ili uchague lugha na muundo" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "wagombeaji" "Inaandaa %s" "Inakagua hitilafu" "%s mpya imegunduliwa" @@ -1230,8 +1241,9 @@ "Imeunganishwa kwa %s. Gonga ili kudhibiti mtandao" "Kila mara VPN iliyowashwa inaunganishwa…" "Kila mara VPN iliyowashwa imeunganishwa" + "Iwe imeondoa VPN kila wakati" "Kila mara kuna hitilafu ya VPN iliyowashwa" - "Gonga ili uweke mipangilio" + "Gonga ili uweke mipangilio" "Chagua faili" "Hakuna faili iliyochaguliwa" "Weka upya" @@ -1315,7 +1327,7 @@ "Hifadhi ya USB iliyotengenezwa na %s" "Hifadhi ya USB" "Badilisha" - "Onyo la matumizi ya data" + "Tahadhari ya matumizi ya data" "Gonga ili uangalie matumizi na mipangilio." "Kikomo data ya 2G-3G kimefikiwa" "Kikomo cha data ya 4G kimefikiwa" @@ -1634,6 +1646,7 @@ "Weka jina la lugha" "Inayopendekezwa" "Lugha zote" + "Maeneo yote" "Tafuta" "Hali ya kazi IMEZIMWA" "Ruhusu wasifu wa kazini utumike, ikiwa ni pamoja na programu, usawazishaji wa chini chini na vipengele vinavyohusiana." diff --git a/core/res/res/values-ta-rIN/strings.xml b/core/res/res/values-ta-rIN/strings.xml index e851399e567e5e561fc3da1349a05734bd418384..20226e9c856ac46650e432373ef5494a888cdd50 100644 --- a/core/res/res/values-ta-rIN/strings.xml +++ b/core/res/res/values-ta-rIN/strings.xml @@ -214,6 +214,7 @@ "தொலைபேசி விருப்பங்கள்" "திரைப் பூட்டு" "முடக்கு" + "அவசர அழைப்பு" "பிழை அறிக்கை" "பிழை அறிக்கையை எடு" "உங்கள் நடப்புச் சாதன நிலையை மின்னஞ்சல் செய்தியாக அனுப்ப, அது குறித்த தகவலை இது சேகரிக்கும். பிழை அறிக்கையைத் தொடங்குவதில் இருந்து, அது அனுப்புவதற்குத் தயாராகும் வரை, இதற்குச் சிறிது நேரம் ஆகும்; பொறுமையாகக் காத்திருக்கவும்." @@ -1076,6 +1077,17 @@ "வைஃபை இணைய அணுகல் கொண்டிருக்கவில்லை" "விருப்பங்களுக்கு, தட்டவும்" + "%1$sக்கு மாற்றப்பட்டது" + "%2$s இல் இணைய அணுகல் இல்லாததால், சாதனமானது %1$sஐப் பயன்படுத்துகிறது. கட்டணங்கள் விதிக்கப்படலாம்." + "%1$s இலிருந்து %2$sக்கு மாற்றப்பட்டது" + + "செல்லுலார் தரவு" + "வைஃபை" + "புளூடூத்" + "ஈத்தர்நெட்" + "VPN" + + "தெரியாத நெட்வொர்க் வகை" "வைஃபை உடன் இணைக்க முடியவில்லை" " இணைய இணைப்பு மோசமாக உள்ளது." "இணைப்பை அனுமதிக்கவா?" @@ -1153,7 +1165,6 @@ "மொழியையும் தளவமைப்பையும் தேர்ந்தெடுக்க, தட்டவும்" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "கேன்டிடேட்ஸ்" "%s தயாராகிறது" "பிழைகள் உள்ளதா எனப் பார்க்கிறது" "புதிய %s கண்டறியப்பட்டது" @@ -1232,8 +1243,9 @@ "%s உடன் இணைக்கப்பட்டது. நெட்வொர்க்கை நிர்வகிக்க, தட்டவும்." "எப்போதும் இயங்கும் VPN உடன் இணைக்கிறது…" "எப்போதும் இயங்கும் VPN இணைக்கப்பட்டது" + "எப்போதும் இயங்கும் VPN துண்டிக்கப்பட்டது" "எப்போதும் இயங்கும் VPN பிழை" - "உள்ளமைக்க, தட்டவும்" + "அமைக்க, தட்டவும்" "கோப்பைத் தேர்வுசெய்" "எந்தக் கோப்பும் தேர்வுசெய்யப்படவில்லை" "மீட்டமை" @@ -1317,7 +1329,7 @@ "%s USB டிரைவ்" "USB சேமிப்பிடம்" "திருத்து" - "தரவு பயன்பாட்டு எச்சரிக்கை" + "தரவுப் பயன்பாடு குறித்த எச்சரிக்கை" "தரவு உபயோகம், அமைப்புகளைப் பார்க்க, தட்டவும்." "2G-3G தரவு வரம்பைக் கடந்தது" "4G தரவு வரம்பைக் கடந்தது" @@ -1636,6 +1648,7 @@ "மொழி பெயரை உள்ளிடுக" "பரிந்துரைகள்" "எல்லா மொழிகளும்" + "எல்லா மண்டலங்களும்" "தேடு" "பணிப் பயன்முறை முடக்கப்பட்டது" "செயல்பட, பணி சுயவிவரத்தை அனுமதி. இதில் பயன்பாடுகள், பின்னணி ஒத்திசைவு மற்றும் தொடர்புடைய அம்சங்கள் அடங்கும்." diff --git a/core/res/res/values-te-rIN/strings.xml b/core/res/res/values-te-rIN/strings.xml index 7c48c8ccbf3702f2e44b7e4b78292cb6bcad77f1..072b69bcaefc9e29974d142efaed5083758419f9 100644 --- a/core/res/res/values-te-rIN/strings.xml +++ b/core/res/res/values-te-rIN/strings.xml @@ -214,6 +214,7 @@ "ఫోన్ ఎంపికలు" "స్క్రీన్ లాక్" "పవర్ ఆఫ్ చేయి" + "అత్యవసరం" "బగ్ నివేదిక" "బగ్ నివేదికను సిద్ధం చేయి" "ఇది ఇ-మెయిల్ సందేశం రూపంలో పంపడానికి మీ ప్రస్తుత పరికర స్థితి గురించి సమాచారాన్ని సేకరిస్తుంది. బగ్ నివేదికను ప్రారంభించడం మొదలుకొని పంపడానికి సిద్ధం చేసే వరకు ఇందుకు కొంత సమయం పడుతుంది; దయచేసి ఓపిక పట్టండి." @@ -1076,6 +1077,17 @@ "Wi-Fiకి ఇంటర్నెట్ ప్రాప్యత లేదు" "ఎంపికల కోసం నొక్కండి" + "%1$sకి మార్చబడింది" + "పరికరం %2$sకి ఇంటర్నెట్ ప్రాప్యత లేనప్పుడు %1$sని ఉపయోగిస్తుంది. ఛార్జీలు వర్తించవచ్చు." + "%1$s నుండి %2$sకి మార్చబడింది" + + "సెల్యులార్ డేటా" + "Wi-Fi" + "బ్లూటూత్" + "ఈథర్‌నెట్" + "VPN" + + "తెలియని నెట్‌వర్క్ రకం" "Wi-Fiకి కనెక్ట్ చేయడం సాధ్యపడలేదు" " బలహీన ఇంటర్నెట్ కనెక్షన్‌ను కలిగి ఉంది." "కనెక్షన్‌ని అనుమతించాలా?" @@ -1153,7 +1165,6 @@ "భాష మరియు లేఅవుట్‌ను ఎంచుకోవడానికి నొక్కండి" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "క్యాండిడేట్‌లు" "%sని సిద్ధం చేస్తోంది" "లోపాల కోసం తనిఖీ చేస్తోంది" "కొత్త %s గుర్తించబడింది" @@ -1232,8 +1243,9 @@ "%sకు కనెక్ట్ చేయబడింది. నెట్‌వర్క్‌ను నిర్వహించడానికి నొక్కండి." "ఎల్లప్పుడూ-ఆన్‌లో ఉండే VPN కనెక్ట్ చేయబడుతోంది…" "ఎల్లప్పుడూ-ఆన్‌లో ఉండే VPN కనెక్ట్ చేయబడింది" + "ఎల్లప్పుడూ ఆన్‌లో ఉండే VPN డిస్‌కనెక్ట్ చేయబడింది" "ఎల్లప్పుడూ-ఆన్‌లో ఉండే VPN లోపం" - "కాన్ఫిగర్ చేయడానికి నొక్కండి" + "సెటప్ చేయడానికి నొక్కండి" "ఫైల్‌ను ఎంచుకోండి" "ఫైల్ ఎంచుకోబడలేదు" "రీసెట్ చేయి" @@ -1317,7 +1329,7 @@ "%s USB డ్రైవ్" "USB నిల్వ" "సవరించు" - "డేటా వినియోగం హెచ్చరిక" + "డేటా వినియోగ హెచ్చరిక" "వినియోగం,సెట్టింగ్‌ల కోసం నొక్కండి" "2G-3G డేటా పరిమితిని చేరుకుంది" "4G డేటా పరిమితిని చేరుకుంది" @@ -1636,6 +1648,7 @@ "భాష పేరును టైప్ చేయండి" "సూచించినవి" "అన్ని భాషలు" + "అన్ని ప్రాంతాలు" "శోధించు" "కార్యాలయ మోడ్ ఆఫ్ చేయబడింది" "అనువర్తనాలు, నేపథ్య సమకాలీకరణ మరియు సంబంధిత లక్షణాలతో సహా కార్యాలయ ప్రొఫైల్‌ను పని చేయడానికి అనుమతించండి." diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 90d9f9bca7943c33f2b1af3d4b214354498f4a6d..c2515908dd7b3ca174467325ba2afabf6e64dbed 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -214,6 +214,7 @@ "ตัวเลือกโทรศัพท์" "ล็อกหน้าจอ" "ปิดเครื่อง" + "เหตุฉุกเฉิน" "รายงานข้อบกพร่อง" "ใช้รายงานข้อบกพร่อง" "การดำเนินการนี้จะรวบรวมข้อมูลเกี่ยวกับสถานะปัจจุบันของอุปกรณ์ของคุณ โดยจะส่งไปในรูปแบบข้อความอีเมล อาจใช้เวลาสักครู่ตั้งแต่เริ่มการสร้างรายงานข้อบกพร่องจนกระทั่งเสร็จสมบูรณ์ โปรดอดทนรอ" @@ -1076,6 +1077,17 @@ "Wi-Fi ไม่สามารถเข้าถึงอินเทอร์เน็ต" "แตะเพื่อดูตัวเลือก" + "เปลี่ยนเป็น %1$s" + "อุปกรณ์จะใช้ %1$s เมื่อ %2$s ไม่สามารถเข้าถึงอินเทอร์เน็ต อาจมีค่าบริการ" + "เปลี่ยนจาก %1$s เป็น %2$s" + + "เน็ตมือถือ" + "Wi-Fi" + "บลูทูธ" + "อีเทอร์เน็ต" + "VPN" + + "ประเภทเครือข่ายที่ไม่รู้จัก" "ไม่สามารถเชื่อมต่อ WiFi" " มีสัญญาณอินเทอร์เน็ตไม่ดี" "อนุญาตการเชื่อมต่อใช่ไหม" @@ -1153,7 +1165,6 @@ "แตะเพื่อเลือกภาษาและรูปแบบ" " กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรลวศษสหฬอฮ" " กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรลวศษสหฬอฮ" - "ตัวเลือก" "กำลังเตรียม %s" "กำลังตรวจหาข้อผิดพลาด" "ตรวจพบ %s ใหม่" @@ -1232,8 +1243,9 @@ "เชื่อมต่อกับ %s แตะเพื่อจัดการเครือข่าย" "กำลังเชื่อมต่อ VPN แบบเปิดตลอดเวลา…" "เชื่อมต่อ VPN แบบเปิดตลอดเวลาแล้ว" + "ยกเลิกการเชื่อมต่อ VPN แบบเปิดตลอดเวลาแล้ว" "ข้อผิดพลาดของ VPN แบบเปิดตลอดเวลา" - "แตะเพื่อกำหนดค่า" + "แตะเพื่อตั้งค่า" "เลือกไฟล์" "ไม่ได้เลือกไฟล์ไว้" "รีเซ็ต" @@ -1317,7 +1329,7 @@ "ไดรฟ์ USB ของ %s" "ที่เก็บข้อมูล USB" "แก้ไข" - "คำเตือนการใช้ข้อมูล" + "การแจ้งเตือนการใช้อินเทอร์เน็ต" "แตะเพื่อดูการใช้งานและการตั้งค่า" "ถึงขีดจำกัดข้อมูล 2G-3G แล้ว" "ถึงขีดจำกัดข้อมูล 4G แล้ว" @@ -1636,6 +1648,7 @@ "พิมพ์ชื่อภาษา" "แนะนำ" "ทุกภาษา" + "ภูมิภาคทั้งหมด" "ค้นหา" "โหมดทำงานปิดอยู่" "อนุญาตให้โปรไฟล์งานทำงานได้ ซึ่งรวมถึงแอป การซิงค์ในพื้นหลัง และคุณลักษณะอื่นที่เกี่ยวข้อง" diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index efb319f52d442e340ad46c963a2c93b96d0081dc..b0d84ea51ba481ee1368065e4f1ea1dc781cc3dc 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -214,6 +214,7 @@ "Pagpipilian sa telepono" "Pag-lock sa screen" "I-off" + "Emergency" "Ulat sa bug" "Kunin ang ulat sa bug" "Mangongolekta ito ng impormasyon tungkol sa kasalukuyang katayuan ng iyong device, na ipapadala bilang mensaheng e-mail. Gugugol ito ng kaunting oras mula sa pagsisimula ng ulat sa bug hanggang sa handa na itong maipadala; mangyaring magpasensya." @@ -1076,6 +1077,17 @@ "Walang access sa Internet ang Wi-Fi" "I-tap para sa mga opsyon" + "Lumipat sa %1$s" + "Ginagamit ng device ang %1$s kapag walang access sa Internet ang %2$s. Maaaring may mga malapat na singilin." + "Lumipat sa %2$s mula sa %1$s" + + "cellular data" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "isang hindi kilalang uri ng network" "Hindi makakonekta sa Wi-Fi" " ay mayroong mahinang koneksyon sa Internet." "Payagan ang kuneksyon?" @@ -1139,7 +1151,7 @@ "Nakakonekta sa isang accessory ng USB" "I-tap para sa higit pang mga opsyon." "Konektado ang debugging ng USB" - "I-tap upang i-disable ang pagde-debug ng USB." + "I-tap upang i-disable ang pag-debug ng USB." "Kinukuha ang ulat ng bug…" "Gusto mo bang ibahagi ang ulat ng bug?" "Ibinabahagi ang ulat ng bug…" @@ -1153,7 +1165,6 @@ "I-tap upang pumili ng wika at layout" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "mga kandidato" "Inihahanda ang %s" "Sinusuri para sa mga error" "Na-detect ang bagong %s" @@ -1232,8 +1243,9 @@ "Nakakonekta sa %s. Tapikin upang pamahalaan ang network." "Kumukonekta ang Always-on VPN…" "Nakakonekta ang Always-on VPN" + "Hindi nakakonekta ang palaging naka-on na VPN" "Error sa Always-on VPN" - "I-tap upang i-configure" + "I-tap upang i-set up" "Pumili ng file" "Walang napiling file" "I-reset" @@ -1317,7 +1329,7 @@ "%s USB drive" "USB storage" "I-edit" - "Babala sa paggamit ng data" + "Alerto sa paggamit ng data" "I-tap tingnan paggamit/setting." "Naabot na ang limitasyon sa 2G-3G data" "Naabot na ang limitasyon sa 4G data" @@ -1636,6 +1648,7 @@ "I-type ang wika" "Iminumungkahi" "Lahat ng wika" + "Lahat ng rehiyon" "Maghanap" "NAKA-OFF ang work mode" "Payagang gumana ang profile sa trabaho, kasama na ang mga app, pag-sync sa background at mga may kaugnayang feature." diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 5a0776ab5f1af6a09855e1c1d05f775bc5c4ac89..a089fd42feb62c79032ee11bed605476d89a78dd 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -214,6 +214,7 @@ "Telefon seçenekleri" "Ekran kilidi" "Kapat" + "Acil durum" "Hata raporu" "Hata raporu al" "Bu rapor, e-posta iletisi olarak göndermek üzere cihazınızın şu anki durumuyla ilgili bilgi toplar. Hata raporu başlatıldıktan sonra hazır olması biraz zaman alabilir, lütfen sabırlı olun." @@ -1076,6 +1077,17 @@ "Kablosuz bağlantıda İnternet erişimi yok" "Seçenekler için dokunun" + "%1$s ağına geçildi" + "%2$s ağının İnternet erişimi olmadığında cihaz %1$s ağını kullanır. Bunun için ödeme alınabilir." + "%1$s ağından %2$s ağına geçildi" + + "hücresel veri" + "Kablosuz" + "Bluetooth" + "Ethernet" + "VPN" + + "bilinmeyen ağ türü" "Kablosuz bağlantısı kurulamadı" " İnternet bağlantısı zayıf." "Bağlantıya izin verilsin mi?" @@ -1153,7 +1165,6 @@ "Dili ve düzeni seçmek için hafifçe dokunun" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "adaylar" "%s hazırlanıyor" "Hatalar denetleniyor" "Yeni %s algılandı" @@ -1232,8 +1243,9 @@ "%s oturumuna bağlı. Ağı yönetmek için hafifçe vurun." "Her zaman açık VPN\'ye bağlanılıyor…" "Her zaman açık VPN\'ye bağlanıldı" + "Her zaman açık VPN bağlantısı kesildi" "Her zaman açık VPN hatası" - "Yapılandırmak için dokunun" + "Ayarlamak için dokunun" "Dosya seç" "Seçili dosya yok" "Sıfırla" @@ -1317,7 +1329,7 @@ "%s USB sürücüsü" "USB bellek" "Düzenle" - "Veri kullanım uyarısı" + "Veri kullanımı uyarısı" "Kul. ve ayar. gör. için dokunun." "2G-3G veri sınırına ulaşıldı" "4G veri sınırına ulaşıldı" @@ -1636,6 +1648,7 @@ "Dil adını yazın" "Önerilen" "Tüm diller" + "Tüm bölgeler" "Ara" "İş modu KAPALI" "Uygulamalar, arka planda senkronizasyon ve ilgili özellikler dahil olmak üzere iş profilinin çalışmasına izin ver." diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 4810e37686af34e69ea9545f54d181dd786cd443..704ade8e27ddd13624c929a0af92ca5b86f746af 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -218,6 +218,7 @@ "Параметри телеф." "Заблок. екран" "Вимкнути" + "Екстрений виклик" "Звіт про помилки" "Звіт про помилку" "Інформація про поточний стан вашого пристрою буде зібрана й надіслана електронною поштою. Підготовка звіту триватиме певний час." @@ -1103,8 +1104,8 @@ "Гучність сигналу виклику" "Гучність медіа" "Гучність сповіщення" - "Мелодія за умовч." - "Мелодія за умовч. (%1$s)" + "Мелодія за умовчанням" + "Мелодія за умовчанням (%1$s)" "Немає" "Мелодії" "Невідома мелодія" @@ -1126,6 +1127,17 @@ "Мережа Wi-Fi не має доступу до Інтернету" "Торкніться, щоб відкрити опції" + "Пристрій перейшов на мережу %1$s" + "Пристрій використовує мережу %1$s, коли мережа %2$s не має доступу до Інтернету. Може стягуватися плата." + "Пристрій перейшов з мережі %1$s на мережу %2$s" + + "мобільний трафік" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "Мережа VPN" + + "невідомий тип мережі" "Не вдалося під’єднатися до мережі Wi-Fi" " має погане з’єднання з Інтернетом." "Дозволити з’єднання?" @@ -1203,7 +1215,6 @@ "Торкніться, щоб вибрати мову та розкладку" " АБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯ" " 0123456789АБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯ" - "кандидати" "Підготовка пристрою пам’яті %s" "Виявлення помилок" "Виявлено новий пристрій пам’яті (%s)" @@ -1282,8 +1293,9 @@ "Під’єднано до %s. Торкніться, щоб керувати мережею." "Під’єднання до постійної мережі VPN…" "Під’єднано до постійної мережі VPN" + "Постійну мережу VPN від’єднано" "Помилка постійної мережі VPN" - "Торкніться, щоб налаштувати" + "Торкніться, щоб налаштувати" "Виберіть файл" "Не вибрано файл" "Віднов." @@ -1369,7 +1381,7 @@ "Носій USB (%s)" "Носій USB" "Редагувати" - "Застереження про використ. даних" + "Сповіщення про використ. трафіку" "Переглянути дані та параметри." "Досягнуто ліміту даних 2G–3G" "Досягнуто ліміту даних 4G" @@ -1708,6 +1720,7 @@ "Введіть назву мови" "Пропоновані" "Усі мови" + "Усі регіони" "Пошук" "Робочий профіль ВИМКНЕНО" "Увімкнути робочий профіль, зокрема додатки, фонову синхронізацію та пов’язані функції." diff --git a/core/res/res/values-ur-rPK/strings.xml b/core/res/res/values-ur-rPK/strings.xml index f6771325be90b13a82b8a2c5dff1d33fd6803ae8..24a03b24e0661a9cde96764794bef852b4ce8fee 100644 --- a/core/res/res/values-ur-rPK/strings.xml +++ b/core/res/res/values-ur-rPK/strings.xml @@ -214,6 +214,7 @@ "فون کے اختیارات" "اسکرین لاک" "پاور آف" + "ایمرجنسی" "بگ کی اطلاع" "بگ کی اطلاع لیں" "ایک ای میل پیغام کے بطور بھیجنے کیلئے، یہ آپ کے موجودہ آلہ کی حالت کے بارے میں معلومات جمع کرے گا۔ بگ کی اطلاع شروع کرنے سے لے کر بھیجنے کیلئے تیار ہونے تک اس میں تھوڑا وقت لگے گا؛ براہ کرم تحمل سے کام لیں۔" @@ -1076,6 +1077,17 @@ "‏Wi-Fi کی انٹرنیٹ تک رسائی نہیں ہے" "اختیارات کیلئے تھپتھپائیں" + "%1$s پر سوئچ ہو گیا" + "جب %2$s کے پاس انٹرنیٹ تک رسائی نہ ہو تو آلہ %1$s کو استعمال کرتا ہے۔ چارجز کا اطلاق ہو سکتا ہے۔" + "%1$s سے %2$s پر سوئچ ہو گیا" + + "سیلولر ڈیٹا" + "Wi-Fi" + "بلوٹوتھ" + "ایتھرنیٹ" + "VPN" + + "نیٹ ورک کی نامعلوم قسم" "‏Wi-Fi سے مربوط نہیں ہو سکا" " اس میں ایک کمزور انٹرنیٹ کنکشن ہے۔" "کنکشن کی اجازت دیں؟" @@ -1153,7 +1165,6 @@ "زبان اور لے آؤٹ منتخب کرنے کیلئے تھپتھپائیں" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "امیدواران" "%s تیار کیا جا رہا ہے" "خرابیوں کیلئے چیک کیا جا رہا ہے" "نئے %s کا پتا چلا" @@ -1232,8 +1243,9 @@ "%s سے منسلک ہے۔ نیٹ ورک کا نظم کرنے کیلئے تھپتھپائیں۔" "‏ہمیشہ آن VPN مربوط ہو رہا ہے…" "‏ہمیشہ آن VPN مربوط ہوگیا" + "‏ہمیشہ آن VPN غیر منسلک ہو گیا" "‏ہمیشہ آن VPN کی خرابی" - "کنفیگر کرنے کیلئے تھپتھپائیں" + "سیٹ اپ کرنے کیلئے تھپتھپائیں" "فائل منتخب کریں" "کوئی فائل منتخب نہیں کی گئی" "دوبارہ ترتیب دیں" @@ -1317,7 +1329,7 @@ "‏%s USB ڈرائیو" "‏USB اسٹوریج" "ترمیم کریں" - "ڈیٹا کے استعمال کی وارننگ" + "ڈیٹا کے استعمال کا الرٹ" "استعمال اور ترتیبات دیکھنے کیلئے تھپتھپائیں۔" "‏2G-3G ڈیٹا کی حد کو پہنچ گیا" "‏4G ڈیٹا کی حد کو پہنچ گیا" @@ -1636,6 +1648,7 @@ "زبان کا نام ٹائپ کریں" "تجویز کردہ" "سبھی زبانیں" + "تمام علاقے" "تلاش" "کام موڈ آف ہے" "دفتری پروفائل کو کام کرنے دیں، بشمول ایپس، پس منظر کی مطابقت پذیری اور متعلقہ خصوصیات۔" diff --git a/core/res/res/values-uz-rUZ/strings.xml b/core/res/res/values-uz-rUZ/strings.xml index 8fc6428eb24b5d803dba63987e66c2fd049f6e5b..e5a2889b70545e16d4e859107af0d903bd3a1d50 100644 --- a/core/res/res/values-uz-rUZ/strings.xml +++ b/core/res/res/values-uz-rUZ/strings.xml @@ -214,6 +214,7 @@ "Telefon sozlamalari" "Ekran qulfi" "O‘chirish" + "Favqulodda chaqiruv" "Nosozlik haqida ma’lumot berish" "Xatoliklar hisoboti" "Qurilmangiz holati haqidagi ma’lumotlar to‘planib, e-pochta orqali yuboriladi. Hisobotni tayyorlash biroz vaqt olishi mumkin." @@ -1076,6 +1077,17 @@ "Wi-Fi tarmog‘ida internet aloqasi yo‘q" "Variantlarni ko‘rsatish uchun bosing" + "%1$s tarmog‘iga ulanildi" + "Qurilma %2$s tarmog‘ida internet o‘chganda, %1$s tarmog‘iga ulaniladi. To‘lov olinishi mumkin." + "%1$s tarmog‘idan %2$s tarmog‘iga o‘tildi" + + "mobil internet" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "noma’lum tarmoq turi" "Wi-Fi’ga ulana olmadi" " tezligi past Internetga ulangan." "Ulanishga ruxsat berilsinmi?" @@ -1087,7 +1099,7 @@ "Wi-Fi Direct yoniq" "Sozlamalarni ochish uchun bosing" "Qabul qilish" - "Rad qilish" + "Rad etish" "taklif jo‘natildi" "ulanish taklifi" "Kimdan:" @@ -1101,7 +1113,7 @@ "SMS xabarlar yuborilmoqda" "<b>%1$s</b> katta miqdordagi SMS xabarlarini jo‘natmoqda. Ushbu ilovaga xabarlar jo‘natishni davom ettirishga ruxsat berasizmi?" "Ruxsat berish" - "Rad qilish" + "Rad etish" "<b>%1$s</b> <b>%2$s</b>ga xabar jo‘natishni xohlaydi." "Bunda, mobil hisobingizdan ""to‘lov olinishi mumkin""." "Bunda, mobil hisobingizdan to‘lov olinishi mumkin." @@ -1153,7 +1165,6 @@ "Til va sxemani belgilash uchun bosing" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "nomzodlar" "%s tayyorlanmoqda" "Xatolar qidirilmoqda" "Yangi %s kartasi aniqlandi" @@ -1212,7 +1223,7 @@ "Ushbu so‘rovga ruxsat berishni xohlaysizmi?" "Ruxsat so‘rovi" "Ruxsat berish" - "Rad qilish" + "Rad etish" "Ruxsat so‘raldi" "%s hisobi uchun\nruxsat so‘raldi" "Siz ushbu ilovadan ishchi profilingizdan tashqarida foydalanmoqdasiz" @@ -1232,8 +1243,9 @@ "%s ulandi. Tarmoq sozlamalarini o‘zgartirish uchun bu yerni bosing." "Ulanmoqda…" "Ulandi" + "Doimiy VPN o‘chirildi" "Xato" - "Sozlash uchun bosing" + "Sozlash uchun bosing" "Faylni tanlash" "Hech qanday fayl tanlanmadi" "Asliga qaytarish" @@ -1317,7 +1329,7 @@ "%s USB xotira qurilmasi" "USB xotira" "Tahrirlash" - "Trafik kam qoldi" + "Trafik sarfi bo‘yicha ogohlantirish" "Trafik sarfi va sozlamalarni ko‘rish uchun bosing." "2G-3G trafik chekloviga yetdi" "4G trafik chekloviga yetdi" @@ -1636,6 +1648,7 @@ "Til nomini kiriting" "Taklif etiladi" "Barcha tillar" + "Barcha hududlar" "Qidiruv" "Ish rejimi O‘CHIQ" "Ishchi profilini yoqish: ilovalar, fonda sinxronlash va bog‘liq funksiyalar." diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index a537b8f0bb6296753cd1e1a8a0c9ff71ca54c207..0bbfe3b8a8c1020b1377b681704552edddab1047 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -214,6 +214,7 @@ "Tùy chọn điện thoại" "Khoá màn hình" "Tắt nguồn" + "Khẩn cấp" "Báo cáo lỗi" "Nhận báo cáo lỗi" "Báo cáo này sẽ thu thập thông tin về tình trạng thiết bị hiện tại của bạn, để gửi dưới dạng thông báo qua email. Sẽ mất một chút thời gian kể từ khi bắt đầu báo cáo lỗi cho tới khi báo cáo sẵn sàng để gửi; xin vui lòng kiên nhẫn." @@ -1076,6 +1077,17 @@ "Wi-Fi không có quyền truy cập Internet" "Nhấn để biết tùy chọn" + "Đã chuyển sang %1$s" + "Thiết bị sử dụng %1$s khi %2$s không có quyền truy cập Internet. Bạn có thể phải trả phí." + "Đã chuyển từ %1$s sang %2$s" + + "dữ liệu di động" + "Wi-Fi" + "Bluetooth" + "Ethernet" + "VPN" + + "loại mạng không xác định" "Không thể kết nối với Wi-Fi" " có kết nối Internet không tốt." "Cho phép kết nối?" @@ -1153,7 +1165,6 @@ "Nhấn để chọn ngôn ngữ và bố cục" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "ứng viên" "Đang chuẩn bị %s" "Đang kiểm tra lỗi" "Đã phát hiện %s mới" @@ -1232,8 +1243,9 @@ "Đã kết nối với %s. Chạm để quản lý mạng." "Đang kết nối VPN luôn bật…" "Đã kết nối VPN luôn bật" + "Đã ngắt kết nối VPN luôn bật" "Lỗi VPN luôn bật" - "Nhấn để định cấu hình" + "Nhấn để thiết lập" "Chọn tệp" "Không có tệp nào được chọn" "Đặt lại" @@ -1317,7 +1329,7 @@ "Ổ USB %s" "Bộ lưu trữ USB" "Chỉnh sửa" - "Cảnh báo sử dụng dữ liệu" + "Thông báo về sử dụng dữ liệu" "Nhấn để xem sử dụng và cài đặt." "Đã đạt tới giới hạn dữ liệu 2G-3G" "Đã đạt tới giới hạn dữ liệu 4G" @@ -1636,6 +1648,7 @@ "Nhập tên ngôn ngữ" "Ðược đề xuất" "Tất cả ngôn ngữ" + "Tất cả khu vực" "Tìm kiếm" "Chế độ làm việc đang TẮT" "Cho phép hồ sơ công việc hoạt động, bao gồm ứng dụng, đồng bộ hóa trong nền và các tính năng liên quan." diff --git a/core/res/res/values-watch/donottranslate.xml b/core/res/res/values-watch/donottranslate.xml new file mode 100644 index 0000000000000000000000000000000000000000..d247ff6f56940490b001a76560a54353aa5477ac --- /dev/null +++ b/core/res/res/values-watch/donottranslate.xml @@ -0,0 +1,22 @@ + + + + + + candidates + diff --git a/core/res/res/values-watch/styles_material.xml b/core/res/res/values-watch/styles_material.xml index f5735e69347a1280c0c3d1ea9454e9a9e9e9c45e..a9f6e226510cf55880e5ae0eb69c24084f484145 100644 --- a/core/res/res/values-watch/styles_material.xml +++ b/core/res/res/values-watch/styles_material.xml @@ -88,9 +88,4 @@ please see styles_device_defaults.xml. ?selectableItemBackground blocksDescendants - - - candidates diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index b7a698b225f3453795d4e2dc08a62f7a904e12b4..4427a365731a3dcb0ae21917f41b5690390ae1c6 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -195,7 +195,7 @@ "振铃器开启" "Android 系统更新" "正在准备更新…" - "正在处理更新文件包…" + "正在处理更新软件包…" "正在重新启动…" "恢复出厂设置" "正在重新启动…" @@ -214,6 +214,7 @@ "手机选项" "屏幕锁定" "关机" + "紧急呼救" "错误报告" "提交错误报告" "这会收集有关当前设备状态的信息,并以电子邮件的形式进行发送。从开始生成错误报告到准备好发送需要一点时间,请耐心等待。" @@ -1076,6 +1077,17 @@ "此 WLAN 网络无法访问互联网" "点按即可查看相关选项" + "已切换至%1$s" + "设备会在无法连接到%2$s时使用%1$s(可能需要支付相应的费用)。" + "已从%1$s切换至%2$s" + + "移动数据网络" + "WLAN" + "蓝牙" + "以太网" + "VPN" + + "未知网络类型" "无法连接到WLAN" " 互联网连接状况不佳。" "要允许连接吗?" @@ -1153,7 +1165,6 @@ "点按即可选择语言和布局" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "候选" "正在准备%s" "检查是否有错误" "检测到新的%s" @@ -1232,8 +1243,9 @@ "已连接到%s。点按即可管理网络。" "正在连接到始终开启的 VPN…" "已连接到始终开启的 VPN" + "始终开启的 VPN 已断开连接" "始终开启的 VPN 出现错误" - "点按即可进行配置" + "点按即可进行设置" "选择文件" "未选定任何文件" "重置" @@ -1317,7 +1329,7 @@ "%s U 盘" "USB存储器" "修改" - "流量警告" + "流量消耗提醒" "点按即可查看使用情况和设置。" "已达到2G-3G流量上限" "已达到4G流量上限" @@ -1636,6 +1648,7 @@ "输入语言名称" "建议语言" "所有语言" + "所有国家/地区" "搜索" "工作模式已关闭" "启用工作资料,包括应用、后台同步和相关功能。" diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index ef12eeab56f21d6de3d1a592e491c8cd750d8da8..8e034a78327f85f8933baea1da53e2c564fb0de1 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -214,6 +214,7 @@ "手機選項" "螢幕鎖定" "關閉" + "緊急" "錯誤報告" "取得錯誤報告" "這會收集您目前裝置狀態的相關資訊,並以電郵傳送給您。從開始建立錯誤報告到準備傳送需要一段時間,請耐心等候。" @@ -1076,6 +1077,17 @@ "Wi-Fi 並未連接互聯網" "輕按即可查看選項" + "已切換至%1$s" + "當%2$s無法連線至互聯網時,裝置便會切換至%1$s。可能需要支付額外費用。" + "已從%1$s切換至%2$s" + + "流動數據" + "Wi-Fi" + "藍牙" + "以太網" + "VPN" + + "不明網絡類型" "無法連線至 Wi-Fi" " 互聯網連線欠佳。" "允許連線?" @@ -1153,7 +1165,6 @@ "輕按即可選取語言和鍵盤配置" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "待選項目" "正在準備%s" "正在檢查錯誤" "已偵測到新%s" @@ -1232,8 +1243,9 @@ "已連線至 %s,輕按一下即可管理網絡。" "正在連線至永久連線的 VPN…" "已連線至永久連線的 VPN" + "永久連線的 VPN 已中斷" "永久連線的 VPN 發生錯誤" - "輕觸即可設定" + "輕按即可設定" "選擇檔案" "未選擇檔案" "重設" @@ -1317,7 +1329,7 @@ "%s USB 驅動器" "USB 儲存裝置" "編輯" - "資料用量警告" + "數據用量警告" "輕按即可查看用量和設定。" "已達到 2G-3G 數據流量上限" "已達到 4G 數據流量上限" @@ -1636,6 +1648,7 @@ "輸入語言名稱" "建議" "所有語言" + "所有國家/地區" "搜尋" "工作模式已關閉" "允許使用應用程式、背景同步及相關功能的工作設定檔。" diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 84e2c2c9f738d558312ffc3bb5f924ac036e914c..82b4f6d8b7cd12712edcd3f641febb2219e5b869 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -214,6 +214,7 @@ "電話選項" "螢幕鎖定" "關機" + "緊急電話" "錯誤報告" "取得錯誤報告" "這會收集您目前裝置狀態的相關資訊,以便透過電子郵件傳送。從錯誤報告開始建立到準備傳送的這段過程可能需要一點時間,敬請耐心等候。" @@ -1076,6 +1077,17 @@ "Wi-Fi 網路沒有網際網路連線" "輕觸即可查看選項" + "已切換至%1$s" + "裝置會在無法連上 %2$s 時切換至%1$s (可能需要支付相關費用)。" + "已從 %1$s 切換至%2$s" + + "行動數據" + "Wi-Fi" + "藍牙" + "乙太網路" + "VPN" + + "不明的網路類型" "無法連線至 Wi-Fi" " 的網際網路連線狀況不佳。" "允許連線?" @@ -1153,7 +1165,6 @@ "輕觸即可選取語言和版面配置" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "待選項目" "正在準備「%s」" "正在檢查錯誤" "偵測到新的「%s」" @@ -1232,8 +1243,9 @@ "已連線至 %s,輕觸一下即可管理網路。" "正在連線至永久連線的 VPN…" "已連線至永久連線的 VPN" + "永久連線的 VPN 已中斷連線" "永久連線的 VPN 發生錯誤" - "輕觸即可進行設定" + "輕觸即可進行設定" "選擇檔案" "未選擇任何檔案" "重設" @@ -1317,7 +1329,7 @@ "%s USB 隨身碟" "USB 儲存裝置" "編輯" - "數據用量警告" + "數據用量警告" "輕觸即可查看用量和設定。" "已達到 2G-3G 數據流量上限" "已達到 4G 數據流量上限" @@ -1636,6 +1648,7 @@ "請輸入語言名稱" "建議語言" "所有語言" + "所有地區" "搜尋" "Work 模式已關閉" "啟用 Work 設定檔,包括應用程式、背景同步處理和相關功能。" diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index 0c7af8dd21a5b44abb044065218f75dd532a9b60..20dfcc03ef94d6fbf4eeb30efbfe725288dc9f5e 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -214,6 +214,7 @@ "Okukhethwa kukho kwefoni" "Ukuvala isikrini" "Vala amandla" + "Isimo esiphuthumayo" "Umbiko wephutha" "Thatha umbiko wesiphazamiso" "Lokhu kuzoqoqa ulwazi mayelana nesimo samanje sedivayisi yakho, ukuthumela imilayezo ye-imeyili. Kuzothatha isikhathi esincane kusuka ekuqaleni umbiko wesiphazamiso uze ulungele ukuthunyelwa; sicela ubekezele." @@ -1076,6 +1077,17 @@ "I-Wi-Fi ayinakho ukufinyelela kwe-inthanethi" "Thepha ukuze uthole izinketho" + "Kushintshelwe ku-%1$s" + "Idivayisi isebenzisa i-%1$s uma i-%2$s ingenakho ukufinyelela kwe-inthanethi. Izindleko zingasebenza." + "Kushintshelewe kusuka ku-%1$s kuya ku-%2$s" + + "idatha yeselula" + "I-Wi-Fi" + "I-Bluetooth" + "I-Ethernet" + "I-VPN" + + "uhlobo olungaziwa lwenethiwekhi" "Ayikwazanga ukuxhuma kwi-Wi-Fi" " inoxhumano oluphansi lwe-inthanethi." "Vumela ukuxhumeka?" @@ -1153,7 +1165,6 @@ "Thepha ukuze ukhethe ulimi nesakhiwo" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "abahlanganyeli" "Ilungiselela i-%s" "Ihlolela amaphutha" "I-%s entsha itholiwe" @@ -1232,8 +1243,9 @@ "Ixhume ku-%s. Thepha ukuphatha inethiwekhi." "I-VPN ehlala ikhanya iyaxhuma…" "I-VPN ehlala ikhanya ixhunyiwe" + "Njalo kuvuliwe i-VPN kunqamukile" "Iphutha le-VPN ehlala ikhanya" - "Thinta ukuze umise" + "Thepha ukuze usethe" "Khetha ifayela" "Ayikho ifayela ekhethiwe" "Setha kabusha" @@ -1317,7 +1329,7 @@ "%s idrayivu ye-USB" "Isitoreji se-USB" "Hlela" - "Isexwayiso sokusetshenziswa kwedatha" + "Izexwayiso zokusetshenziswa kwedatha" "Thepha ukuze ubuke ukusetshenziswa nezilungiselelo." "2G-3G umkhawulo wedatha ufinyelelwe" "4G umkhawulo wedatha ufinyelelwe" @@ -1636,6 +1648,7 @@ "Thayipha igama lolimi" "Okuphakanyisiwe" "Zonke izilimi" + "Zonke izifunda" "Sesha" "Imodi yomsebenzi IVALIWE" "Vumela iphrofayela yomsebenzi ukuze isebenze, efaka izinhlelo zokusebenza, ukuvumelanisa kwangemuva, nezici ezisondelene." diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 48e420198ffafe2e1ee8f73f5f91b8944f3d2e2b..30a1a28617e5856f2edc977dc749fb4e4e47780d 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -4839,6 +4839,11 @@ i + + + @@ -5167,6 +5172,11 @@ i + + + @@ -5313,6 +5323,21 @@ i + + + + + + + + + + + @@ -5342,7 +5367,10 @@ i - + @@ -5376,28 +5404,37 @@ i - + + - + - + - + - + - + - + - + diff --git a/core/res/res/values/colors_material.xml b/core/res/res/values/colors_material.xml index e57e457caef2c248e60044d5e20db02a3ec4d059..5abda764000b0e2ade234b9fbb82925142873328 100644 --- a/core/res/res/values/colors_material.xml +++ b/core/res/res/values/colors_material.xml @@ -61,7 +61,10 @@ #b3ffffff 0.50 - 0.54 + 0.38 + + 0.70 + 0.54 0.26 0.30 diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index e69693a869ac755d4fcd0fba7ddff84d3ecec9e4..f87e52a58ae00e8914a2e96c58464835a006988a 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1768,6 +1768,12 @@ turned off and the screen off animation has been performed. --> false + + false + + + + false + + true + @@ -2429,8 +2440,8 @@ - - true + + false true @@ -2733,6 +2744,16 @@ false + + 112 + + + + 404 + 405 + + @@ -2753,6 +2774,18 @@ 310004,310010,310012,310013,310590,310890,310910,311110,311270,311271,311272,311273,311274,311275,311276,311277,311278,311279,311280,311281,311282,311283,311284,311285,311286,311287,311288,311289,311390,311480,311481,311482,311483,311484,311485,311486,311487,311488,311489;^//VZWVVM.* + + + + + + false diff --git a/core/res/res/values/donottranslate.xml b/core/res/res/values/donottranslate.xml index a139529482da3b72bb2d53f8194123c4df8826e3..3a1679c19fc8805c673930ed37327f39c019fa23 100644 --- a/core/res/res/values/donottranslate.xml +++ b/core/res/res/values/donottranslate.xml @@ -26,4 +26,7 @@ eeeMMMMd @string/icu_abbrev_wday_month_day_no_year + + candidates diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 345d377795217dfe7035fd8ed741acc3d856e4bf..8f5f8cfa0de12f8983b7a4a5d63c28bbe138e804 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -486,6 +486,9 @@ @string/sim_restart_button + + Emergency + Bug report @@ -3121,8 +3124,6 @@ \u0020ABCDEFGHIJKLMNOPQRSTUVWXYZ \u00200123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ - candidates - @@ -3325,10 +3326,12 @@ Always-on VPN connecting\u2026 Always-on VPN connected + + Always-on VPN disconnected Always-on VPN error - Tap to configure + Tap to set up @@ -3549,8 +3552,8 @@ Edit - - Data usage warning + + Data usage alert Tap to view usage and settings. @@ -4356,6 +4359,9 @@ Suggested All languages + + All regions Search diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index da758d5febf376837db3414b4e7cfa007bfcbddf..d026b6701d1f165b71e69a9359f2dcb0e96ff1b4 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1465,6 +1465,7 @@ + @@ -1884,6 +1885,7 @@ + @@ -1960,6 +1962,7 @@ + @@ -2233,6 +2236,7 @@ + @@ -2528,6 +2532,7 @@ + @@ -2749,6 +2754,13 @@ + + + + + + + @@ -2785,6 +2797,16 @@ + + + + + + + + + + diff --git a/core/tests/coretests/AndroidManifest.xml b/core/tests/coretests/AndroidManifest.xml index 2452cfd66c3f61ee6a866421a4d9b16a54b507c1..4416402d0717cec2600be494826392be007777f4 100644 --- a/core/tests/coretests/AndroidManifest.xml +++ b/core/tests/coretests/AndroidManifest.xml @@ -1147,6 +1147,8 @@ + + diff --git a/core/tests/coretests/src/android/app/EmptyActivity.java b/core/tests/coretests/src/android/app/EmptyActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..fefd7b724fedca43532fda5168f82c45f4ec6b36 --- /dev/null +++ b/core/tests/coretests/src/android/app/EmptyActivity.java @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2016 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 android.app; + +public class EmptyActivity extends Activity { +} diff --git a/core/tests/coretests/src/android/app/LoaderLifecycleTest.java b/core/tests/coretests/src/android/app/LoaderLifecycleTest.java new file mode 100644 index 0000000000000000000000000000000000000000..1850d575dfa5857b3bfa9713891993375096479b --- /dev/null +++ b/core/tests/coretests/src/android/app/LoaderLifecycleTest.java @@ -0,0 +1,228 @@ +/* + * Copyright (C) 2016 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 android.app; + +import android.content.Context; +import android.os.Handler; +import android.os.Parcelable; +import android.support.test.filters.MediumTest; +import android.support.test.rule.ActivityTestRule; +import android.support.test.runner.AndroidJUnit4; +import android.util.ArrayMap; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import static junit.framework.TestCase.assertNotNull; +import static junit.framework.TestCase.assertNotSame; +import static junit.framework.TestCase.assertSame; + +@RunWith(AndroidJUnit4.class) +public class LoaderLifecycleTest { + @Rule + public ActivityTestRule mActivityRule = + new ActivityTestRule<>(EmptyActivity.class); + @Test + @MediumTest + public void loaderIdentityTest() throws Throwable{ + mActivityRule.runOnUiThread(() -> { + final Handler h = new Handler(); + final FragmentController fc1 = FragmentController.createController( + new TestFragmentHostCallback(mActivityRule.getActivity(), h, 0)); + + fc1.attachHost(null); + fc1.dispatchCreate(); + + final FragmentManager fm1 = fc1.getFragmentManager(); + + final Fragment f1 = new Fragment(); + fm1.beginTransaction().add(f1, "one").commitNow(); + + // Removing and re-adding a fragment completely will destroy its LoaderManager. + // Keep the first one here to confirm this later. + final LoaderManager lm1 = f1.getLoaderManager(); + + // Remove the fragment, add a second one, and re-add the first to + // force its internal index to change. The tests below should still remain consistent. + final Fragment f2 = new Fragment(); + fm1.beginTransaction().remove(f1).commitNow(); + fm1.beginTransaction().add(f2, "two").commitNow(); + fm1.beginTransaction().add(f1, "one").commitNow(); + + // We'll check this to see if we get the same instance back later + // as passed through NonConfigurationInstance. If the keys stay consistent + // across fragment remove/re-add, this will be consistent. + final LoaderManager lm12 = f1.getLoaderManager(); + + assertNotSame("fully removed and re-added fragment got same LoaderManager", lm1, lm12); + + fc1.dispatchActivityCreated(); + fc1.noteStateNotSaved(); + fc1.execPendingActions(); + fc1.doLoaderStart(); + fc1.dispatchStart(); + fc1.reportLoaderStart(); + fc1.dispatchResume(); + fc1.execPendingActions(); + + // Bring the state back down to destroyed, simulating an activity restart + fc1.dispatchPause(); + final Parcelable savedState = fc1.saveAllState(); + fc1.doLoaderStop(true); + fc1.dispatchStop(); + final FragmentManagerNonConfig nonconf = fc1.retainNestedNonConfig(); + + final ArrayMap loaderNonConfig = fc1.retainLoaderNonConfig(); + assertNotNull("loaderNonConfig was null", loaderNonConfig); + + fc1.dispatchDestroy(); + + // Create the new controller and restore state + final FragmentController fc2 = FragmentController.createController( + new TestFragmentHostCallback(mActivityRule.getActivity(), h, 0)); + + final FragmentManager fm2 = fc2.getFragmentManager(); + + fc2.attachHost(null); + // Make sure nothing blows up on a null here + fc2.restoreLoaderNonConfig(null); + // for real this time + fc2.restoreLoaderNonConfig(loaderNonConfig); + fc2.restoreAllState(savedState, nonconf); + fc2.dispatchCreate(); + + + fc2.dispatchActivityCreated(); + fc2.noteStateNotSaved(); + fc2.execPendingActions(); + fc2.doLoaderStart(); + fc2.dispatchStart(); + fc2.reportLoaderStart(); + fc2.dispatchResume(); + fc2.execPendingActions(); + + // Test that the fragments are in the configuration we expect + final Fragment restoredOne = fm2.findFragmentByTag("one"); + final LoaderManager lm2 = restoredOne.getLoaderManager(); + + assertSame("didn't get same LoaderManager instance back", lm2, lm12); + + // Bring the state back down to destroyed before we finish the test + fc2.dispatchPause(); + fc2.saveAllState(); + fc2.dispatchStop(); + fc2.dispatchDestroy(); + }); + } + + @Test + @MediumTest + public void backStackLoaderIdentityTest() throws Throwable{ + mActivityRule.runOnUiThread(() -> { + final Handler h = new Handler(); + final FragmentHostCallback host1 = + new TestFragmentHostCallback(mActivityRule.getActivity(), h, 0); + final FragmentController fc1 = FragmentController.createController(host1); + + fc1.attachHost(null); + fc1.dispatchCreate(); + + final FragmentManager fm1 = fc1.getFragmentManager(); + + final Fragment f1 = new Fragment(); + fm1.beginTransaction().add(f1, "one").commitNow(); + + final LoaderManager lm1 = f1.getLoaderManager(); + + // Put the fragment on the back stack. + fm1.beginTransaction().remove(f1).addToBackStack("backentry").commit(); + fm1.executePendingTransactions(); + + fc1.dispatchActivityCreated(); + fc1.noteStateNotSaved(); + fc1.execPendingActions(); + fc1.doLoaderStart(); + fc1.dispatchStart(); + fc1.reportLoaderStart(); + fc1.dispatchResume(); + fc1.execPendingActions(); + + // Bring the state back down to destroyed, simulating an activity restart + fc1.dispatchPause(); + final Parcelable savedState = fc1.saveAllState(); + fc1.doLoaderStop(true); + fc1.dispatchStop(); + final FragmentManagerNonConfig nonconf = fc1.retainNestedNonConfig(); + + final ArrayMap loaderNonConfig = fc1.retainLoaderNonConfig(); + assertNotNull("loaderNonConfig was null", loaderNonConfig); + + fc1.dispatchDestroy(); + + // Create the new controller and restore state + final FragmentHostCallback host2 = + new TestFragmentHostCallback(mActivityRule.getActivity(), h, 0); + final FragmentController fc2 = FragmentController.createController(host2); + + final FragmentManager fm2 = fc2.getFragmentManager(); + + fc2.attachHost(null); + fc2.restoreLoaderNonConfig(loaderNonConfig); + fc2.restoreAllState(savedState, nonconf); + fc2.dispatchCreate(); + + + fc2.dispatchActivityCreated(); + fc2.noteStateNotSaved(); + fc2.execPendingActions(); + fc2.doLoaderStart(); + fc2.dispatchStart(); + fc2.reportLoaderStart(); + fc2.dispatchResume(); + fc2.execPendingActions(); + + assertNotSame("LoaderManager kept reference to old FragmentHostCallback", + host1, lm1.getFragmentHostCallback()); + assertSame("LoaderManager did not refrence new FragmentHostCallback", + host2, lm1.getFragmentHostCallback()); + + // Test that the fragments are in the configuration we expect + final Fragment restoredOne = fm2.findFragmentByTag("one"); + final LoaderManager lm2 = restoredOne.getLoaderManager(); + + assertSame("didn't get same LoaderManager instance back", lm2, lm1); + + // Bring the state back down to destroyed before we finish the test + fc2.dispatchPause(); + fc2.saveAllState(); + fc2.dispatchStop(); + fc2.dispatchDestroy(); + }); + } + + public class TestFragmentHostCallback extends FragmentHostCallback { + public TestFragmentHostCallback(Context context, Handler handler, int windowAnimations) { + super(context, handler, windowAnimations); + } + + @Override + public LoaderLifecycleTest onGetHost() { + return LoaderLifecycleTest.this; + } + } +} diff --git a/core/tests/coretests/src/android/net/NetworkStatsTest.java b/core/tests/coretests/src/android/net/NetworkStatsTest.java index 9074f8a97132e00ef32791c2634ab4f19aa6294f..d48a67a4c72f7dcaca63d2ad4fef75abd439af85 100644 --- a/core/tests/coretests/src/android/net/NetworkStatsTest.java +++ b/core/tests/coretests/src/android/net/NetworkStatsTest.java @@ -454,7 +454,7 @@ public class NetworkStatsTest extends TestCase { .addValues(underlyingIface, tunUid, SET_FOREGROUND, TAG_NONE, 0L, 0L, 0L, 0L, 0L); assertTrue(delta.migrateTun(tunUid, tunIface, underlyingIface)); - assertEquals(21, delta.size()); + assertEquals(20, delta.size()); // tunIface and TEST_IFACE entries are not changed. assertValues(delta, 0, tunIface, 10100, SET_DEFAULT, TAG_NONE, ROAMING_NO, @@ -478,38 +478,89 @@ public class NetworkStatsTest extends TestCase { // Existing underlying Iface entries are updated assertValues(delta, 9, underlyingIface, 10100, SET_DEFAULT, TAG_NONE, ROAMING_NO, - 44783L, 54L, 13829L, 60L, 0L); + 44783L, 54L, 14178L, 62L, 0L); assertValues(delta, 10, underlyingIface, 10100, SET_FOREGROUND, TAG_NONE, ROAMING_NO, 0L, 0L, 0L, 0L, 0L); // VPN underlying Iface entries are updated assertValues(delta, 11, underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, ROAMING_NO, - 28304L, 27L, 1719L, 12L, 0L); + 28304L, 27L, 1L, 2L, 0L); assertValues(delta, 12, underlyingIface, tunUid, SET_FOREGROUND, TAG_NONE, ROAMING_NO, 0L, 0L, 0L, 0L, 0L); // New entries are added for new application's underlying Iface traffic assertContains(delta, underlyingIface, 10120, SET_DEFAULT, TAG_NONE, ROAMING_NO, - 72667L, 197L, 41872L, 219L, 0L); + 72667L, 197L, 43123L, 227L, 0L); assertContains(delta, underlyingIface, 10120, SET_FOREGROUND, TAG_NONE, ROAMING_NO, - 9297L, 17L, 3936, 19L, 0L); + 9297L, 17L, 4054, 19L, 0L); assertContains(delta, underlyingIface, 10120, SET_DEFAULT, testTag1, ROAMING_NO, - 21691L, 41L, 13179L, 46L, 0L); + 21691L, 41L, 13572L, 48L, 0L); assertContains(delta, underlyingIface, 10120, SET_FOREGROUND, testTag1, ROAMING_NO, - 1281L, 2L, 634L, 1L, 0L); + 1281L, 2L, 653L, 1L, 0L); // New entries are added for debug purpose assertContains(delta, underlyingIface, 10100, SET_DBG_VPN_IN, TAG_NONE, ROAMING_NO, - 39605L, 46L, 11690, 49, 0); + 39605L, 46L, 12039, 51, 0); assertContains(delta, underlyingIface, 10120, SET_DBG_VPN_IN, TAG_NONE, ROAMING_NO, - 81964, 214, 45808, 238, 0); - assertContains(delta, underlyingIface, tunUid, SET_DBG_VPN_IN, TAG_NONE, ROAMING_NO, - 4983, 10, 1717, 10, 0); + 81964, 214, 47177, 246, 0); assertContains(delta, underlyingIface, tunUid, SET_DBG_VPN_OUT, TAG_NONE, ROAMING_ALL, - 126552, 270, 59215, 297, 0); + 121569, 260, 59216, 297, 0); } + // Tests a case where all of the data received by the tun0 interface is echo back into the tun0 + // interface by the vpn app before it's sent out of the underlying interface. The VPN app should + // not be charged for the echoed data but it should still be charged for any extra data it sends + // via the underlying interface. + public void testMigrateTun_VpnAsLoopback() { + final int tunUid = 10030; + final String tunIface = "tun0"; + final String underlyingIface = "wlan0"; + NetworkStats delta = new NetworkStats(TEST_START, 9) + // 2 different apps sent/receive data via tun0. + .addValues(tunIface, 10100, SET_DEFAULT, TAG_NONE, 50000L, 25L, 100000L, 50L, 0L) + .addValues(tunIface, 20100, SET_DEFAULT, TAG_NONE, 500L, 2L, 200L, 5L, 0L) + // VPN package resends data through the tunnel (with exaggerated overhead) + .addValues(tunIface, tunUid, SET_DEFAULT, TAG_NONE, 240000, 100L, 120000L, 60L, 0L) + // 1 app already has some traffic on the underlying interface, the other doesn't yet + .addValues(underlyingIface, 10100, SET_DEFAULT, TAG_NONE, 1000L, 10L, 2000L, 20L, 0L) + // Traffic through the underlying interface via the vpn app. + // This test should redistribute this data correctly. + .addValues(underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, + 75500L, 37L, 130000L, 70L, 0L); + + assertTrue(delta.migrateTun(tunUid, tunIface, underlyingIface)); + assertEquals(9, delta.size()); + + // tunIface entries should not be changed. + assertValues(delta, 0, tunIface, 10100, SET_DEFAULT, TAG_NONE, ROAMING_NO, + 50000L, 25L, 100000L, 50L, 0L); + assertValues(delta, 1, tunIface, 20100, SET_DEFAULT, TAG_NONE, ROAMING_NO, + 500L, 2L, 200L, 5L, 0L); + assertValues(delta, 2, tunIface, tunUid, SET_DEFAULT, TAG_NONE, ROAMING_NO, + 240000L, 100L, 120000L, 60L, 0L); + + // Existing underlying Iface entries are updated + assertValues(delta, 3, underlyingIface, 10100, SET_DEFAULT, TAG_NONE, ROAMING_NO, + 51000L, 35L, 102000L, 70L, 0L); + + // VPN underlying Iface entries are updated + assertValues(delta, 4, underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, ROAMING_NO, + 25000L, 10L, 29800L, 15L, 0L); + + // New entries are added for new application's underlying Iface traffic + assertContains(delta, underlyingIface, 20100, SET_DEFAULT, TAG_NONE, ROAMING_NO, + 500L, 2L, 200L, 5L, 0L); + + // New entries are added for debug purpose + assertContains(delta, underlyingIface, 10100, SET_DBG_VPN_IN, TAG_NONE, ROAMING_NO, + 50000L, 25L, 100000L, 50L, 0L); + assertContains(delta, underlyingIface, 20100, SET_DBG_VPN_IN, TAG_NONE, ROAMING_NO, + 500, 2L, 200L, 5L, 0L); + assertContains(delta, underlyingIface, tunUid, SET_DBG_VPN_OUT, TAG_NONE, ROAMING_ALL, + 50500L, 27L, 100200L, 55, 0); + } + private static void assertContains(NetworkStats stats, String iface, int uid, int set, int tag, int roaming, long rxBytes, long rxPackets, long txBytes, long txPackets, long operations) { diff --git a/core/tests/coretests/src/android/os/FileUtilsTest.java b/core/tests/coretests/src/android/os/FileUtilsTest.java index ac5abadcc48a41bab700d37be6c9e3df4d64512d..bd900793f87d9395f48361fd48da183d97f724e9 100644 --- a/core/tests/coretests/src/android/os/FileUtilsTest.java +++ b/core/tests/coretests/src/android/os/FileUtilsTest.java @@ -297,6 +297,20 @@ public class FileUtilsTest extends AndroidTestCase { FileUtils.buildUniqueFile(mTarget, "image/jpeg", "test.jpg")); } + public void testBuildUniqueFile_mimeless() throws Exception { + assertNameEquals("test.jpg", FileUtils.buildUniqueFile(mTarget, "test.jpg")); + new File(mTarget, "test.jpg").createNewFile(); + assertNameEquals("test (1).jpg", FileUtils.buildUniqueFile(mTarget, "test.jpg")); + + assertNameEquals("test", FileUtils.buildUniqueFile(mTarget, "test")); + new File(mTarget, "test").createNewFile(); + assertNameEquals("test (1)", FileUtils.buildUniqueFile(mTarget, "test")); + + assertNameEquals("test.foo.bar", FileUtils.buildUniqueFile(mTarget, "test.foo.bar")); + new File(mTarget, "test.foo.bar").createNewFile(); + assertNameEquals("test.foo (1).bar", FileUtils.buildUniqueFile(mTarget, "test.foo.bar")); + } + private static void assertNameEquals(String expected, File actual) { assertEquals(expected, actual.getName()); } diff --git a/core/tests/coretests/src/android/os/OsTests.java b/core/tests/coretests/src/android/os/OsTests.java index 582bf1ae204aad043bf3f977bdea1fb1da929ca2..985fa4f3cfc8560af7b1e98a29d5a62e42f78ffb 100644 --- a/core/tests/coretests/src/android/os/OsTests.java +++ b/core/tests/coretests/src/android/os/OsTests.java @@ -32,6 +32,7 @@ public class OsTests { suite.addTestSuite(IdleHandlerTest.class); suite.addTestSuite(MessageQueueTest.class); suite.addTestSuite(MessengerTest.class); + suite.addTestSuite(PatternMatcherTest.class); suite.addTestSuite(SystemPropertiesTest.class); return suite; diff --git a/core/tests/coretests/src/android/os/PatternMatcherTest.java b/core/tests/coretests/src/android/os/PatternMatcherTest.java new file mode 100644 index 0000000000000000000000000000000000000000..9645ccc11b765f42d7aa1774f05d595e61a16de7 --- /dev/null +++ b/core/tests/coretests/src/android/os/PatternMatcherTest.java @@ -0,0 +1,234 @@ +package android.os; + +import android.test.suitebuilder.annotation.SmallTest; +import junit.framework.TestCase; +import org.junit.runner.RunWith; +import org.junit.Test; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +@SmallTest +public class PatternMatcherTest extends TestCase{ + + @Test + public void testAdvancedPatternMatchesAnyToken() { + PatternMatcher matcher = new PatternMatcher(".", PatternMatcher.PATTERN_ADVANCED_GLOB); + assertMatches("a", matcher); + assertMatches("b", matcher); + assertNotMatches("", matcher); + } + + @Test + public void testAdvancedPatternMatchesSetToken() { + PatternMatcher matcher = new PatternMatcher("[a]", PatternMatcher.PATTERN_ADVANCED_GLOB); + assertMatches("a", matcher); + assertNotMatches("b", matcher); + + matcher = new PatternMatcher("[.*+{}\\]\\\\[]", PatternMatcher.PATTERN_ADVANCED_GLOB); + assertMatches(".", matcher); + assertMatches("*", matcher); + assertMatches("+", matcher); + assertMatches("{", matcher); + assertMatches("}", matcher); + assertMatches("]", matcher); + assertMatches("\\", matcher); + assertMatches("[", matcher); + } + + @Test + public void testAdvancedPatternMatchesSetCharacterClassToken() { + PatternMatcher matcher = new PatternMatcher("[a-z]", PatternMatcher.PATTERN_ADVANCED_GLOB); + assertMatches("a", matcher); + assertMatches("b", matcher); + assertNotMatches("A", matcher); + assertNotMatches("1", matcher); + + matcher = new PatternMatcher("[a-z][0-9]", PatternMatcher.PATTERN_ADVANCED_GLOB); + assertMatches("a1", matcher); + assertNotMatches("1a", matcher); + assertNotMatches("aa", matcher); + + matcher = new PatternMatcher("[z-a]", PatternMatcher.PATTERN_ADVANCED_GLOB); + assertNotMatches("a", matcher); + assertNotMatches("z", matcher); + assertNotMatches("A", matcher); + + matcher = new PatternMatcher("[^0-9]", PatternMatcher.PATTERN_ADVANCED_GLOB); + assertMatches("a", matcher); + assertMatches("z", matcher); + assertMatches("A", matcher); + assertNotMatches("9", matcher); + assertNotMatches("5", matcher); + assertNotMatches("0", matcher); + + assertPoorlyFormattedPattern("[]a]"); + matcher = new PatternMatcher("[\\[a]", PatternMatcher.PATTERN_ADVANCED_GLOB); + assertMatches("a", matcher); + assertMatches("[", matcher); + } + + @Test + public void testAdvancedPatternMatchesEscapedCharacters() { + PatternMatcher matcher = new PatternMatcher("\\.", PatternMatcher.PATTERN_ADVANCED_GLOB); + assertMatches(".", matcher); + assertNotMatches("a", matcher); + assertNotMatches("1", matcher); + + matcher = new PatternMatcher("a\\+", PatternMatcher.PATTERN_ADVANCED_GLOB); + assertMatches("a+", matcher); + assertNotMatches("a", matcher); + assertNotMatches("aaaaa", matcher); + + matcher = new PatternMatcher("[\\a-\\z]", PatternMatcher.PATTERN_ADVANCED_GLOB); + assertMatches("a", matcher); + assertMatches("z", matcher); + assertNotMatches("A", matcher); + } + + @Test + public void testAdvancedPatternMatchesLiteralTokens() { + PatternMatcher matcher = new PatternMatcher("a", PatternMatcher.PATTERN_ADVANCED_GLOB); + assertNotMatches("", matcher); + assertMatches("a", matcher); + assertNotMatches("z", matcher); + + matcher = new PatternMatcher("az", PatternMatcher.PATTERN_ADVANCED_GLOB); + assertNotMatches("", matcher); + assertMatches("az", matcher); + assertNotMatches("za", matcher); + } + + @Test + public void testAdvancedPatternMatchesSetZeroOrMore() { + PatternMatcher matcher = new PatternMatcher("[a-z]*", PatternMatcher.PATTERN_ADVANCED_GLOB); + + assertMatches("", matcher); + assertMatches("a", matcher); + assertMatches("abcdefg", matcher); + assertNotMatches("abc1", matcher); + assertNotMatches("1abc", matcher); + } + + @Test + public void testAdvancedPatternMatchesSetOneOrMore() { + PatternMatcher matcher = new PatternMatcher("[a-z]+", PatternMatcher.PATTERN_ADVANCED_GLOB); + + assertNotMatches("", matcher); + assertMatches("a", matcher); + assertMatches("abcdefg", matcher); + assertNotMatches("abc1", matcher); + assertNotMatches("1abc", matcher); + } + + + @Test + public void testAdvancedPatternMatchesSingleRange() { + PatternMatcher matcher = new PatternMatcher("[a-z]{1}", + PatternMatcher.PATTERN_ADVANCED_GLOB); + + assertNotMatches("", matcher); + assertMatches("a", matcher); + assertMatches("z", matcher); + assertNotMatches("1", matcher); + assertNotMatches("aa", matcher); + } + + @Test + public void testAdvancedPatternMatchesFullRange() { + PatternMatcher matcher = new PatternMatcher("[a-z]{1,5}", + PatternMatcher.PATTERN_ADVANCED_GLOB); + + assertNotMatches("", matcher); + assertMatches("a", matcher); + assertMatches("zazaz", matcher); + assertNotMatches("azazaz", matcher); + assertNotMatches("11111", matcher); + } + + @Test + public void testAdvancedPatternMatchesPartialRange() { + PatternMatcher matcher = new PatternMatcher("[a-z]{3,}", + PatternMatcher.PATTERN_ADVANCED_GLOB); + + assertNotMatches("", matcher); + assertMatches("aza", matcher); + assertMatches("zazaz", matcher); + assertMatches("azazazazazaz", matcher); + assertNotMatches("aa", matcher); + } + + @Test + public void testAdvancedPatternMatchesComplexPatterns() { + PatternMatcher matcher = new PatternMatcher( + "/[0-9]{4}/[0-9]{2}/[0-9]{2}/[a-zA-Z0-9_]+\\.html", + PatternMatcher.PATTERN_ADVANCED_GLOB); + + assertNotMatches("", matcher); + assertMatches("/2016/09/07/got_this_working.html", matcher); + assertMatches("/2016/09/07/got_this_working2.html", matcher); + assertNotMatches("/2016/09/07/got_this_working2dothtml", matcher); + assertNotMatches("/2016/9/7/got_this_working.html", matcher); + + matcher = new PatternMatcher( + "/b*a*bar.*", + PatternMatcher.PATTERN_ADVANCED_GLOB); + + assertMatches("/babar", matcher); + assertMatches("/babarfff", matcher); + assertMatches("/bbaabarfff", matcher); + assertMatches("/babar?blah", matcher); + assertMatches("/baaaabar?blah", matcher); + assertNotMatches("?bar", matcher); + assertNotMatches("/bar", matcher); + assertNotMatches("/baz", matcher); + assertNotMatches("/ba/bar", matcher); + assertNotMatches("/barf", matcher); + assertNotMatches("/", matcher); + assertNotMatches("?blah", matcher); + } + + @Test + public void testAdvancedPatternPoorFormatThrowsIllegalArgumentException() { + assertPoorlyFormattedPattern("[a-z"); + assertPoorlyFormattedPattern("a{,4}"); + assertPoorlyFormattedPattern("a{0,a}"); + assertPoorlyFormattedPattern("a{\\1, 2}"); + assertPoorlyFormattedPattern("[]"); + assertPoorlyFormattedPattern("a{}"); + assertPoorlyFormattedPattern("{3,4}"); + assertPoorlyFormattedPattern("a+{3,4}"); + assertPoorlyFormattedPattern("*."); + assertPoorlyFormattedPattern(".+*"); + assertPoorlyFormattedPattern("a{3,4"); + assertPoorlyFormattedPattern("[a"); + assertPoorlyFormattedPattern("abc\\"); + assertPoorlyFormattedPattern("+."); + + StringBuilder charSet = new StringBuilder("["); + for (int i = 0; i < 1024; i++) { + charSet.append('a' + (i % 26)); + } + charSet.append("]"); + assertPoorlyFormattedPattern(charSet.toString()); + } + + private void assertMatches(String string, PatternMatcher matcher) { + assertTrue("'" + string + "' should match '" + matcher.toString() + "'", + matcher.match(string)); + } + + private void assertNotMatches(String string, PatternMatcher matcher) { + assertTrue("'" + string + "' should not match '" + matcher.toString() + "'", + !matcher.match(string)); + } + + private void assertPoorlyFormattedPattern(String format) { + try { + new PatternMatcher(format, PatternMatcher.PATTERN_ADVANCED_GLOB); + } catch (IllegalArgumentException e) { + return;// expected + } + + fail("'" + format + "' was erroneously created"); + } +} diff --git a/docs/html-intl/intl/es/about/versions/nougat/index.jd b/docs/html-intl/intl/es/about/versions/nougat/index.jd index b30cc88e064431e83babb2db08542c8b695313bd..59afd8120ab3d4c73ea2dff46d3798d2a6dc83c5 100644 --- a/docs/html-intl/intl/es/about/versions/nougat/index.jd +++ b/docs/html-intl/intl/es/about/versions/nougat/index.jd @@ -7,16 +7,6 @@ header.hide=1 footer.hide=1 @jd:body - -

    -
    -
    autofill
    +
    Auto Fill Prices, Country, and + Price
    -

    This is equivalent to clicking Auto Fill in the In-app Products UI. Can be - true or false. The syntax for specifying the country - and price varies depending on which autofill setting you use:

    +

    + You can set Auto Fill Prices to true or + false. + If an in-app product uses a pricing + template, you should set Auto Fill Prices to + false, and you shouldn't set a value for the + Price. +

    +

    + Note: When you specify an item's price in a CSV file, you + provide a price in micro-units, where 1,000,000 micro-units is + equivalent to 1 unit of real currency. +

    +

    + The following sections describe how the value of + Auto Fill Prices affects the syntax and meaning of the + Country and Price values. +

    +
    Using auto-filled prices
    +

    + If you set Auto Fill Prices to true, you specify + only the item's default price; you don't include a Country + value. Setting Auto Fill Prices to true has the + same effect as performing the following sequence of actions: +

    +
      +
    1. + Navigating to an in-app product's Managed Product Details page. +
    2. +
    3. + Selecting Edit in the Price section. +
    4. +
    5. + Entering a default, tax-exclusive price. Auto-filled prices include tax. +
    6. +
    7. + Clicking the checkbox next to COUNTRY in the Edit Local + Prices dialog that appears. +
    8. +
    9. + Selecting Refresh exchange rates. +
    10. +
    11. + Selecting Apply. +
    12. +
    +

    + For example, under the following conditions: +

      +
    • Your app's default locale is en_US.
    • +
    • An in-app product's default, tax-exclusive price is $1.99.
    • +
    • You want the prices for other countries auto-filled.
    • +
    +

    + ...you'd set the values of Auto Fill Prices and + Price at the end of a row in the CSV file as follows: +

    + +
    +true,1990000,
    +
    + +
    Not using auto-filled prices
    +

    + If you set Auto Fill Prices to false instead, + you specify a series of Country and Price + values for all countries where you distribute your app, including the country corresponding to your app's default locale. + Each Country value is the two-letter uppercase ISO country + code that represents a country where your app is distributed. +

    +

    + Note: You must provide a country code and price for each + country that your app is targeting. To view and edit the list of countries + that your app targets, open your app's Pricing & Distribution + page. +

    +

    + Each Price value represents the cost of the item in + micro-units of the currency used in that country. Setting Auto Fill + Prices to false has the same effect as performing + the following sequence of actions: +

    +
      +
    1. + Navigating to an in-app product's Managed Product Details page. +
    2. +
    3. + Selecting Edit in the Price section. +
    4. -

      If autofill is set to true, you need to specify only the default - price in your home currency, and you must use this syntax:

      -

      "true","default_price_in_home_currency" + Explicitly setting tax-inclusive prices for different countries in the + Edit Local Prices dialog that appears.

    5. -

      If autofill is set to false, you need to specify a country - and a price for each currency, and you must use the following syntax:

      -

      "false", "home_country; default_price_in_home_currency; country_2; - country_2_price; country_3; country_3_price; ..."

      + Selecting Apply.
    6. +
    +

    + For example, if you're offering your app for the following prices (all + taxes included) in other countries: +

    +
      +
    • R$6.99 in Brazil.
    • +
    • 129 ₽ in Russia.
    • +
    • ₹130 in India.
    • +
    • Rp 27,000 in Indonesia.
    • +
    • $37 in Mexico.
    -

    Note: If you use an autofill value of false - and set country prices manually, you must incorporate country-specific - pricing patterns, including tax rates, into the prices you provide.

    -
    -
    country
    -
    - The country for which you are specifying a price. You can only list countries that your - app is targeting. The country codes are two-letter uppercase - ISO country codes (such as "US"), as defined by - ISO 3166-2. +

    + ...you'd set the values of Auto Fill Prices, + Country, and Price at the end of a row in the + CSV file as follows: +

    + +
    +false, BR; 6990000; RU; 129000000; IN; 130000000; ID; 27000000000; MX; 37000000;
    +
    +
    -
    price
    +
    Pricing Template ID
    - This is equivalent to the Price in the In-app Products UI. The price must be specified in - micro-units. To convert a currency value to micro-units, you multiply the real value by - 1,000,000. - For example, if you want to sell an in-app item for $1.99, you specify 1990000 in the - price field. +

    + If an item is linked to a pricing template, you should set Auto Fill + Prices to false, and you shouldn't set a value for the + Price column. If the item isn't linked to a pricing template, + you shouldn't set a value for the Pricing Template ID; instead, + you should set Auto Fill Prices, Country, and + Price based on how you want to set the in-app product's prices. +

    +

    + Setting this value has the same effect as navigating to an in-app product's + Managed Product Details page and linking the product's price to the + pricing template that has the same pricing template ID as the one specified + in the CSV file. This pricing template ID appears underneath a pricing + template's name on the Pricing template page. +

    +

    + If you import a CSV file, and you've checked the Overwrite existing + products checkbox in the Import In-app Products dialog, + you can update the links between in-app products and pricing templates. To + link the product to a specific pricing template, set the Pricing + Template ID value to that pricing template's ID. To unlink an in-app + product from all pricing templates, don't set a value for its Pricing + Template ID. +

    +

    + You can link up to 100 app prices or in-app product prices to a particular + pricing template. Therefore, don't specify the same Pricing Template + ID value in more than 100 rows of a CSV file. +

    -

    Table 1. Language codes you can use -with the locale field.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    LanguageCodeLanguageCode
    Chinesezh_TWItalianit_IT
    Czechcs_CZJapaneseja_JP
    Danishda_DKKoreanko_KR
    Dutchnl_NLNorwegianno_NO
    Englishen_USPolishpl_PL
    Frenchfr_FRPortuguesept_PT
    Finnishfi_FIRussianru_RU
    Germande_DESpanishes_ES
    Hebrewiw_ILSwedishsv_SE
    Hindihi_IN----
    -

    Pricing Templates

    @@ -432,8 +609,12 @@ with the locale field.

    When creating a pricing template, you provide new pricing information that you - can apply to paid apps and in-app products. To add a pricing template, do the - following: + can apply to paid apps and in-app products. You can link the prices of up to + 100 apps and in-app products to a single pricing template. +

    + +

    + To add a pricing template, do the following:

      @@ -442,14 +623,14 @@ with the locale field.

      account. -
    1. In the Settings panel, open the Pricing - template page. +
    2. In the Settings panel, open the Pricing + template page.
    3. - If you are adding your first pricing template, the Add a Pricing - Template banner appears. Select Add template to + If you are adding your first pricing template, the Add a Pricing + Template banner appears. Select Add template to create a new template. The new template's Pricing tab appears.

      @@ -510,8 +691,8 @@ with the locale field.

      account.
    4. -
    5. In the Settings panel, open the Pricing - template page. This page shows the list of pricing templates you have +
    6. In the Settings panel, open the Pricing + template page. This page shows the list of pricing templates you have created for your account.
    7. @@ -571,8 +752,8 @@ with the locale field.

      account. -
    8. In the All applications panel, select the app name, then - open the In-app Products page. +
    9. In the All applications panel, select the app name, then + open the In-app Products page.
    10. Choose the in-app product that you want to link to a pricing template. @@ -591,7 +772,7 @@ with the locale field.

      To link the price of a paid app to a pricing template, you follow a similar - process on the app's Pricing & Distribution page. + process on the app's Pricing & Distribution page.

      @@ -623,7 +804,7 @@ with the locale field.

    11. Select the app that contains the in-app product you want to delete.
    12. -
    13. Open the app's In-app Products page. +
    14. Open the app's In-app Products page.
    15. Choose the in-app product that you want to delete. @@ -697,8 +878,8 @@ with the locale field.

      account.
    16. -
    17. In the Settings panel, open the Pricing - template page, which shows the list of pricing templates you have +
    18. In the Settings panel, open the Pricing + template page, which shows the list of pricing templates you have created for your account.
    19. @@ -712,15 +893,15 @@ with the locale field.

    -

    Choosing a Product Type

    +

    Choosing a Product Type

    An item's product type controls how Google Play manages the purchase of the item. The supported product types include "managed product" and "subscription." Since support for different product types can vary among versions of the In-app Billing API, make sure that you choose a product -type that's valid for the version of the In-app Billing API that your app uses.

    +type that's valid for the version of the In-app Billing API that your app uses.

    For details, refer to the documentation for the In-app Billing API. +href="{@docRoot}google/play/billing/api.html#producttype">In-app Billing API.

    Handling Refunds

    @@ -748,9 +929,10 @@ you at the conclusion of the purchase flow, as the value of the intent.

    - Note: Test purchases don't have an orderId - field. To track test transactions, you use the purchaseToken - field instead. For more information about working with test purchases, see Note: When a user completes a test purchase, the + orderId field remains blank. To track test transactions, use + the purchaseToken field instead. For more information about + working with test purchases, see Testing In-app Billing.

    @@ -765,14 +947,14 @@ assigned and managed by Google.

    For transactions dated 5 December 2012 or later, Google payments assigns a Merchant Order Number (rather than a Google Order Number) and reports the Merchant -Order Number as the value of orderId. Here's an +Order Number as the value of orderID. Here's an example:

    "orderId" : "GPA.1234-5678-9012-34567"

    For transactions dated previous to 5 December 2012, Google checkout assigned a Google Order Number and reported that number as the value of -orderId. Here's an example of an orderId holding a +orderID. Here's an example of an orderID holding a Google Order Number:

    "orderId" : "556515565155651"
    @@ -819,8 +1001,8 @@ app.

    To locate the key for an app, follow these steps:

      -
    1. Open the All applications panel.
    2. -
    3. Click on the app name, then open the Services & APIs +
    4. Open the All applications panel.
    5. +
    6. Click on the app name, then open the Services & APIs page.
    7. Scroll down to the section of the page labeled Your License Key for This Application, as shown in figure 5.
    8. @@ -835,7 +1017,7 @@ for apps that depend on the (former) developer key.

      width="700" alt="">
      Figure 5. You can find the license key for each app on the - Services & APIs page. + Services & APIs page.
      diff --git a/docs/html/google/play/billing/billing_integrate.jd b/docs/html/google/play/billing/billing_integrate.jd index 5d6b3a8f2e3ff1b156397676b0d6fe4dc77c4dec..506a44006bdba6f0546068a137bc0aab62d28b67 100755 --- a/docs/html/google/play/billing/billing_integrate.jd +++ b/docs/html/google/play/billing/billing_integrate.jd @@ -9,18 +9,18 @@ page.tags="inapp, billing, iap"

      In this document

      1. Adding the AIDL file
      2. -
      3. Updating Your Manifest
      4. +
      5. Updating your manifest
      6. Creating a ServiceConnection
      7. -
      8. Making In-app Billing Requests +
      9. Making In-app Billing requests
          -
        1. Querying Items Available for Purchase
        2. -
        3. Purchasing an Item
        4. -
        5. Querying Purchased Items
        6. -
        7. Consuming a Purchase
        8. -
        9. Implementing Subscriptions
        10. +
        11. Querying items available for purchase
        12. +
        13. Purchasing an item
        14. +
        15. Querying purchased items
        16. +
        17. Consuming a purchase
        18. +
        19. Implementing subscriptions
      10. -
      11. Securing Your App +
      12. Securing your app

      Reference

        @@ -42,7 +42,7 @@ page.tags="inapp, billing, iap" In-app Billing on Google Play provides a straightforward, simple interface for sending In-app Billing requests and managing In-app Billing transactions using Google Play. The information below covers the basics of how to make - calls from your application to the In-app Billing service using the Version 3 + calls from your application to the In-app Billing service using the In-app Billing Version 3 API.

        @@ -51,26 +51,25 @@ page.tags="inapp, billing, iap" your application, see the Selling In-app Products training class. The training class provides a complete sample In-app Billing - application, including convenience classes to handle key tasks related to - setting up your connection, sending billing requests and processing responses + application, including convenience classes to handle key tasks that are related to + setting up your connection, sending billing requests, processing responses from Google Play, and managing background threading so that you can make In-app Billing calls from your main activity.

        - Before you start, be sure that you read the In-app Billing - Overview to familiarize yourself with concepts that will make it easier + Overview to familiarize yourself with concepts that make it easier for you to implement In-app Billing.

        -

        To implement In-app Billing in your application, you need to do the -following:

        +

        Complete these steps to implement In-app Billing in your application:

        1. Add the In-app Billing library to your project.
        2. Update your {@code AndroidManifest.xml} file.
        3. -
        4. Create a {@code ServiceConnection} and bind it to +
        5. Create a {@code ServiceConnection} and bind it to the {@code IInAppBillingService}.
        6. Send In-app Billing requests from your application to {@code IInAppBillingService}.
        7. @@ -79,55 +78,56 @@ following:

          Adding the AIDL file to your project

          -

          {@code IInAppBillingService.aidl} is an Android Interface Definition +

          The {@code IInAppBillingService.aidl} is an Android Interface Definition Language (AIDL) file that defines the interface to the In-app Billing Version -3 service. You will use this interface to make billing requests by invoking IPC +3 service. You can use this interface to make billing requests by invoking IPC method calls.

          -

          To get the AIDL file:

          + +

          Complete these steps to get the AIDL file:

          1. Open the Android SDK Manager.
          2. In the SDK Manager, expand the {@code Extras} section.
          3. Select Google Play Billing Library.
          4. Click Install packages to complete the download.
          -

          The {@code IInAppBillingService.aidl} file will be installed to {@code /extras/google/play_billing/}.

          +

          The {@code IInAppBillingService.aidl} file will be installed to {@code <sdk>/extras/google/play_billing/}.

          -

          To add the AIDL to your project:

          +

          Complete these steps to add the AIDL to your project:

            -
          1. First, download the Google Play Billing Library to your Android project: +
          2. Download the Google Play Billing Library to your Android project:
            1. Select Tools > Android > SDK Manager.
            2. Under Appearance & Behavior > System Settings > Android SDK, select the SDK Tools tab to select and download Google Play Billing Library.
            -
          3. Next, copy the {@code IInAppBillingService.aidl} file to your project. +
          4. Copy the {@code IInAppBillingService.aidl} file to your project.
              -
            • If you are using Android Studio: +
            • If you are using Android Studio, complete these steps to copy the file:
              1. Navigate to {@code src/main} in the Project tool window.
              2. -
              3. Select File > New > Directory and enter {@code aidl} in the - New Directory window, then select OK. +
              4. Select File > New > Directory, enter {@code aidl} in the + New Directory window, and select OK. -
              5. Select File > New > Package and enter - {@code com.android.vending.billing} in the New Package window, then select +
              6. Select File > New > Package, enter + {@code com.android.vending.billing} in the New Package window, and select OK.
              7. Using your operating system file explorer, navigate to - {@code /extras/google/play_billing/}, copy the + {@code <sdk>/extras/google/play_billing/}, copy the {@code IInAppBillingService.aidl} file, and paste it into the {@code com.android.vending.billing} package in your project.
            • -
            • If you are developing in a non-Android Studio environment: Create the - following directory {@code /src/com/android/vending/billing} and copy the - {@code IInAppBillingService.aidl} file into this directory. Put the AIDL - file into your project and use the Gradle tool to build your project so that - the IInAppBillingService.java file gets generated. +
            • If you are developing in a non-Android Studio environment, create the + following directory: {@code /src/com/android/vending/billing}. Copy the + {@code IInAppBillingService.aidl} file into this directory. Place the AIDL + file in your project and use the Gradle tool to build your project so that + the IInAppBillingService.java file is generated.
          5. @@ -137,16 +137,16 @@ method calls.

          -

          Updating Your App's Manifest

          +

          Updating your app's manifest

          In-app billing relies on the Google Play application, which handles all - communication between your application and the Google Play server. To use the + of the communication between your application and the Google Play server. To use the Google Play application, your application must request the proper permission. You can do this by adding the {@code com.android.vending.BILLING} permission to your AndroidManifest.xml file. If your application does not declare the In-app Billing permission, but attempts to send billing requests, Google Play - will refuse the requests and respond with an error. + refuses the requests and responds with an error.

          @@ -182,7 +182,7 @@ method calls.

          onServiceDisconnected} and {@link android.content.ServiceConnection#onServiceConnected onServiceConnected} methods to get a reference to the {@code IInAppBillingService} instance after - a connection has been established. + a connection is established.

          @@ -208,20 +208,25 @@ ServiceConnection mServiceConn = new ServiceConnection() {
             bindService} method. Pass the method an {@link android.content.Intent} that
             references the In-app Billing service and an instance of the {@link
             android.content.ServiceConnection} that you created, and explicitly set the
          -  Intent's target package name to com.android.vending — the
          +  Intent's target package name to com.android.vending—the
             package name of Google Play app.
           

          Caution: To protect the security of billing transactions, - always make sure to explicitly set the intent's target package name to + always explicitly set the intent's target package name to com.android.vending, using {@link - android.content.Intent#setPackage(java.lang.String) setPackage()} as shown in - the example below. Setting the package name explicitly ensures that + android.content.Intent#setPackage(java.lang.String) setPackage()}. + Setting the package name explicitly ensures that only the Google Play app can handle billing requests from your app, preventing other apps from intercepting those requests.

          +

          + The following code sample demonstrates how to set the intent's target package + to protect the security of transactions: +

          +
          @Override
           public void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
          @@ -233,6 +238,13 @@ public void onCreate(Bundle savedInstanceState) {
           }
           
          +

          Caution: To ensure that your app is secure, always use an +explicit intent when starting a {@link android.app.Service} and do not declare intent filters for +your services. Using an implicit intent to start a service is a security hazard because you cannot +be certain of the service that will respond to the intent, and the user cannot see which service +starts. Beginning with Android 5.0 (API level 21), the system throws an exception if you call +{@link android.content.Context#bindService bindService()} with an implicit intent.

          +

          You can now use the mService reference to communicate with the Google Play service. @@ -242,10 +254,14 @@ public void onCreate(Bundle savedInstanceState) { Important: Remember to unbind from the In-app Billing service when you are done with your {@link android.app.Activity}. If you don’t unbind, the open service connection could cause your device’s - performance to degrade. This example shows how to perform the unbind + performance to degrade. +

          + +

          + This example shows how to perform the unbind operation on a service connection to In-app Billing called {@code mServiceConn} by overriding the activity’s {@link - android.app.Activity#onDestroy onDestroy} method. + android.app.Activity#onDestroy onDestroy} method:

          @@ -264,29 +280,29 @@ public void onDestroy() {
             "{@docRoot}training/in-app-billing/preparing-iab-app.html">Selling In-app
             Products training class and associated sample.
           

          -

          Making In-app Billing Requests

          +

          Making In-app Billing requests

          - Once your application is connected to Google Play, you can initiate purchase + After your application is connected to Google Play, you can initiate purchase requests for in-app products. Google Play provides a checkout interface for - users to enter their payment method, so your application does not need to + users to enter their payment method, so your application doesn't need to handle payment transactions directly. When an item is purchased, Google Play recognizes that the user has ownership of that item and prevents the user from purchasing another item with the same product ID until it is consumed. - You can control how the item is consumed in your application, and notify + You can control how the item is consumed in your application and notify Google Play to make the item available for purchase again. You can also query - Google Play to quickly retrieve the list of purchases that were made by the - user. This is useful, for example, when you want to restore the user's + Google Play to quickly retrieve the list of purchases that the + user made. This is useful, for example, when you want to restore the user's purchases when your user launches your app.

          -

          Querying for Items Available for Purchase

          +

          Querying for items available for purchase

          In your application, you can query the item details from Google Play using the In-app Billing Version 3 API. To pass a request to the In-app Billing - service, first create a {@link android.os.Bundle} that contains a String + service, create a {@link android.os.Bundle} that contains a String {@link java.util.ArrayList} of product IDs with key "ITEM_ID_LIST", where - each string is a product ID for an purchasable item. + each string is a product ID for an purchasable item. Here is an example:

          @@ -299,9 +315,9 @@ querySkus.putStringArrayList(“ITEM_ID_LIST”, skuList);
           
           

          To retrieve this information from Google Play, call the {@code getSkuDetails} - method on the In-app Billing Version 3 API, and pass the method the In-app + method on the In-app Billing Version 3 API and pass the In-app Billing API version (“3”), the package name of your calling app, the purchase - type (“inapp”), and the {@link android.os.Bundle} that you created. + type (“inapp”), and the {@link android.os.Bundle} that you created, into the method:

          @@ -310,35 +326,35 @@ Bundle skuDetails = mService.getSkuDetails(3,
           

          - If the request is successful, the returned {@link android.os.Bundle}has a + If the request is successful, the returned {@link android.os.Bundle} has a response code of {@code BILLING_RESPONSE_RESULT_OK} (0).

          - Warning: Do not call the {@code getSkuDetails} method on the - main thread. Calling this method triggers a network request which could block + Warning: Don't call the {@code getSkuDetails} method on the + main thread. Calling this method triggers a network request that could block your main thread. Instead, create a separate thread and call the {@code - getSkuDetails} method from inside that thread. + getSkuDetails} method from inside of that thread.

          - To see all the possible response codes from Google Play, see In-app Billing Reference.

          The query results are stored in a String ArrayList with key {@code - DETAILS_LIST}. The purchase information is stored in the String in JSON - format. To see the types of product detail information that are returned, see + DETAILS_LIST}. The purchase information is stored within the String in JSON + format. To view the types of product detail information that are returned, see In-app Billing Reference.

          - In this example, you are retrieving the prices for your in-app items from the - skuDetails {@link android.os.Bundle} returned from the previous code snippet. + In this example shows how to retrieve the prices for your in-app items from the + skuDetails {@link android.os.Bundle} that is returned from the previous code snippet:

          @@ -357,15 +373,15 @@ if (response == 0) {
           }
           
          -

          Purchasing an Item

          +

          Purchasing an item

          To start a purchase request from your app, call the {@code getBuyIntent} - method on the In-app Billing service. Pass in to the method the In-app + method on the In-app Billing service. Pass the In-app Billing API version (“3”), the package name of your calling app, the product ID for the item to purchase, the purchase type (“inapp” or "subs"), and a - {@code developerPayload} String. The {@code developerPayload} String is used + {@code developerPayload} String into the method. The {@code developerPayload} String is used to specify any additional arguments that you want Google Play to send back - along with the purchase information. + along with the purchase information. Here is an example:

          @@ -377,10 +393,13 @@ Bundle buyIntentBundle = mService.getBuyIntent(3, getPackageName(),
             If the request is successful, the returned {@link android.os.Bundle} has a
             response code of {@code BILLING_RESPONSE_RESULT_OK} (0) and a {@link
             android.app.PendingIntent} that you can use to start the purchase flow. To
          -  see all the possible response codes from Google Play, see In-app
          -  Billing Reference. Next, extract a {@link android.app.PendingIntent} from
          -  the response {@link android.os.Bundle} with key {@code BUY_INTENT}.
          +  Billing Reference.
          +
          +

          + The next step is to extract a {@link android.app.PendingIntent} from + the response {@link android.os.Bundle} with key {@code BUY_INTENT}, as shown here:

          @@ -390,8 +409,8 @@ PendingIntent pendingIntent = buyIntentBundle.getParcelable("BUY_INTENT");
           

          To complete the purchase transaction, call the {@link android.app.Activity#startIntentSenderForResult startIntentSenderForResult} - method and use the {@link android.app.PendingIntent} that you created. In - this example, you are using an arbitrary value of 1001 for the request code. + method and use the {@link android.app.PendingIntent} that you created. This + example uses an arbitrary value of 1001 for the request code:

          @@ -404,9 +423,9 @@ startIntentSenderForResult(pendingIntent.getIntentSender(),
             Google Play sends a response to your {@link android.app.PendingIntent} to the
             {@link android.app.Activity#onActivityResult onActivityResult} method of your
             application. The {@link android.app.Activity#onActivityResult
          -  onActivityResult} method will have a result code of {@code
          -  Activity.RESULT_OK} (1) or {@code Activity.RESULT_CANCELED} (0). To see the
          -  types of order information that is returned in the response {@link
          +  onActivityResult} method has a result code of {@code
          +  Activity.RESULT_OK} (1) or {@code Activity.RESULT_CANCELED} (0). To view the
          +  types of order information that are returned in the response {@link
             android.content.Intent}, see In-app
             Billing Reference.
          @@ -415,7 +434,7 @@ startIntentSenderForResult(pendingIntent.getIntentSender(),
           

          The purchase data for the order is a String in JSON format that is mapped to the {@code INAPP_PURCHASE_DATA} key in the response {@link - android.content.Intent}, for example: + android.content.Intent}. Here is an example:

          @@ -436,13 +455,13 @@ startIntentSenderForResult(pendingIntent.getIntentSender(),
             long. Pass this entire token to other methods, such as when you consume the
             purchase, as described in Consume
          -  a Purchase. Do not abbreviate or truncate this token; you must save and
          +  a Purchase. Don't abbreviate or truncate this token; you must save and
             return the entire token.
           

          - Continuing from the previous example, you get the response code, purchase - data, and signature from the response {@link android.content.Intent}. + Continuing from the previous example, you receive the response code, purchase + data, and signature from the response {@link android.content.Intent}:

          @@ -472,23 +491,23 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
           

          Security Recommendation: When you send a purchase request, create a String token that uniquely identifies this purchase request and - include this token in the {@code developerPayload}.You can use a randomly - generated string as the token. When you receive the purchase response from - Google Play, make sure to check the returned data signature, the {@code + include this token in the {@code developerPayload}. You can use a randomly-generated + string as the token. When you receive the purchase response from + Google Play, ensure that you check the returned data signature, the {@code orderId}, and the {@code developerPayload} String. For added security, you - should perform the checking on your own secure server. Make sure to verify + should perform the checking on your own secure server. Verify that the {@code orderId} is a unique value that you have not previously - processed, and the {@code developerPayload} String matches the token that you + processed and that the {@code developerPayload} String matches the token that you sent previously with the purchase request.

          -

          Querying for Purchased Items

          +

          Querying for purchased items

          - To retrieve information about purchases made by a user from your app, call + To retrieve information about purchases that are made by a user from your app, call the {@code getPurchases} method on the In-app Billing Version 3 service. Pass - in to the method the In-app Billing API version (“3”), the package name of - your calling app, and the purchase type (“inapp” or "subs"). + the In-app Billing API version (“3”), the package name of + your calling app, and the purchase type (“inapp” or "subs") into the method. Here is an example:

          @@ -507,18 +526,18 @@ Bundle ownedItems = mService.getPurchases(3, getPackageName(), "inapp", null);
             To improve performance, the In-app Billing service returns only up to 700
             products that are owned by the user when {@code getPurchase} is first called.
             If the user owns a large number of products, Google Play includes a String
          -  token mapped to the key {@code INAPP_CONTINUATION_TOKEN} in the response
          +  token that is mapped to the key {@code INAPP_CONTINUATION_TOKEN} in the response
             {@link android.os.Bundle} to indicate that more products can be retrieved.
          -  Your application can then make a subsequent {@code getPurchases} call, and
          +  Your application can then make a subsequent {@code getPurchases} call and
             pass in this token as an argument. Google Play continues to return a
             continuation token in the response {@link android.os.Bundle} until all
          -  products that are owned by the user has been sent to your app.
          +  of the products that are owned by the user are sent to your app.
           

          -

          For more information about the data returned by {@code getPurchases}, see +

          For more information about the data that is returned by {@code getPurchases}, see In-app Billing Reference. The following example shows how you can - retrieve this data from the response. + retrieve this data from the response:

          @@ -548,26 +567,26 @@ if (response == 0) {
           
          -

          Consuming a Purchase

          +

          Consuming a purchase

          You can use the In-app Billing Version 3 API to track the ownership of purchased in-app products in Google Play. Once an in-app product is - purchased, it is considered to be "owned" and cannot be purchased from Google + purchased, it is considered to be owned and cannot be purchased from Google Play. You must send a consumption request for the in-app product before Google Play makes it available for purchase again.

          -

          +

          Important: Managed in-app products are consumable, but subscriptions are not.

          - How you use the consumption mechanism in your app is up to you. Typically, - you would implement consumption for in-app products with temporary benefits + The way that you use the consumption mechanism in your app is up to you. Typically, + you implement consumption for in-app products with temporary benefits that users may want to purchase multiple times (for example, in-game currency - or equipment). You would typically not want to implement consumption for + or equipment). You typically don't want to implement consumption for in-app products that are purchased once and provide a permanent effect (for example, a premium upgrade).

          @@ -576,21 +595,21 @@ if (response == 0) { To record a purchase consumption, send the {@code consumePurchase} method to the In-app Billing service and pass in the {@code purchaseToken} String value that identifies the purchase to be removed. The {@code purchaseToken} is part - of the data returned in the {@code INAPP_PURCHASE_DATA} String by the Google - Play service following a successful purchase request. In this example, you - are recording the consumption of a product that is identified with the {@code - purchaseToken} in the {@code token} variable. + of the data that is returned in the {@code INAPP_PURCHASE_DATA} String by the Google + Play service following a successful purchase request. This example + records the consumption of a product that is identified with the {@code + purchaseToken} in the {@code token} variable:

           int response = mService.consumePurchase(3, getPackageName(), token);
           
          -

          - Warning: Do not call the {@code consumePurchase} method on - the main thread. Calling this method triggers a network request which could +

          + Warning: Don't call the {@code consumePurchase} method on + the main thread. Calling this method triggers a network request that could block your main thread. Instead, create a separate thread and call the {@code - consumePurchase} method from inside that thread. + consumePurchase} method from inside of that thread.

          @@ -600,20 +619,20 @@ int response = mService.consumePurchase(3, getPackageName(), token); purchased.

          -

          - Security Recommendation: You must send a consumption request +

          + Security Recommendation: Send a consumption request before provisioning the benefit of the consumable in-app purchase to the - user. Make sure that you have received a successful consumption response from + user. Ensure that you receive a successful consumption response from Google Play before you provision the item.

          -

          Implementing Subscriptions

          +

          Implementing subscriptions

          Launching a purchase flow for a subscription is similar to launching the purchase flow for a product, with the exception that the product type must be set to "subs". The purchase result is delivered to your Activity's {@link android.app.Activity#onActivityResult onActivityResult} method, exactly -as in the case of in-app products.

          +as in the case of in-app products. Here is an example:

           Bundle bundle = mService.getBuyIntent(3, "com.example.myapp",
          @@ -629,18 +648,18 @@ if (bundle.getInt(RESPONSE_CODE) == BILLING_RESPONSE_RESULT_OK) {
           

          To query for active subscriptions, use the {@code getPurchases} method, again -with the product type parameter set to "subs".

          +with the product type parameter set to "subs":

           Bundle activeSubs = mService.getPurchases(3, "com.example.myapp",
                              "subs", continueToken);
           
          -

          The call returns a {@code Bundle} with all the active subscriptions owned by -the user. Once a subscription expires without renewal, it will no longer appear +

          The call returns a {@code Bundle} with all of the active subscriptions that are owned by +the user. When a subscription expires without renewal, it no longer appears in the returned {@code Bundle}.

          -

          Securing Your Application

          +

          Securing your application

          To help ensure the integrity of the transaction information that is sent to your application, Google Play signs the JSON string that contains the response @@ -648,21 +667,21 @@ data for a purchase order. Google Play uses the private key that is associated with your application in the Developer Console to create this signature. The Developer Console generates an RSA key pair for each application.

          -

          Note:To find the public key portion of this key -pair, open your application's details in the Developer Console, then click on -Services & APIs, and look at the field titled +

          Note: To find the public key portion of this key +pair, open your application's details in the Developer Console, click +Services & APIs, and review the field titled Your License Key for This Application.

          -

          The Base64-encoded RSA public key generated by Google Play is in binary +

          The Base64-encoded RSA public key that is generated by Google Play is in binary encoded, X.509 subjectPublicKeyInfo DER SEQUENCE format. It is the same public key that is used with Google Play licensing.

          -

          When your application receives this signed response you can +

          When your application receives this signed response, you can use the public key portion of your RSA key pair to verify the signature. -By performing signature verification you can detect responses that have +By performing signature verification, you can detect any responses that have been tampered with or that have been spoofed. You can perform this signature verification step in your application; however, if your application connects -to a secure remote server then we recommend that you perform the signature +to a secure remote server, Google recommends that you perform the signature verification on that server.

          For more information about best practices for security and design, see suspended, users will not be able to reinstall or update it, even if it appears in their Downloads.

          Priced - Status

          Not all users can see paid apps. To show paid apps, a device -must have a SIM card and be running Android 1.1 or later, and it must be in a -country (as determined by SIM carrier) in which paid apps are available.

          + Status

          Not all users can see paid apps. To show + paid apps, a device must be running Android 1.1 or later, and it must be in + a country where paid apps are available. If a device has a SIM card, the SIM + carrier determines whether paid apps are available. If a device doesn't have + a SIM card, the device's IP address is used to determine whether the device + is in a country where paid apps are available.

          Country Targeting

          When you upload your app to Google Play, you can select the countries in which to distribute your app diff --git a/docs/html/guide/_book.yaml b/docs/html/guide/_book.yaml index 20ee4838fab5946381ca1fb50adb008988349e6a..f09fe771bd1a7b027bcc032f5002dc38ae659e5d 100644 --- a/docs/html/guide/_book.yaml +++ b/docs/html/guide/_book.yaml @@ -396,14 +396,16 @@ toc: path: /guide/topics/data/data-storage.html - title: Data Backup path: /guide/topics/data/backup.html + section: + - title: Auto Backup + path: /guide/topics/data/autobackup.html + - title: Key/Value Backup + path: /guide/topics/data/keyvaluebackup.html + - title: Testing Backup and Restore + path: /guide/topics/data/testingbackup.html - title: App Install Location path: /guide/topics/data/install-location.html -- title: Libraries - path: /topic/libraries/index.html - section: - - include: /topic/libraries/_book.yaml - - title: Administration path: /guide/topics/admin/index.html section: diff --git a/docs/html/guide/components/activities.jd b/docs/html/guide/components/activities.jd index 94439248c920d0ddef666f6e1f8b3fe2d72d1505..e757288424d814f0af28bf629deeff40817ae27c 100644 --- a/docs/html/guide/components/activities.jd +++ b/docs/html/guide/components/activities.jd @@ -624,8 +624,8 @@ android.app.Activity#onSaveInstanceState onSaveInstanceState()}.

          before making the activity vulnerable to destruction. The system passes this method a {@link android.os.Bundle} in which you can save state information about the activity as name-value pairs, using methods such as {@link -android.os.BaseBundle#putString putString()} and {@link -android.os.BaseBundle#putInt putInt()}. Then, if the system kills your application +android.os.Bundle#putString putString()} and {@link +android.os.Bundle#putInt putInt()}. Then, if the system kills your application process and the user navigates back to your activity, the system recreates the activity and passes the {@link android.os.Bundle} to both {@link android.app.Activity#onCreate onCreate()} and {@link android.app.Activity#onRestoreInstanceState onRestoreInstanceState()}. Using either of these diff --git a/docs/html/guide/components/bound-services.jd b/docs/html/guide/components/bound-services.jd index f71ba8736be255d6e4b1770ee87eeb409dcd506f..2ee2061604fe7a54cb360b174231a99ddb210281 100644 --- a/docs/html/guide/components/bound-services.jd +++ b/docs/html/guide/components/bound-services.jd @@ -8,19 +8,19 @@ parent.link=services.html

            In this document

              -
            1. The Basics
            2. -
            3. Creating a Bound Service +
            4. The basics
            5. +
            6. Creating a bound service
              1. Extending the Binder class
              2. Using a Messenger
            7. -
            8. Binding to a Service +
            9. Binding to a service
              1. Additional notes
            10. -
            11. Managing the Lifecycle of a Bound Service
            12. +
            13. Managing the lifecycle of a bound service

            Key classes

            @@ -32,9 +32,13 @@ parent.link=services.html

            Samples

              -
            1. {@code +
            2. + {@code RemoteService}
            3. -
            4. {@code +
            5. + {@code LocalService}
            @@ -45,19 +49,23 @@ parent.link=services.html -

            A bound service is the server in a client-server interface. A bound service allows components -(such as activities) to bind to the service, send requests, receive responses, and even perform +

            A bound service is the server in a client-server interface. It allows components +(such as activities) to bind to the service, send requests, receive responses, and perform interprocess communication (IPC). A bound service typically lives only while it serves another application component and does not run in the background indefinitely.

            -

            This document shows you how to create a bound service, including how to bind -to the service from other application components. However, you should also refer to the Services document for additional -information about services in general, such as how to deliver notifications from a service, set -the service to run in the foreground, and more.

            +

            Note: If your app targets Android 5.0 (API level 21) or later, +it's recommended that you use the {@link android.app.job.JobScheduler} to execute background + services. For more information about {@link android.app.job.JobScheduler}, see its + {@link android.app.job.JobScheduler API-reference documentation}.

            +

            This document describes how to create a bound service, including how to bind +to the service from other application components. For additional information about services in + general, such as how to deliver notifications from a service and set the service to run + in the foreground, refer to the + Services document.

            -

            The Basics

            +

            The basics

            A bound service is an implementation of the {@link android.app.Service} class that allows other applications to bind to it and interact with it. To provide binding for a @@ -67,57 +75,61 @@ clients can use to interact with the service.

            -

            A client can bind to the service by calling {@link android.content.Context#bindService +

            A client can bind to a service by calling {@link android.content.Context#bindService bindService()}. When it does, it must provide an implementation of {@link android.content.ServiceConnection}, which monitors the connection with the service. The {@link -android.content.Context#bindService bindService()} method returns immediately without a value, but +android.content.Context#bindService bindService()} method returns immediately without a + value, but when the Android system creates the connection between the client and service, it calls {@link android.content.ServiceConnection#onServiceConnected onServiceConnected()} on the {@link android.content.ServiceConnection}, to deliver the {@link android.os.IBinder} that the client can use to communicate with the service.

            -

            Multiple clients can connect to the service at once. However, the system calls your service's -{@link android.app.Service#onBind onBind()} method to retrieve the {@link android.os.IBinder} only +

            Multiple clients can connect to a service simultaneously. However, the system calls your service's +{@link android.app.Service#onBind onBind()} method to retrieve the + {@link android.os.IBinder} only when the first client binds. The system then delivers the same {@link android.os.IBinder} to any -additional clients that bind, without calling {@link android.app.Service#onBind onBind()} again.

            +additional clients that bind, without calling {@link android.app.Service#onBind onBind()} + again.

            -

            When the last client unbinds from the service, the system destroys the service (unless the -service was also started by {@link android.content.Context#startService startService()}).

            +

            When the last client unbinds from the service, the system destroys the service, unless the +service was also started by {@link android.content.Context#startService startService()}.

            -

            When you implement your bound service, the most important part is defining the interface -that your {@link android.app.Service#onBind onBind()} callback method returns. There are a few -different ways you can define your service's {@link android.os.IBinder} interface and the following -section discusses each technique.

            +

            The most important part of your bound service implementation is defining the interface +that your {@link android.app.Service#onBind onBind()} callback method returns. The following +section discusses several different ways that you can define your service's + {@link android.os.IBinder} interface.

            - - -

            Creating a Bound Service

            +

            Creating a bound service

            When creating a service that provides binding, you must provide an {@link android.os.IBinder} that provides the programming interface that clients can use to interact with the service. There @@ -125,12 +137,14 @@ are three ways you can define the interface:

            Extending the Binder class
            -
            If your service is private to your own application and runs in the same process as the client -(which is common), you should create your interface by extending the {@link android.os.Binder} class +
            If your service is private to your own application and runs in the same process + as the client +(which is common), you should create your interface by extending the {@link android.os.Binder} + class and returning an instance of it from {@link android.app.Service#onBind onBind()}. The client receives the {@link android.os.Binder} and can use it to directly access public methods available in either the {@link android.os.Binder} -implementation or even the {@link android.app.Service}. +implementation or the {@link android.app.Service}.

            This is the preferred technique when your service is merely a background worker for your own application. The only reason you would not create your interface this way is because your service is used by other applications or across separate processes.

            @@ -143,20 +157,20 @@ android.os.Message} objects. This {@link android.os.Handler} is the basis for a {@link android.os.Messenger} that can then share an {@link android.os.IBinder} with the client, allowing the client to send commands to the service using {@link android.os.Message} objects. Additionally, the client can define a {@link android.os.Messenger} of -its own so the service can send messages back. +its own, so the service can send messages back.

            This is the simplest way to perform interprocess communication (IPC), because the {@link android.os.Messenger} queues all requests into a single thread so that you don't have to design your service to be thread-safe.

            -
            Using AIDL
            -
            AIDL (Android Interface Definition Language) performs all the work to decompose objects into -primitives that the operating system can understand and marshall them across processes to perform +
            Using AIDL
            +
            Android Interface Definition Language (AIDL) decomposes objects into +primitives that the operating system can understand and marshals them across processes to perform IPC. The previous technique, using a {@link android.os.Messenger}, is actually based on AIDL as its underlying structure. As mentioned above, the {@link android.os.Messenger} creates a queue of all the client requests in a single thread, so the service receives requests one at a time. If, however, you want your service to handle multiple requests simultaneously, then you can use AIDL -directly. In this case, your service must be capable of multi-threading and be built thread-safe. +directly. In this case, your service must be thread-safe and capable of multi-threading.

            To use AIDL directly, you must create an {@code .aidl} file that defines the programming interface. The Android SDK tools use this file to generate an abstract class that implements the interface and handles IPC, which you @@ -164,19 +178,18 @@ can then extend within your service.

            -

            Note: Most applications should not use AIDL to +

            Note: Most applications shouldn't use AIDL to create a bound service, because it may require multithreading capabilities and -can result in a more complicated implementation. As such, AIDL is not suitable for most applications +can result in a more complicated implementation. As such, AIDL is not suitable for + most applications and this document does not discuss how to use it for your service. If you're certain that you need to use AIDL directly, see the AIDL document.

            - - -

            Extending the Binder class

            -

            If your service is used only by the local application and does not need to work across processes, +

            If your service is used only by the local application and does not need to + work across processes, then you can implement your own {@link android.os.Binder} class that provides your client direct access to public methods in the service.

            @@ -187,13 +200,14 @@ background.

            Here's how to set it up:

              -
            1. In your service, create an instance of {@link android.os.Binder} that either: +
            2. In your service, create an instance of {@link android.os.Binder} that does + one of the following:
                -
              • contains public methods that the client can call
              • -
              • returns the current {@link android.app.Service} instance, which has public methods the -client can call
              • -
              • or, returns an instance of another class hosted by the service with public methods the -client can call
              • +
              • Contains public methods that the client can call.
              • +
              • Returns the current {@link android.app.Service} instance, which has public methods the +client can call.
              • +
              • Returns an instance of another class hosted by the service with public methods the +client can call.
            3. Return this instance of {@link android.os.Binder} from the {@link android.app.Service#onBind onBind()} callback method.
            4. @@ -202,12 +216,13 @@ android.content.ServiceConnection#onServiceConnected onServiceConnected()} callb make calls to the bound service using the methods provided.
            -

            Note: The reason the service and client must be in the same -application is so the client can cast the returned object and properly call its APIs. The service +

            Note: The service and client must be in the same +application so that the client can cast the returned object and properly call its APIs. + The service and client must also be in the same process, because this technique does not perform any -marshalling across processes.

            +marshaling across processes.

            -

            For example, here's a service that provides clients access to methods in the service through +

            For example, here's a service that provides clients with access to methods in the service through a {@link android.os.Binder} implementation:

            @@ -316,32 +331,30 @@ section provides more information about this process of binding to the service.<
             

            Note: In the example above, the {@link android.app.Activity#onStop onStop()} method unbinds the client from the service. Clients should unbind from services at appropriate times, as discussed in -Additional Notes. +Additional notes.

            For more sample code, see the {@code +href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LocalService.html"> +{@code LocalService.java} class and the {@code +href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LocalServiceActivities.html"> +{@code LocalServiceActivities.java} class in ApiDemos.

            - - - -

            Using a Messenger

            @@ -352,10 +365,11 @@ you to perform interprocess communication (IPC) without the need to use AIDL.

            Here's a summary of how to use a {@link android.os.Messenger}:

            -
              +
              1. The service implements a {@link android.os.Handler} that receives a callback for each call from a client.
              2. -
              3. The {@link android.os.Handler} is used to create a {@link android.os.Messenger} object +
              4. The service uses the {@link android.os.Handler} to create a {@link android.os.Messenger} + object (which is a reference to the {@link android.os.Handler}).
              5. The {@link android.os.Messenger} creates an {@link android.os.IBinder} that the service returns to clients from {@link android.app.Service#onBind onBind()}.
              6. @@ -365,11 +379,12 @@ returns to clients from {@link android.app.Service#onBind onBind()}.
              7. The service receives each {@link android.os.Message} in its {@link android.os.Handler}—specifically, in the {@link android.os.Handler#handleMessage handleMessage()} method.
              8. -
            +
          -

          In this way, there are no "methods" for the client to call on the service. Instead, the -client delivers "messages" ({@link android.os.Message} objects) that the service receives in +

          In this way, there are no methods for the client to call on the service. Instead, the +client delivers messages ({@link android.os.Message} objects) that the service + receives in its {@link android.os.Handler}.

          Here's a simple example service that uses a {@link android.os.Messenger} interface:

          @@ -488,41 +503,42 @@ public class ActivityMessenger extends Activity { }
          -

          Notice that this example does not show how the service can respond to the client. If you want the -service to respond, then you need to also create a {@link android.os.Messenger} in the client. Then -when the client receives the {@link android.content.ServiceConnection#onServiceConnected +

          Notice that this example does not show how the service can respond to the client. + If you want the +service to respond, you need to also create a {@link android.os.Messenger} in the client. +When the client receives the {@link android.content.ServiceConnection#onServiceConnected onServiceConnected()} callback, it sends a {@link android.os.Message} to the service that includes the client's {@link android.os.Messenger} in the {@link android.os.Message#replyTo} parameter of the {@link android.os.Messenger#send send()} method.

          You can see an example of how to provide two-way messaging in the {@code +href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/MessengerService.html"> +{@code MessengerService.java} (service) and {@code +href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/MessengerServiceActivities.html"> +{@code MessengerServiceActivities.java} (client) samples.

          - - - - -

          Binding to a Service

          +

          Binding to a service

          Application components (clients) can bind to a service by calling {@link android.content.Context#bindService bindService()}. The Android system then calls the service's {@link android.app.Service#onBind -onBind()} method, which returns an {@link android.os.IBinder} for interacting with the service.

          +onBind()} method, which returns an {@link android.os.IBinder} for interacting with + the service.

          -

          The binding is asynchronous. {@link android.content.Context#bindService -bindService()} returns immediately and does not return the {@link android.os.IBinder} to -the client. To receive the {@link android.os.IBinder}, the client must create an instance of {@link +

          The binding is asynchronous, and {@link android.content.Context#bindService +bindService()} returns immediately without not returning the {@link android.os.IBinder} to +the client. To receive the {@link android.os.IBinder}, the client must create an + instance of {@link android.content.ServiceConnection} and pass it to {@link android.content.Context#bindService bindService()}. The {@link android.content.ServiceConnection} includes a callback method that the system calls to deliver the {@link android.os.IBinder}.

          Note: Only activities, services, and content providers can bind -to a service—you cannot bind to a service from a broadcast receiver.

          +to a service—you can't bind to a service from a broadcast receiver.

          -

          So, to bind to a service from your client, you must:

          +

          To bind to a service from your client, follow these steps:

          1. Implement {@link android.content.ServiceConnection}.

            Your implementation must override two callback methods:

            @@ -533,7 +549,8 @@ the service's {@link android.app.Service#onBind onBind()} method.
            {@link android.content.ServiceConnection#onServiceDisconnected onServiceDisconnected()}
            The Android system calls this when the connection to the service is unexpectedly -lost, such as when the service has crashed or has been killed. This is not called when the +lost, such as when the service has crashed or has been killed. This is not + called when the client unbinds.
          2. @@ -548,12 +565,12 @@ android.content.Context#unbindService unbindService()}.

            If your client is still bound to a service when your app destroys the client, destruction causes the client to unbind. It is better practice to unbind the client as soon as it is done interacting with the service. Doing so allows the idle service to shut down. For more information -about appropriate times to bind and unbind, see Additional Notes. +about appropriate times to bind and unbind, see Additional notes.

          -

          For example, the following snippet connects the client to the service created above by +

          The following example connects the client to the service created above by extending the Binder class, so all it must do is cast the returned {@link android.os.IBinder} to the {@code LocalService} class and request the {@code LocalService} instance:

          @@ -579,8 +596,9 @@ private ServiceConnection mConnection = new ServiceConnection() { };
          -

          With this {@link android.content.ServiceConnection}, the client can bind to a service by passing -it to {@link android.content.Context#bindService bindService()}. For example:

          +

          With this {@link android.content.ServiceConnection}, the client can bind to a service + by passing +it to {@link android.content.Context#bindService bindService()}, as shown in the following example:

           Intent intent = new Intent(this, LocalService.class);
          @@ -589,11 +607,21 @@ bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
           
           
          • The first parameter of {@link android.content.Context#bindService bindService()} is an -{@link android.content.Intent} that explicitly names the service to bind (thought the intent -could be implicit).
          • +{@link android.content.Intent} that explicitly names the service to bind. +

            Caution: If you use an intent to bind to a + {@link android.app.Service}, ensure that your app is secure by using an explicit +intent. Using an implicit intent to start a service is a +security hazard because you can't be certain what service will respond to the intent, +and the user can't see which service starts. Beginning with Android 5.0 (API level 21), + the system +throws an exception if you call {@link android.content.Context#bindService bindService()} +with an implicit intent.

            + +
          • The second parameter is the {@link android.content.ServiceConnection} object.
          • The third parameter is a flag indicating options for the binding. It should usually be {@link -android.content.Context#BIND_AUTO_CREATE} in order to create the service if its not already alive. +android.content.Context#BIND_AUTO_CREATE} in order to create the service if it's not already + alive. Other possible values are {@link android.content.Context#BIND_DEBUG_UNBIND} and {@link android.content.Context#BIND_NOT_FOREGROUND}, or {@code 0} for none.
          @@ -606,10 +634,11 @@ and {@link android.content.Context#BIND_NOT_FOREGROUND}, or {@code 0} for none.<
        8. You should always trap {@link android.os.DeadObjectException} exceptions, which are thrown when the connection has broken. This is the only exception thrown by remote methods.
        9. Objects are reference counted across processes.
        10. -
        11. You should usually pair the binding and unbinding during -matching bring-up and tear-down moments of the client's lifecycle. For example: +
        12. You usually pair the binding and unbinding during +matching bring-up and tear-down moments of the client's lifecycle, as described in the + following examples:
            -
          • If you only need to interact with the service while your activity is visible, you +
          • If you need to interact with the service only while your activity is visible, you should bind during {@link android.app.Activity#onStart onStart()} and unbind during {@link android.app.Activity#onStop onStop()}.
          • If you want your activity to receive responses even while it is stopped in the @@ -619,33 +648,34 @@ activity needs to use the service the entire time it's running (even in the back the service is in another process, then you increase the weight of the process and it becomes more likely that the system will kill it.
          -

          Note: You should usually not bind and unbind +

          Note: You don't usually bind and unbind during your activity's {@link android.app.Activity#onResume onResume()} and {@link -android.app.Activity#onPause onPause()}, because these callbacks occur at every lifecycle transition +android.app.Activity#onPause onPause()}, because these callbacks occur at every + lifecycle transition and you should keep the processing that occurs at these transitions to a minimum. Also, if -multiple activities in your application bind to the same service and there is a transition between -two of those activities, the service may be destroyed and recreated as the current activity unbinds -(during pause) before the next one binds (during resume). (This activity transition for how +multiple activities in your application bind to the same service and there is a + transition between +two of those activities, the service may be destroyed and recreated as the current + activity unbinds +(during pause) before the next one binds (during resume). This activity transition for how activities coordinate their lifecycles is described in the Activities -document.)

          +document.

          For more sample code, showing how to bind to a service, see the {@code +href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/RemoteService.html"> +{@code RemoteService.java} class in ApiDemos.

          - - - - -

          Managing the Lifecycle of a Bound Service

          +

          Managing the lifecycle of a bound service

          When a service is unbound from all clients, the Android system destroys it (unless it was also started with {@link android.app.Service#onStartCommand onStartCommand()}). As such, you don't have to manage the lifecycle of your service if it's purely a bound -service—the Android system manages it for you based on whether it is bound to any clients.

          +service—the Android system manages it for you based on whether it is bound to + any clients.

          However, if you choose to implement the {@link android.app.Service#onStartCommand onStartCommand()} callback method, then you must explicitly stop the service, because the @@ -660,17 +690,11 @@ your {@link android.app.Service#onUnbind onUnbind()} method, you can optionally onRebind()} the next time a client binds to the service. {@link android.app.Service#onRebind onRebind()} returns void, but the client still receives the {@link android.os.IBinder} in its {@link android.content.ServiceConnection#onServiceConnected onServiceConnected()} callback. -Below, figure 1 illustrates the logic for this kind of lifecycle.

          - +The following figure illustrates the logic for this kind of lifecycle.

          Figure 1. The lifecycle for a service that is started and also allows binding.

          -

          For more information about the lifecycle of a started service, see the Services document.

          - - - - diff --git a/docs/html/guide/components/fundamentals.jd b/docs/html/guide/components/fundamentals.jd index ed3ba7dc22499cc2112ac2d519a63409a365e581..eaa82c8fe25e85e7b2336cedcc0503e6359a7bd0 100644 --- a/docs/html/guide/components/fundamentals.jd +++ b/docs/html/guide/components/fundamentals.jd @@ -6,28 +6,29 @@ page.title=Application Fundamentals

          In this document

            -
          1. App Components +
          2. App components
            1. Activating components
          3. -
          4. The Manifest File +
          5. The manifest file
            1. Declaring components
            2. Declaring app requirements
          6. -
          7. App Resources
          8. +
          9. App resources

          Android apps are written in the Java programming language. The Android SDK tools compile -your code—along with any data and resource files—into an APK: an Android package, +your code along with any data and resource files into an APK, an Android package, which is an archive file with an {@code .apk} suffix. One APK file contains all the contents of an Android app and is the file that Android-powered devices use to install the app.

          -

          Once installed on a device, each Android app lives in its own security sandbox:

          +

          Each Android app lives in its own security sandbox, protected by + the following Android security features:

          • The Android operating system is a multi-user Linux system in which each app is a @@ -40,54 +41,61 @@ app so that only the user ID assigned to that app can access them.
          • Each process has its own virtual machine (VM), so an app's code runs in isolation from other apps.
          • -
          • By default, every app runs in its own Linux process. Android starts the process when any -of the app's components need to be executed, then shuts down the process when it's no longer +
          • By default, every app runs in its own Linux process. The Android system starts + the process when any +of the app's components need to be executed, and then shuts down the process + when it's no longer needed or when the system must recover memory for other apps.
          -

          In this way, the Android system implements the principle of least privilege. That is, +

          The Android system implements the principle of least privilege. That is, each app, by default, has access only to the components that it requires to do its work and no more. This creates a very secure environment in which an app cannot access parts of -the system for which it is not given permission.

          - -

          However, there are ways for an app to share data with other apps and for an +the system for which it is not given permission. However, there are ways for an app to share + data with other apps and for an app to access system services:

          • It's possible to arrange for two apps to share the same Linux user ID, in which case they are able to access each other's files. To conserve system resources, apps with the -same user ID can also arrange to run in the same Linux process and share the same VM (the -apps must also be signed with the same certificate).
          • +same user ID can also arrange to run in the same Linux process and share the same VM. The +apps must also be signed with the same certificate.
          • An app can request permission to access device data such as the user's -contacts, SMS messages, the mountable storage (SD card), camera, Bluetooth, and more. The user has +contacts, SMS messages, the mountable storage (SD card), camera, and Bluetooth. The user has to explicitly grant these permissions. For more information, see Working with System Permissions.
          -

          That covers the basics regarding how an Android app exists within the system. The rest of -this document introduces you to:

          +

          The rest of this document introduces the following concepts:

          • The core framework components that define your app.
          • -
          • The manifest file in which you declare components and required device features for your +
          • The manifest file in which you declare the components and the required device + features for your app.
          • -
          • Resources that are separate from the app code and allow your app to +
          • Resources that are separate from the app code and that allow your app to gracefully optimize its behavior for a variety of device configurations.
          -

          App Components

          +

          App components

          App components are the essential building blocks of an Android app. Each component is a different point through which the system can enter your app. Not all -components are actual entry points for the user and some depend on each other, but each one exists -as its own entity and plays a specific role—each one is a unique building block that -helps define your app's overall behavior.

          - -

          There are four different types of app components. Each type serves a distinct purpose -and has a distinct lifecycle that defines how the component is created and destroyed.

          +components are actual entry points for the user and some depend on each other, + but each one exists +as its own entity and plays a specific role.

          -

          Here are the four types of app components:

          +

          There are four different types of app components: +

            +
          • Activities.
          • +
          • Services.
          • +
          • Content providers.
          • +
          • Broadcast receivers.
          • +

          +Each type serves a distinct purpose +and has a distinct lifecycle that defines how the component is created and destroyed. + The following sections describe the four types of app components.

          @@ -98,11 +106,12 @@ an email app might have one activity that shows a list of new emails, another activity to compose an email, and another activity for reading emails. Although the activities work together to form a cohesive user experience in the email app, each one is independent of the others. As such, a different app can start any one of these -activities (if the email app allows it). For example, a camera app can start the -activity in the email app that composes new mail, in order for the user to share a picture. +activities if the email app allows it. For example, a camera app can start the +activity in the email app that composes new mail to allow the user to share a picture. -

          An activity is implemented as a subclass of {@link android.app.Activity} and you can learn more -about it in the Activities +

          An activity is implemented as a subclass of {@link android.app.Activity}. You can learn more +about {@link android.app.Activity} in the + Activities developer guide.

          @@ -111,13 +120,16 @@ developer guide.

          A service is a component that runs in the background to perform long-running operations or to perform work for remote processes. A service -does not provide a user interface. For example, a service might play music in the background while +does not provide a user interface. For example, a service might play music in the + background while the user is in a different app, or it might fetch data over the network without -blocking user interaction with an activity. Another component, such as an activity, can start the +blocking user interaction with an activity. Another component, such as an activity, + can start the service and let it run or bind to it in order to interact with it. -

          A service is implemented as a subclass of {@link android.app.Service} and you can learn more -about it in the Services developer +

          A service is implemented as a subclass of {@link android.app.Service}. You can learn more +about {@link android.app.Service} in the +Services developer guide.

          @@ -125,12 +137,14 @@ guide.

          Content providers
          A content provider manages a shared set of app data. You can store the data in -the file system, an SQLite database, on the web, or any other persistent storage location your -app can access. Through the content provider, other apps can query or even modify -the data (if the content provider allows it). For example, the Android system provides a content +the file system, in a SQLite database, on the web, or on any other persistent storage + location that your +app can access. Through the content provider, other apps can query or modify +the data if the content provider allows it. For example, the Android system provides a content provider that manages the user's contact information. As such, any app with the proper -permissions can query part of the content provider (such as {@link -android.provider.ContactsContract.Data}) to read and write information about a particular person. +permissions can query part of the content provider, such as {@link +android.provider.ContactsContract.Data}, to read and write information about + a particular person.

          Content providers are also useful for reading and writing data that is private to your app and not shared. For example, the

          Broadcast receivers
          A broadcast receiver is a component that responds to system-wide broadcast -announcements. Many broadcasts originate from the system—for example, a broadcast announcing +announcements. Many broadcasts originate from the system—for example, + a broadcast announcing that the screen has turned off, the battery is low, or a picture was captured. Apps can also initiate broadcasts—for example, to let other apps know that -some data has been downloaded to the device and is available for them to use. Although broadcast +some data has been downloaded to the device and is available for them to use. + Although broadcast receivers don't display a user interface, they may create a status bar notification to alert the user when a broadcast event occurs. More commonly, though, a broadcast receiver is -just a "gateway" to other components and is intended to do a very minimal amount of work. For -instance, it might initiate a service to perform some work based on the event. +just a gateway to other components and is intended to do a very minimal amount of work. + For instance, it might initiate a service to perform some work based on the event.

          A broadcast receiver is implemented as a subclass of {@link android.content.BroadcastReceiver} and each broadcast is delivered as an {@link android.content.Intent} object. For more information, @@ -170,52 +186,59 @@ see the {@link android.content.BroadcastReceiver} class.

          A unique aspect of the Android system design is that any app can start another app’s component. For example, if you want the user to capture a photo with the device camera, there's probably another app that does that and your -app can use it, instead of developing an activity to capture a photo yourself. You don't +app can use it instead of developing an activity to capture a photo yourself. You don't need to incorporate or even link to the code from the camera app. Instead, you can simply start the activity in the camera app that captures a photo. When complete, the photo is even returned to your app so you can use it. To the user, it seems as if the camera is actually a part of your app.

          -

          When the system starts a component, it starts the process for that app (if it's not -already running) and instantiates the classes needed for the component. For example, if your +

          When the system starts a component, it starts the process for that app if it's not +already running and instantiates the classes needed for the component. For example, if your app starts the activity in the camera app that captures a photo, that activity runs in the process that belongs to the camera app, not in your app's process. Therefore, unlike apps on most other systems, Android apps don't have a single entry -point (there's no {@code main()} function, for example).

          +point (there's no {@code main()} function).

          Because the system runs each app in a separate process with file permissions that restrict access to other apps, your app cannot directly activate a component from -another app. The Android system, however, can. So, to activate a component in -another app, you must deliver a message to the system that specifies your intent to +another app. However, the Android system can. To activate a component in +another app, deliver a message to the system that specifies your intent to start a particular component. The system then activates the component for you.

          -

          Activating Components

          +

          Activating components

          Three of the four component types—activities, services, and broadcast receivers—are activated by an asynchronous message called an intent. -Intents bind individual components to each other at runtime (you can think of them -as the messengers that request an action from other components), whether the component belongs +Intents bind individual components to each other at runtime. You can think of them +as the messengers that request an action from other components, whether the component belongs to your app or another.

          +

          Note: If your app targets Android 5.0 (API level 21) or later, + use the {@link android.app.job.JobScheduler} to execute background + services. For more information about using this class, see the + {@link android.app.job.JobScheduler} reference documentation.

          +

          An intent is created with an {@link android.content.Intent} object, which defines a message to -activate either a specific component or a specific type of component—an intent -can be either explicit or implicit, respectively.

          +activate either a specific component (explicit intent) or a specific type of component + (implicit intent).

          -

          For activities and services, an intent defines the action to perform (for example, to "view" or -"send" something) and may specify the URI of the data to act on (among other things that the -component being started might need to know). For example, an intent might convey a request for an +

          For activities and services, an intent defines the action to perform (for example, to + view or +send something) and may specify the URI of the data to act on, among other things that the +component being started might need to know. For example, an intent might convey a request for an activity to show an image or to open a web page. In some cases, you can start an -activity to receive a result, in which case, the activity also returns -the result in an {@link android.content.Intent} (for example, you can issue an intent to let -the user pick a personal contact and have it returned to you—the return intent includes a -URI pointing to the chosen contact).

          +activity to receive a result, in which case the activity also returns +the result in an {@link android.content.Intent}. For example, you can issue an intent to let +the user pick a personal contact and have it returned to you. The return intent includes a +URI pointing to the chosen contact.

          For broadcast receivers, the intent simply defines the -announcement being broadcast (for example, a broadcast to indicate the device battery is low -includes only a known action string that indicates "battery is low").

          +announcement being broadcast. For example, a broadcast to indicate the device battery is low +includes only a known action string that indicates battery is low.

          -

          The other component type, content provider, is not activated by intents. Rather, it is +

          Unlike activities, services, and broadcast receivers, content providers are not activated + by intents. Rather, they are activated when targeted by a request from a {@link android.content.ContentResolver}. The content resolver handles all direct transactions with the content provider so that the component that's performing transactions with the provider doesn't need to and instead calls methods on the {@link @@ -224,15 +247,19 @@ provider and the component requesting information (for security).

          There are separate methods for activating each type of component:

            -
          • You can start an activity (or give it something new to do) by +
          • You can start an activity or give it something new to do by passing an {@link android.content.Intent} to {@link android.content.Context#startActivity startActivity()} or {@link android.app.Activity#startActivityForResult startActivityForResult()} (when you want the activity to return a result).
          • -
          • You can start a service (or give new instructions to an ongoing service) by + + +
          • With Android 5.0 (API level 21) and later, you can start a service with + {@link android.app.job.JobScheduler}. For earlier Android versions, you can start + a service (or give new instructions to an ongoing service) by passing an {@link android.content.Intent} to {@link android.content.Context#startService -startService()}. Or you can bind to the service by passing an {@link android.content.Intent} to -{@link android.content.Context#bindService bindService()}.
          • -
          • You can initiate a broadcast by passing an {@link android.content.Intent} to methods like +startService()}. You can bind to the service by passing an {@link android.content.Intent} to +{@link android.content.Context#bindService bindService()}.
          • +
          • You can initiate a broadcast by passing an {@link android.content.Intent} to methods such as {@link android.content.Context#sendBroadcast(Intent) sendBroadcast()}, {@link android.content.Context#sendOrderedBroadcast(Intent, String) sendOrderedBroadcast()}, or {@link android.content.Context#sendStickyBroadcast sendStickyBroadcast()}.
          • @@ -242,35 +269,35 @@ android.content.ContentProvider#query query()} on a {@link android.content.Conte

            For more information about using intents, see the Intents and -Intent Filters document. More information about activating specific components is also provided -in the following documents: Activities, Services, {@link -android.content.BroadcastReceiver} and Content Providers.

            - +Intent Filters document. + The following documents provide more information about activating specifc components: + Activities, + Services + {@link android.content.BroadcastReceiver}, and + Content Providers.

            -

            The Manifest File

            +

            The manifest file

            Before the Android system can start an app component, the system must know that the -component exists by reading the app's {@code AndroidManifest.xml} file (the "manifest" -file). Your app must declare all its components in this file, which must be at the root of -the app project directory.

            +component exists by reading the app's manifest file, {@code AndroidManifest.xml}. + Your app must declare all its components in this file, which must be at the root of the + app project directory.

            The manifest does a number of things in addition to declaring the app's components, -such as:

            +such as the following:

              -
            • Identify any user permissions the app requires, such as Internet access or +
            • Identifies any user permissions the app requires, such as Internet access or read-access to the user's contacts.
            • -
            • Declare the minimum API Level +
            • Declares the minimum + API Level required by the app, based on which APIs the app uses.
            • -
            • Declare hardware and software features used or required by the app, such as a camera, +
            • Declares hardware and software features used or required by the app, such as a camera, bluetooth services, or a multitouch screen.
            • -
            • API libraries the app needs to be linked against (other than the Android framework +
            • Declares API libraries the app needs to be linked against (other than the Android framework APIs), such as the Google Maps -library.
            • -
            • And more
            • +href="http://code.google.com/android/add-ons/google-apis/maps-overview.html"> +Google Maps library. +
            @@ -301,47 +328,59 @@ the {@code android:name} attribute specifies the fully qualified class name of t android.app.Activity} subclass and the {@code android:label} attribute specifies a string to use as the user-visible label for the activity.

            -

            You must declare all app components this way:

            +

            You must declare all app components using the following elements:

            • <activity> elements -for activities
            • +for activities.
            • <service> elements for -services
            • +services.
            • <receiver> elements -for broadcast receivers
            • +for broadcast receivers.
            • <provider> elements -for content providers
            • +for content providers.

            Activities, services, and content providers that you include in your source but do not declare in the manifest are not visible to the system and, consequently, can never run. However, broadcast -receivers can be either declared in the manifest or created dynamically in code (as -{@link android.content.BroadcastReceiver} objects) and registered with the system by calling +receivers can be either declared in the manifest or created dynamically in code as +{@link android.content.BroadcastReceiver} objects and registered with the system by calling {@link android.content.Context#registerReceiver registerReceiver()}.

            For more about how to structure the manifest file for your app, see The AndroidManifest.xml File documentation.

            +

            Declaring component capabilities

            +

            As discussed above, in Activating components, you can use an +{@link android.content.Intent} to start activities, services, and broadcast receivers. -

            Declaring component capabilities

            -

            As discussed above, in Activating Components, you can use an -{@link android.content.Intent} to start activities, services, and broadcast receivers. You can do so -by explicitly naming the target component (using the component class name) in the intent. However, -the real power of intents lies in the concept of implicit intents. An implicit intent -simply describes the type of action to perform (and, optionally, the data upon which you’d like to -perform the action) and allows the system to find a component on the device that can perform the -action and start it. If there are multiple components that can perform the action described by the -intent, then the user selects which one to use.

            -

            The way the system identifies the components that can respond to an intent is by comparing the +You can use an {@link android.content.Intent} + by explicitly naming the target component (using the component class name) in the intent. + You can also use an implicit intent, which +describes the type of action to perform and, optionally, the data upon which you’d like to +perform the action. The implicit intent allows the system to find a component on the device + that can perform the +action and start it. If there are multiple components that can perform the action described by the +intent, the user selects which one to use.

            + +

            Caution: If you use an intent to start a + {@link android.app.Service}, ensure that your app is secure by using an + explicit +intent. Using an implicit intent to start a service is a +security hazard because you cannot be certain what service will respond to the intent, +and the user cannot see which service starts. Beginning with Android 5.0 (API level 21), the system +throws an exception if you call {@link android.content.Context#bindService bindService()} +with an implicit intent. Do not declare intent filters for your services.

            + +

            The system identifies the components that can respond to an intent by comparing the intent received to the intent filters provided in the manifest file of other apps on the device.

            @@ -351,8 +390,9 @@ from other apps. You can declare an intent filter for your component by adding an {@code } element as a child of the component's declaration element.

            -

            For example, if you've built an email app with an activity for composing a new email, you can -declare an intent filter to respond to "send" intents (in order to send a new email) like this:

            +

            For example, if you build an email app with an activity for composing a new email, you can +declare an intent filter to respond to "send" intents (in order to send a new email), + as shown in the following example:

             <manifest ... >
                 ...
            @@ -368,8 +408,9 @@ declare an intent filter to respond to "send" intents (in order to send a new em
             </manifest>
             
            -

            Then, if another app creates an intent with the {@link -android.content.Intent#ACTION_SEND} action and passes it to {@link android.app.Activity#startActivity +

            If another app creates an intent with the {@link +android.content.Intent#ACTION_SEND} action and passes it to + {@link android.app.Activity#startActivity startActivity()}, the system may start your activity so the user can draft and send an email.

            @@ -382,7 +423,7 @@ href="{@docRoot}guide/components/intents-filters.html">Intents and Intent Filter

            Declaring app requirements

            There are a variety of devices powered by Android and not all of them provide the -same features and capabilities. In order to prevent your app from being installed on devices +same features and capabilities. To prevent your app from being installed on devices that lack features needed by your app, it's important that you clearly define a profile for the types of devices your app supports by declaring device and software requirements in your manifest file. Most of these declarations are informational only and the system does not read @@ -391,7 +432,7 @@ for users when they search for apps from their device.

            For example, if your app requires a camera and uses APIs introduced in Android 2.1 (API Level 7), -you should declare these as requirements in your manifest file like this:

            +you must declare these as requirements in your manifest file as shown in the following example:

             <manifest ... >
            @@ -402,10 +443,10 @@ you should declare these as requirements in your manifest file like this:

            </manifest>
            -

            Now, devices that do not have a camera and have an -Android version lower than 2.1 cannot install your app from Google Play.

            - -

            However, you can also declare that your app uses the camera, but does not +

            With the declarations shown in the example, devices that do not have a + camera and have an +Android version lower than 2.1 cannot install your app from Google Play. + However, you can declare that your app uses the camera, but does not require it. In that case, your app must set the {@code required} attribute to {@code "false"} and check at runtime whether @@ -417,15 +458,15 @@ document.

            -

            App Resources

            +

            App resources

            An Android app is composed of more than just code—it requires resources that are separate from the source code, such as images, audio files, and anything relating to the visual -presentation of the app. For example, you should define animations, menus, styles, colors, +presentation of the app. For example, you can define animations, menus, styles, colors, and the layout of activity user interfaces with XML files. Using app resources makes it easy -to update various characteristics of your app without modifying code and—by providing -sets of alternative resources—enables you to optimize your app for a variety of -device configurations (such as different languages and screen sizes).

            +to update various characteristics of your app without modifying code. Providing +sets of alternative resources enables you to optimize your app for a variety of +device configurations, such as different languages and screen sizes.

            For every resource that you include in your Android project, the SDK build tools define a unique integer ID, which you can use to reference the resource from your app code or from @@ -435,20 +476,22 @@ named {@code R.drawable.logo}, which you can use to reference the image and inse user interface.

            One of the most important aspects of providing resources separate from your source code -is the ability for you to provide alternative resources for different device -configurations. For example, by defining UI strings in XML, you can translate the strings into other -languages and save those strings in separate files. Then, based on a language qualifier +is the ability to provide alternative resources for different device +configurations. For example, by defining UI strings in XML, you can translate + the strings into other +languages and save those strings in separate files. Then Android applies the + appropriate language strings +to your UI based on a language qualifier that you append to the resource directory's name (such as {@code res/values-fr/} for French string -values) and the user's language setting, the Android system applies the appropriate language strings -to your UI.

            +values) and the user's language setting.

            Android supports many different qualifiers for your alternative resources. The qualifier is a short string that you include in the name of your resource directories in order to -define the device configuration for which those resources should be used. As another -example, you should often create different layouts for your activities, depending on the -device's screen orientation and size. For example, when the device screen is in portrait +define the device configuration for which those resources should be used. For +example, you should create different layouts for your activities, depending on the +device's screen orientation and size. When the device screen is in portrait orientation (tall), you might want a layout with buttons to be vertical, but when the screen is in -landscape orientation (wide), the buttons should be aligned horizontally. To change the layout +landscape orientation (wide), the buttons could be aligned horizontally. To change the layout depending on the orientation, you can define two different layouts and apply the appropriate qualifier to each layout's directory name. Then, the system automatically applies the appropriate layout depending on the current device orientation.

            @@ -465,15 +508,15 @@ create alternative resources for different device configurations, read
            Intents and Intent Filters
            -
            Information about how to use the {@link android.content.Intent} APIs to +
            How to use the {@link android.content.Intent} APIs to activate app components, such as activities and services, and how to make your app components available for use by other apps.
            Activities
            -
            Information about how to create an instance of the {@link android.app.Activity} class, +
            How to create an instance of the {@link android.app.Activity} class, which provides a distinct screen in your application with a user interface.
            Providing Resources
            -
            Information about how Android apps are structured to separate app resources from the +
            How Android apps are structured to separate app resources from the app code, including how you can provide alternative resources for specific device configurations.
            @@ -484,14 +527,13 @@ href="{@docRoot}guide/topics/resources/providing-resources.html">Providing Resou
            Device Compatibility
            -
            Information about Android works on different types of devices and an introduction +
            How Android works on different types of devices and an introduction to how you can optimize your app for each device or restrict your app's availability to different devices.
            System Permissions
            -
            Information about how Android restricts app access to certain APIs with a permission +
            How Android restricts app access to certain APIs with a permission system that requires the user's consent for your app to use those APIs.
            - diff --git a/docs/html/guide/components/intents-common.jd b/docs/html/guide/components/intents-common.jd index e6c9fc691cbb7761d7f0826a948d368582fe0435..47174d2ea9d443452f18fac56992d880e47d81ef 100644 --- a/docs/html/guide/components/intents-common.jd +++ b/docs/html/guide/components/intents-common.jd @@ -2155,7 +2155,7 @@ that are available.

            Example intent:

             public void openWifiSettings() {
            -    Intent intent = new Intent(Intent.ACTION_WIFI_SETTINGS);
            +    Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS);
                 if (intent.resolveActivity(getPackageManager()) != null) {
                     startActivity(intent);
                 }
            diff --git a/docs/html/guide/components/intents-filters.jd b/docs/html/guide/components/intents-filters.jd
            index d1d8c78fae3f350e5d9f5527c340a3e26e2dd25c..8f41bc3d36756ea7ac47f323eb53864438b54d7b 100644
            --- a/docs/html/guide/components/intents-filters.jd
            +++ b/docs/html/guide/components/intents-filters.jd
            @@ -7,21 +7,21 @@ page.tags="IntentFilter"
             
             

            In this document

              -
            1. Intent Types
            2. -
            3. Building an Intent +
            4. Intent types
            5. +
            6. Building an intent
              1. Example explicit intent
              2. Example implicit intent
              3. Forcing an app chooser
            7. -
            8. Receiving an Implicit Intent +
            9. Receiving an implicit intent
              1. Example filters
            10. -
            11. Using a Pending Intent
            12. -
            13. Intent Resolution +
            14. Using a pending intent
            15. +
            16. Intent resolution
              1. Action test
              2. Category test
              3. @@ -46,13 +46,14 @@ page.tags="IntentFilter"

                An {@link android.content.Intent} is a messaging object you can use to request an action from another app component. Although intents facilitate communication between components in several ways, there are three -fundamental use-cases:

                +fundamental use cases:

                  -
                • To start an activity: +
                • Starting an activity

                  An {@link android.app.Activity} represents a single screen in an app. You can start a new instance of an {@link android.app.Activity} by passing an {@link android.content.Intent} -to {@link android.content.Context#startActivity startActivity()}. The {@link android.content.Intent} +to {@link android.content.Context#startActivity startActivity()}. + The {@link android.content.Intent} describes the activity to start and carries any necessary data.

                  If you want to receive a result from the activity when it finishes, @@ -63,10 +64,16 @@ android.app.Activity#onActivityResult onActivityResult()} callback. For more information, see the Activities guide.

                • -
                • To start a service: +
                • Starting a service

                  A {@link android.app.Service} is a component that performs operations in the background -without a user interface. You can start a service to perform a one-time operation -(such as download a file) by passing an {@link android.content.Intent} +without a user interface. With Android 5.0 (API level 21) and later, you can start a service + with {@link android.app.job.JobScheduler}. For more information + about {@link android.app.job.JobScheduler}, see its + {@link android.app.job.JobScheduler API-reference documentation}.

                  +

                  For versions earlier than Android 5.0 (API level 21), you can start a service by using +methods of the {@link android.app.Service} class. You can start a service + to perform a one-time operation +(such as downloading a file) by passing an {@link android.content.Intent} to {@link android.content.Context#startService startService()}. The {@link android.content.Intent} describes the service to start and carries any necessary data.

                  @@ -75,7 +82,7 @@ from another component by passing an {@link android.content.Intent} to {@link android.content.Context#bindService bindService()}. For more information, see the Services guide.

                • -
                • To deliver a broadcast: +
                • Delivering a broadcast

                  A broadcast is a message that any app can receive. The system delivers various broadcasts for system events, such as when the system boots up or the device starts charging. You can deliver a broadcast to other apps by passing an {@link android.content.Intent} @@ -89,7 +96,7 @@ android.content.Context#sendStickyBroadcast sendStickyBroadcast()}.

                  -

                  Intent Types

                  +

                  Intent types

                  There are two types of intents:

                  @@ -97,7 +104,7 @@ android.content.Context#sendStickyBroadcast sendStickyBroadcast()}.

                • Explicit intents specify the component to start by name (the fully-qualified class name). You'll typically use an explicit intent to start a component in your own app, because you know the class name of the activity or service you want to start. For -example, start a new activity in response to a user action or start a service to download +example, you can start a new activity in response to a user action or start a service to download a file in the background.
                • Implicit intents do not name a specific component, but instead declare a general action @@ -106,12 +113,13 @@ show the user a location on a map, you can use an implicit intent to request tha app show a specified location on a map.
                -

                When you create an explicit intent to start an activity or service, the system immediately +

                Figure 1 shows how an intent is delivered to start an activity. When you create an + explicit intent to start an activity or service, the system immediately starts the app component specified in the {@link android.content.Intent} object.

                -

                Figure 1. Illustration of how an implicit intent is +

                Figure 1. How an implicit intent is delivered through the system to start another activity: [1] Activity A creates an {@link android.content.Intent} with an action description and passes it to {@link android.content.Context#startActivity startActivity()}. [2] The Android System searches all @@ -135,11 +143,12 @@ you make it possible for other apps to directly start your activity with a certa Likewise, if you do not declare any intent filters for an activity, then it can be started only with an explicit intent.

                -

                Caution: To ensure your app is secure, always use an explicit +

                Caution: To ensure that your app is secure, always + use an explicit intent when starting a {@link android.app.Service} and do not declare intent filters for your services. Using an implicit intent to start a service is a -security hazard because you cannot be certain what service will respond to the intent, -and the user cannot see which service starts. Beginning with Android 5.0 (API level 21), the system +security hazard because you can't be certain what service will respond to the intent, +and the user can't see which service starts. Beginning with Android 5.0 (API level 21), the system throws an exception if you call {@link android.content.Context#bindService bindService()} with an implicit intent.

                @@ -147,7 +156,7 @@ with an implicit intent.

                -

                Building an Intent

                +

                Building an intent

                An {@link android.content.Intent} object carries information that the Android system uses to determine which component to start (such as the exact component name or component @@ -163,22 +172,23 @@ order to properly perform the action (such as the action to take and the data to

                The name of the component to start.

                This is optional, but it's the critical piece of information that makes an intent -explicit, meaning that the intent should be delivered only to the app component -defined by the component name. Without a component name, the intent is implicit and the +explicit, meaning that the intent should be delivered only to the app component +defined by the component name. Without a component name, the intent is implicit and the system decides which component should receive the intent based on the other intent information -(such as the action, data, and category—described below). So if you need to start a specific +(such as the action, data, and category—described below). If you need to start a specific component in your app, you should specify the component name.

                -

                Note: When starting a {@link android.app.Service}, you should -always specify the component name. Otherwise, you cannot be certain what service +

                Note: When starting a {@link android.app.Service}, + always specify the component name. Otherwise, you cannot be certain what service will respond to the intent, and the user cannot see which service starts.

                This field of the {@link android.content.Intent} is a {@link android.content.ComponentName} object, which you can specify using a fully -qualified class name of the target component, including the package name of the app. For example, +qualified class name of the target component, including the package name of the app, for example, {@code com.example.ExampleActivity}. You can set the component name with {@link android.content.Intent#setComponent setComponent()}, {@link android.content.Intent#setClass -setClass()}, {@link android.content.Intent#setClassName(String, String) setClassName()}, or with the +setClass()}, {@link android.content.Intent#setClassName(String, String) setClassName()}, + or with the {@link android.content.Intent} constructor.

                @@ -188,10 +198,10 @@ setClass()}, {@link android.content.Intent#setClassName(String, String) setClass

                In the case of a broadcast intent, this is the action that took place and is being reported. The action largely determines how the rest of the intent is structured—particularly -what is contained in the data and extras. +the information that is contained in the data and extras.

                You can specify your own actions for use by intents within your app (or for use by other -apps to invoke components in your app), but you should usually use action constants +apps to invoke components in your app), but you usually specify action constants defined by the {@link android.content.Intent} class or other framework classes. Here are some common actions for starting an activity:

                @@ -203,7 +213,7 @@ common actions for starting an activity:

                view in a map app.
          {@link android.content.Intent#ACTION_SEND}
          -
          Also known as the "share" intent, you should use this in an intent with {@link +
          Also known as the share intent, you should use this in an intent with {@link android.content.Context#startActivity startActivity()} when you have some data that the user can share through another app, such as an email app or social sharing app.
          @@ -217,12 +227,13 @@ that open specific screens in the system's Settings app.

          setAction()} or with an {@link android.content.Intent} constructor.

          If you define your own actions, be sure to include your app's package name -as a prefix. For example:

          +as a prefix, as shown in the following example:

          static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";
          Data
          -
          The URI (a {@link android.net.Uri} object) that references the data to be acted on and/or the +
          The URI (a {@link android.net.Uri} object) that references the data to + be acted on and/or the MIME type of that data. The type of data supplied is generally dictated by the intent's action. For example, if the action is {@link android.content.Intent#ACTION_EDIT}, the data should contain the URI of the document to edit. @@ -231,10 +242,11 @@ URI of the document to edit. it's often important to specify the type of data (its MIME type) in addition to its URI. For example, an activity that's able to display images probably won't be able to play an audio file, even though the URI formats could be similar. -So specifying the MIME type of your data helps the Android +Specifying the MIME type of your data helps the Android system find the best component to receive your intent. However, the MIME type can sometimes be inferred from the URI—particularly when the data is a -{@code content:} URI, which indicates the data is located on the device and controlled by a +{@code content:} URI. A {@code content:} URI indicates the data is located on the device + and controlled by a {@link android.content.ContentProvider}, which makes the data MIME type visible to the system.

          To set only the data URI, call {@link android.content.Intent#setData setData()}. @@ -243,7 +255,7 @@ can set both explicitly with {@link android.content.Intent#setDataAndType setDataAndType()}.

          Caution: If you want to set both the URI and MIME type, -do not call {@link android.content.Intent#setData setData()} and +don't call {@link android.content.Intent#setData setData()} and {@link android.content.Intent#setType setType()} because they each nullify the value of the other. Always use {@link android.content.Intent#setDataAndType setDataAndType()} to set both URI and MIME type.

          @@ -258,7 +270,7 @@ Here are some common categories:
          {@link android.content.Intent#CATEGORY_BROWSABLE}
          The target activity allows itself to be started by a web browser to display data - referenced by a link—such as an image or an e-mail message. + referenced by a link, such as an image or an e-mail message.
          {@link android.content.Intent#CATEGORY_LAUNCHER}
          The activity is the initial activity of a task and is listed in @@ -276,14 +288,14 @@ categories.

          These properties listed above (component name, action, data, and category) represent the defining characteristics of an intent. By reading these properties, the Android system -is able to resolve which app component it should start.

          - -

          However, an intent can carry additional information that does not affect -how it is resolved to an app component. An intent can also supply:

          +is able to resolve which app component it should start. However, an intent can carry + additional information that does not affect +how it is resolved to an app component. An intent can also supply the following information:

          Extras
          -
          Key-value pairs that carry additional information required to accomplish the requested action. +
          Key-value pairs that carry additional information required to accomplish + the requested action. Just as some actions use particular kinds of data URIs, some actions also use particular extras.

          You can add extra data with various {@link android.content.Intent#putExtra putExtra()} methods, @@ -293,21 +305,22 @@ the {@link android.os.Bundle} in the {@link android.content.Intent} with {@link android.content.Intent#putExtras putExtras()}.

          For example, when creating an intent to send an email with -{@link android.content.Intent#ACTION_SEND}, you can specify the "to" recipient with the -{@link android.content.Intent#EXTRA_EMAIL} key, and specify the "subject" with the +{@link android.content.Intent#ACTION_SEND}, you can specify the to recipient with the +{@link android.content.Intent#EXTRA_EMAIL} key, and specify the subject with the {@link android.content.Intent#EXTRA_SUBJECT} key.

          The {@link android.content.Intent} class specifies many {@code EXTRA_*} constants for standardized data types. If you need to declare your own extra keys (for intents that your app receives), be sure to include your app's package name -as a prefix. For example:

          +as a prefix, as shown in the following example:

          static final String EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS";
          Flags
          -
          Flags defined in the {@link android.content.Intent} class that function as metadata for the +
          Flags are defined in the {@link android.content.Intent} class that function as metadata for the intent. The flags may instruct the Android system how to launch an activity (for example, which -task the activity should belong +task + the activity should belong to) and how to treat it after it's launched (for example, whether it belongs in the list of recent activities). @@ -354,7 +367,8 @@ this intent explicitly starts the {@code DownloadService} class in the app.

          to perform the action. Using an implicit intent is useful when your app cannot perform the action, but other apps probably can and you'd like the user to pick which app to use.

          -

          For example, if you have content you want the user to share with other people, create an intent +

          For example, if you have content that you want the user to share with other people, + create an intent with the {@link android.content.Intent#ACTION_SEND} action and add extras that specify the content to share. When you call {@link android.content.Context#startActivity startActivity()} with that intent, the user can @@ -362,13 +376,15 @@ pick an app through which to share the content.

          Caution: It's possible that a user won't have any apps that handle the implicit intent you send to {@link android.content.Context#startActivity -startActivity()}. If that happens, the call will fail and your app will crash. To verify +startActivity()}. If that happens, the call fails and your app crashes. To verify that an activity will receive the intent, call {@link android.content.Intent#resolveActivity resolveActivity()} on your {@link android.content.Intent} object. If the result is non-null, -then there is at least one app that can handle the intent and it's safe to call + there is at least one app that can handle the intent and it's safe to call {@link android.content.Context#startActivity startActivity()}. If the result is null, -you should not use the intent and, if possible, you should disable the feature that issues -the intent.

          + do not use the intent and, if possible, you should disable the feature that issues +the intent. The following example shows how to verify that the intent resolves +to an activity. This example doesn't use a URI, but the intent's data type +is declared to specify the content carried by the extras.

          @@ -384,8 +400,7 @@ if (sendIntent.resolveActivity(getPackageManager()) != null) {
           }
           
          -

          Note: In this case, a URI is not used, but the intent's data type -is declared to specify the content carried by the extras.

          +

          When {@link android.content.Context#startActivity startActivity()} is called, the system @@ -393,7 +408,7 @@ examines all of the installed apps to determine which ones can handle this kind intent with the {@link android.content.Intent#ACTION_SEND} action and that carries "text/plain" data). If there's only one app that can handle it, that app opens immediately and is given the intent. If multiple activities accept the intent, the system -displays a dialog so the user can pick which app to use..

          +displays a dialog such as the one shown in Figure 2, so the user can pick which app to use.

          @@ -405,23 +420,26 @@ displays a dialog so the user can pick which app to use..

          When there is more than one app that responds to your implicit intent, the user can select which app to use and make that app the default choice for the -action. This is nice when performing an action for which the user -probably wants to use the same app from now on, such as when opening a web page (users -often prefer just one web browser) .

          +action. The ability to select a default is helpful when performing an action for which the user +probably wants to use the same app every time, such as when opening a web page (users +often prefer just one web browser).

          However, if multiple apps can respond to the intent and the user might want to use a different app each time, you should explicitly show a chooser dialog. The chooser dialog asks the -user to select which app to use for the action every time (the user cannot select a default app for +user to select which app to use for the action (the user cannot select a default app for the action). For example, when your app performs "share" with the {@link android.content.Intent#ACTION_SEND} action, users may want to share using a different app depending -on their current situation, so you should always use the chooser dialog, as shown in figure 2.

          +on their current situation, so you should always use the chooser dialog, as shown in Figure 2.

          To show the chooser, create an {@link android.content.Intent} using {@link android.content.Intent#createChooser createChooser()} and pass it to {@link -android.app.Activity#startActivity startActivity()}. For example:

          +android.app.Activity#startActivity startActivity()}, as shown in the following example. + This example displays a dialog with a list of apps that respond to the intent passed to the {@link +android.content.Intent#createChooser createChooser()} method and uses the supplied text as the +dialog title.

           Intent sendIntent = new Intent(Intent.ACTION_SEND);
          @@ -439,26 +457,16 @@ if (sendIntent.resolveActivity(getPackageManager()) != null) {
           }
           
          -

          This displays a dialog with a list of apps that respond to the intent passed to the {@link -android.content.Intent#createChooser createChooser()} method and uses the supplied text as the -dialog title.

          - - - - - - - -

          Receiving an Implicit Intent

          +

          Receiving an implicit intent

          To advertise which implicit intents your app can receive, declare one or more intent filters for each of your app components with an {@code } +"{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code <intent-filter>} element in your manifest file. Each intent filter specifies the type of intents it accepts based on the intent's action, -data, and category. The system will deliver an implicit intent to your app component only if the +data, and category. The system delivers an implicit intent to your app component only if the intent can pass through one of your intent filters.

          Note: An explicit intent is always delivered to its target, @@ -471,28 +479,28 @@ it inspects the {@link android.content.Intent} and decides how to behave based o in the {@link android.content.Intent} (such as to show the editor controls or not).

          Each intent filter is defined by an {@code } +href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code <intent-filter>} element in the app's manifest file, nested in the corresponding app component (such -as an {@code } +as an {@code <activity>} element). Inside the {@code }, +href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code <intent-filter>}, you can specify the type of intents to accept using one or more of these three elements:

          -
          {@code }
          +
          {@code <action>}
          Declares the intent action accepted, in the {@code name} attribute. The value must be the literal string value of an action, not the class constant.
          -
          {@code }
          +
          {@code <data>}
          Declares the type of data accepted, using one or more attributes that specify various aspects of the data URI (scheme, host, port, - path, etc.) and MIME type.
          -
          {@code }
          + path) and MIME type.
          +
          {@code <category>}
          Declares the intent category accepted, in the {@code name} attribute. The value must be the literal string value of an action, not the class constant. -

          Note: In order to receive implicit intents, you - must include the +

          Note: To receive implicit intents, you + must include the {@link android.content.Intent#CATEGORY_DEFAULT} category in the intent filter. The methods {@link android.app.Activity#startActivity startActivity()} and {@link android.app.Activity#startActivityForResult startActivityForResult()} treat all intents @@ -515,12 +523,12 @@ of these three elements:

          </activity>
        13. -

          It's okay to create a filter that includes more than one instance of -{@code }, -{@code }, or -{@code }. -If you do, you simply need to be certain that the component can handle any and all combinations -of those filter elements.

          +

          You can create a filter that includes more than one instance of +{@code <action>}, +{@code <data>}, or +{@code <category>}. +If you do, you need to be certain that the component can handle any and all +combinations of those filter elements.

          When you want to handle multiple kinds of intents, but only in specific combinations of action, data, and category type, then you need to create multiple intent filters.

          @@ -569,8 +577,8 @@ is running.

          Example filters

          -

          To better understand some of the intent filter behaviors, look at the following snippet -from the manifest file of a social-sharing app.

          +

          To demonstrate some of the intent filter behaviors, here is an example +from the manifest file of a social-sharing app:

           <activity android:name="MainActivity">
          @@ -607,9 +615,9 @@ opens when the user initially launches the app with the launcher icon:

          indicates this is the main entry point and does not expect any intent data.
        14. The {@link android.content.Intent#CATEGORY_LAUNCHER} category indicates that this activity's icon should be placed in the system's app launcher. If the {@code } element + href="{@docRoot}guide/topics/manifest/activity-element.html">{@code <activity>} element does not specify an icon with {@code icon}, then the system uses the icon from the {@code } + href="{@docRoot}guide/topics/manifest/application-element.html">{@code <application>} element.
        15. These two must be paired together in order for the activity to appear in the app launcher.

          @@ -620,7 +628,7 @@ they can also enter {@code ShareActivity} directly from another app that issues intent matching one of the two intent filters.

          Note: The MIME type, -{@code +{@code application/vnd.google.panorama360+jpg}, is a special data type that specifies panoramic photos, which you can handle with the Google @@ -638,7 +646,7 @@ panorama APIs.

          -

          Using a Pending Intent

          +

          Using a pending intent

          A {@link android.app.PendingIntent} object is a wrapper around an {@link android.content.Intent} object. The primary purpose of a {@link android.app.PendingIntent} @@ -646,25 +654,25 @@ is to grant permission to a foreign application to use the contained {@link android.content.Intent} as if it were executed from your app's own process.

          -

          Major use cases for a pending intent include:

          +

          Major use cases for a pending intent include the following:

            -
          • Declare an intent to be executed when the user performs an action with your Declaring an intent to be executed when the user performs an action with your Notification (the Android system's {@link android.app.NotificationManager} executes the {@link android.content.Intent}). -
          • Declare an intent to be executed when the user performs an action with your +
          • Declaring an intent to be executed when the user performs an action with your App Widget (the Home screen app executes the {@link android.content.Intent}). -
          • Declare an intent to be executed at a specified time in the future (the Android +
          • Declaring an intent to be executed at a specified future time (the Android system's {@link android.app.AlarmManager} executes the {@link android.content.Intent}).
          -

          Because each {@link android.content.Intent} object is designed to be handled by a specific +

          Just as each {@link android.content.Intent} object is designed to be handled by a specific type of app component (either an {@link android.app.Activity}, a {@link android.app.Service}, or a {@link android.content.BroadcastReceiver}), so too must a {@link android.app.PendingIntent} be -created with the same consideration. When using a pending intent, your app will not +created with the same consideration. When using a pending intent, your app doesn't execute the intent with a call such as {@link android.content.Context#startActivity -startActivity()}. You must instead declare the intended component type when you create the +startActivity()}. Instead, you must declare the intended component type when you create the {@link android.app.PendingIntent} by calling the respective creator method:

            @@ -677,14 +685,14 @@ startActivity()}. You must instead declare the intended component type when you

          Unless your app is receiving pending intents from other apps, -the above methods to create a {@link android.app.PendingIntent} are the only -{@link android.app.PendingIntent} methods you'll probably ever need.

          +the above methods to create a {@link android.app.PendingIntent} are probably the only +{@link android.app.PendingIntent} methods you'll ever need.

          Each method takes the current app {@link android.content.Context}, the {@link android.content.Intent} you want to wrap, and one or more flags that specify how the intent should be used (such as whether the intent can be used more than once).

          -

          More information about using pending intents is provided with the documentation for each +

          For more information about using pending intents, see the documentation for each of the respective use cases, such as in the Notifications and App Widgets API guides.

          @@ -695,27 +703,27 @@ and App Widgets API g -

          Intent Resolution

          +

          Intent resolution

          When the system receives an implicit intent to start an activity, it searches for the -best activity for the intent by comparing the intent to intent filters based on three aspects:

          +best activity for the intent by comparing the it to intent filters based on three aspects:

            -
          • The intent action -
          • The intent data (both URI and data type) -
          • The intent category +
          • Action. +
          • Data (both URI and data type). +
          • Category.
          -

          The following sections describe how intents are matched to the appropriate component(s) -in terms of how the intent filter is declared in an app's manifest file.

          +

          The following sections describe how intents are matched to the appropriate components +according to the intent filter declaration in an app's manifest file.

          Action test

          To specify accepted intent actions, an intent filter can declare zero or more {@code -} elements. For example:

          +<action>} elements, as shown in the following example:

           <intent-filter>
          @@ -725,13 +733,13 @@ in terms of how the intent filter is declared in an app's manifest file.

          </intent-filter>
          -

          To get through this filter, the action specified in the {@link android.content.Intent} +

          To pass this filter, the action specified in the {@link android.content.Intent} must match one of the actions listed in the filter.

          If the filter does not list any actions, there is nothing for an intent to match, so all intents fail the test. However, if an {@link android.content.Intent} -does not specify an action, it will pass the test (as long as the filter -contains at least one action).

          +does not specify an action, it passes the test as long as the filter +contains at least one action.

          @@ -739,7 +747,7 @@ contains at least one action).

          To specify accepted intent categories, an intent filter can declare zero or more {@code -} elements. For example:

          +} elements, as shown in the following example:

           <intent-filter>
          @@ -752,17 +760,17 @@ contains at least one action).

          For an intent to pass the category test, every category in the {@link android.content.Intent} must match a category in the filter. The reverse is not necessary—the intent filter may declare more categories than are specified in the {@link android.content.Intent} and the -{@link android.content.Intent} will still pass. Therefore, an intent with no categories should -always pass this test, regardless of what categories are declared in the filter.

          +{@link android.content.Intent} still passes. Therefore, an intent with no categories +always passes this test, regardless of what categories are declared in the filter.

          Note: -Android automatically applies the the {@link android.content.Intent#CATEGORY_DEFAULT} category +Android automatically applies the {@link android.content.Intent#CATEGORY_DEFAULT} category to all implicit intents passed to {@link android.content.Context#startActivity startActivity()} and {@link android.app.Activity#startActivityForResult startActivityForResult()}. -So if you want your activity to receive implicit intents, it must -include a category for {@code "android.intent.category.DEFAULT"} in its intent filters (as -shown in the previous {@code } example.

          +If you want your activity to receive implicit intents, it must +include a category for {@code "android.intent.category.DEFAULT"} in its intent filters, as +shown in the previous {@code <intent-filter>} example.

          @@ -770,7 +778,7 @@ shown in the previous {@code } example.

          To specify accepted intent data, an intent filter can declare zero or more {@code -} elements. For example:

          +<data>} elements, as shown in the following example:

           <intent-filter>
          @@ -781,15 +789,16 @@ shown in the previous {@code } example.

          Each <data> -element can specify a URI structure and a data type (MIME media type). There are separate -attributes — {@code scheme}, {@code host}, {@code port}, -and {@code path} — for each part of the URI: +element can specify a URI structure and a data type (MIME media type). + Each part of the URI is a separate +attribute: {@code scheme}, {@code host}, {@code port}, +and {@code path}:

          -

          {@code ://:/}

          +

          {@code <scheme>://<host>:<port>/<path>}

          -For example: +The following example shows possible values for these attributes:

          {@code content://com.example.project:200/folder/subfolder/etc}

          @@ -799,7 +808,7 @@ the port is {@code 200}, and the path is {@code folder/subfolder/etc}.

          Each of these attributes is optional in a {@code } element, +href="{@docRoot}guide/topics/manifest/data-element.html">{@code <data>} element, but there are linear dependencies:

          • If a scheme is not specified, the host is ignored.
          • @@ -842,17 +851,17 @@ type matches a type listed in the filter. It passes the URI part of the test either if its URI matches a URI in the filter or if it has a {@code content:} or {@code file:} URI and the filter does not specify a URI. In other words, a component is presumed to support {@code content:} and {@code file:} data if -its filter lists only a MIME type.

            +its filter lists only a MIME type.

        This last rule, rule (d), reflects the expectation that components are able to get local data from a file or content provider. -Therefore, their filters can list just a data type and do not need to explicitly +Therefore, their filters can list just a data type and don't need to explicitly name the {@code content:} and {@code file:} schemes. -This is a typical case. A {@code } element -like the following, for example, tells Android that the component can get image data from a content +The following example shows a typical case in which a {@code <data>} element + tells Android that the component can get image data from a content provider and display it:

        @@ -863,14 +872,15 @@ provider and display it: </intent-filter>

        -Because most available data is dispensed by content providers, filters that -specify a data type but not a URI are perhaps the most common. +Filters that +specify a data type but not a URI are perhaps the most common because most available + data is dispensed by content providers.

        -Another common configuration is filters with a scheme and a data type. For +Another common configuration is a filter with a scheme and a data type. For example, a {@code } +href="{@docRoot}guide/topics/manifest/data-element.html">{@code <data>} element like the following tells Android that the component can retrieve video data from the network in order to perform the action:

        @@ -894,7 +904,7 @@ by finding all the activities with intent filters that specify the

        Your application can use intent matching in a similar way. The {@link android.content.pm.PackageManager} has a set of {@code query...()} -methods that return all components that can accept a particular intent, and +methods that return all components that can accept a particular intent and a similar series of {@code resolve...()} methods that determine the best component to respond to an intent. For example, {@link android.content.pm.PackageManager#queryIntentActivities @@ -907,7 +917,3 @@ can respond. There's a similar method, {@link android.content.pm.PackageManager#queryBroadcastReceivers queryBroadcastReceivers()}, for broadcast receivers.

        - - - - diff --git a/docs/html/guide/components/services.jd b/docs/html/guide/components/services.jd index e646a17a18a7265799539a740a3df5ff1081d675..a7ed7186e1fbc98e80b57b2f4a6b7db2fc296ee0 100644 --- a/docs/html/guide/components/services.jd +++ b/docs/html/guide/components/services.jd @@ -5,11 +5,11 @@ page.title=Services

          In this document

            -
          1. The Basics
          2. +
          3. The basics
            1. Declaring a service in the manifest
            -
          4. Creating a Started Service +
          5. Creating a started service
            1. Extending the IntentService class
            2. Extending the Service class
            3. @@ -17,10 +17,10 @@ page.title=Services
            4. Stopping a service
          6. -
          7. Creating a Bound Service
          8. -
          9. Sending Notifications to the User
          10. -
          11. Running a Service in the Foreground
          12. -
          13. Managing the Lifecycle of a Service +
          14. Creating a bound service
          15. +
          16. Sending notifications to the user
          17. +
          18. Running a service in the foreground
          19. +
          20. Managing the lifecycle of a service
            1. Implementing the lifecycle callbacks
            @@ -48,70 +48,80 @@ page.title=Services -

            A {@link android.app.Service} is an application component that can perform -long-running operations in the background and does not provide a user interface. Another -application component can start a service and it will continue to run in the background even if the +long-running operations in the background, and it does not provide a user interface. Another +application component can start a service, and it continues to run in the background even if the user switches to another application. Additionally, a component can bind to a service to -interact with it and even perform interprocess communication (IPC). For example, a service might +interact with it and even perform interprocess communication (IPC). For example, a service can handle network transactions, play music, perform file I/O, or interact with a content provider, all from the background.

            -

            A service can essentially take two forms:

            +

            These are the three different types of services:

            +
            Scheduled
            +
            A service is scheduled when an API such as the {@link android.app.job.JobScheduler}, + introduced in Android 5.0 (API level 21), launches the service. You can use the + {@link android.app.job.JobScheduler} by registering jobs and specifying their requirements for + network and timing. The system then gracefully schedules the jobs for execution at the + appropriate times. The {@link android.app.job.JobScheduler} provides many methods to define + service-execution conditions. +

            Note: If your app targets Android 5.0 (API level 21), Google + recommends that you use the {@link android.app.job.JobScheduler} to execute background + services. For more information about using this class, see the + {@link android.app.job.JobScheduler} reference documentation.

            Started
            -
            A service is "started" when an application component (such as an activity) starts it by -calling {@link android.content.Context#startService startService()}. Once started, a service -can run in the background indefinitely, even if the component that started it is destroyed. Usually, -a started service performs a single operation and does not return a result to the caller. -For example, it might download or upload a file over the network. When the operation is done, the -service should stop itself.
            +
            A service is started when an application component (such as an activity) + calls {@link android.content.Context#startService startService()}. After it's started, a + service can run in the background indefinitely, even if the component that started it is + destroyed. Usually, a started service performs a single operation and does not return a result to + the caller. For example, it can download or upload a file over the network. When the operation is + complete, the service should stop itself.
            Bound
            -
            A service is "bound" when an application component binds to it by calling {@link -android.content.Context#bindService bindService()}. A bound service offers a client-server -interface that allows components to interact with the service, send requests, get results, and even -do so across processes with interprocess communication (IPC). A bound service runs only as long as -another application component is bound to it. Multiple components can bind to the service at once, -but when all of them unbind, the service is destroyed.
            +
            A service is bound when an application component binds to it by calling {@link + android.content.Context#bindService bindService()}. A bound service offers a client-server + interface that allows components to interact with the service, send requests, receive results, + and even do so across processes with interprocess communication (IPC). A bound service runs only + as long as another application component is bound to it. Multiple components can bind to the + service at once, but when all of them unbind, the service is destroyed.
            -

            Although this documentation generally discusses these two types of services separately, your -service can work both ways—it can be started (to run indefinitely) and also allow binding. -It's simply a matter of whether you implement a couple callback methods: {@link +

            Although this documentation generally discusses started and bound services separately, +your service can work both ways—it can be started (to run indefinitely) and also allow +binding. It's simply a matter of whether you implement a couple of callback methods: {@link android.app.Service#onStartCommand onStartCommand()} to allow components to start it and {@link android.app.Service#onBind onBind()} to allow binding.

            Regardless of whether your application is started, bound, or both, any application component -can use the service (even from a separate application), in the same way that any component can use +can use the service (even from a separate application) in the same way that any component can use an activity—by starting it with an {@link android.content.Intent}. However, you can declare -the service as private, in the manifest file, and block access from other applications. This is -discussed more in the section about Declaring the service in the +the service as private in the manifest file and block access from other applications. +This is discussed more in the section about Declaring the service in the manifest.

            Caution: A service runs in the -main thread of its hosting process—the service does not create its own thread -and does not run in a separate process (unless you specify otherwise). This means -that, if your service is going to do any CPU intensive work or blocking operations (such as MP3 -playback or networking), you should create a new thread within the service to do that work. By using -a separate thread, you will reduce the risk of Application Not Responding (ANR) errors and the -application's main thread can remain dedicated to user interaction with your activities.

            - +main thread of its hosting process; the service does not create its own +thread and does not run in a separate process unless you specify otherwise. If +your service is going to perform any CPU-intensive work or blocking operations, such as MP3 +playback or networking, you should create a new thread within the service to complete that work. +By using a separate thread, you can reduce the risk of Application Not Responding (ANR) errors, +and the application's main thread can remain dedicated to user interaction with your +activities.

            -

            The Basics

            +

            The basics

            -

            To create a service, you must create a subclass of {@link android.app.Service} (or one -of its existing subclasses). In your implementation, you need to override some callback methods that -handle key aspects of the service lifecycle and provide a mechanism for components to bind to -the service, if appropriate. The most important callback methods you should override are:

            +

            To create a service, you must create a subclass of {@link android.app.Service} or use one +of its existing subclasses. In your implementation, you must override some callback methods that +handle key aspects of the service lifecycle and provide a mechanism that allows the components to +bind to the service, if appropriate. These are the most important callback methods that you should +override:

            {@link android.app.Service#onStartCommand onStartCommand()}
            -
            The system calls this method when another component, such as an activity, -requests that the service be started, by calling {@link android.content.Context#startService -startService()}. Once this method executes, the service is started and can run in the +
            The system invokes this method by calling {@link android.content.Context#startService +startService()} when another component (such as an activity) requests that the service be started. +When this method executes, the service is started and can run in the background indefinitely. If you implement this, it is your responsibility to stop the service when -its work is done, by calling {@link android.app.Service#stopSelf stopSelf()} or {@link -android.content.Context#stopService stopService()}. (If you only want to provide binding, you don't -need to implement this method.)
            +its work is complete by calling {@link android.app.Service#stopSelf stopSelf()} or {@link +android.content.Context#stopService stopService()}. If you only want to provide binding, you don't +need to implement this method.
            {@link android.app.Service#onBind onBind()}
            -
            The system calls this method when another component wants to bind with the -service (such as to perform RPC), by calling {@link android.content.Context#bindService -bindService()}. In your implementation of this method, you must provide an interface that clients -use to communicate with the service, by returning an {@link android.os.IBinder}. You must always -implement this method, but if you don't want to allow binding, then you should return null.
            +
            The system invokes this method by calling {@link android.content.Context#bindService +bindService()} when another component wants to bind with the service (such as to perform RPC). +In your implementation of this method, you must provide an interface that clients +use to communicate with the service by returning an {@link android.os.IBinder}. You must always +implement this method; however, if you don't want to allow binding, you should return +null.
            {@link android.app.Service#onCreate()}
            -
            The system calls this method when the service is first created, to perform one-time setup -procedures (before it calls either {@link android.app.Service#onStartCommand onStartCommand()} or +
            The system invokes this method to perform one-time setup procedures when the service is +initially created (before it calls either +{@link android.app.Service#onStartCommand onStartCommand()} or {@link android.app.Service#onBind onBind()}). If the service is already running, this method is not called.
            {@link android.app.Service#onDestroy()}
            -
            The system calls this method when the service is no longer used and is being destroyed. +
            The system invokes this method when the service is no longer used and is being destroyed. Your service should implement this to clean up any resources such as threads, registered -listeners, receivers, etc. This is the last call the service receives.
            +listeners, or receivers. This is the last call that the service receives.

            If a component starts the service by calling {@link android.content.Context#startService startService()} (which results in a call to {@link -android.app.Service#onStartCommand onStartCommand()}), then the service -remains running until it stops itself with {@link android.app.Service#stopSelf()} or another +android.app.Service#onStartCommand onStartCommand()}), the service +continues to run until it stops itself with {@link android.app.Service#stopSelf()} or another component stops it by calling {@link android.content.Context#stopService stopService()}.

            If a component calls -{@link android.content.Context#bindService bindService()} to create the service (and {@link -android.app.Service#onStartCommand onStartCommand()} is not called), then the service runs -only as long as the component is bound to it. Once the service is unbound from all clients, the -system destroys it.

            +{@link android.content.Context#bindService bindService()} to create the service and {@link +android.app.Service#onStartCommand onStartCommand()} is not called, the service runs +only as long as the component is bound to it. After the service is unbound from all of its clients, +the system destroys it.

            -

            The Android system will force-stop a service only when memory is low and it must recover system +

            The Android system force-stops a service only when memory is low and it must recover system resources for the activity that has user focus. If the service is bound to an activity that has user -focus, then it's less likely to be killed, and if the service is declared to run in the foreground (discussed later), then it will almost never be killed. -Otherwise, if the service was started and is long-running, then the system will lower its position -in the list of background tasks over time and the service will become highly susceptible to -killing—if your service is started, then you must design it to gracefully handle restarts +focus, it's less likely to be killed; if the service is declared to run in the foreground, it's rarely killed. +If the service is started and is long-running, the system lowers its position +in the list of background tasks over time, and the service becomes highly susceptible to +killing—if your service is started, you must design it to gracefully handle restarts by the system. If the system kills your service, it restarts it as soon as resources become -available again (though this also depends on the value you return from {@link -android.app.Service#onStartCommand onStartCommand()}, as discussed later). For more information +available, but this also depends on the value that you return from {@link +android.app.Service#onStartCommand onStartCommand()}. For more information about when the system might destroy a service, see the Processes and Threading document.

            -

            In the following sections, you'll see how you can create each type of service and how to use -it from other application components.

            - - +

            In the following sections, you'll see how you can create the +{@link android.content.Context#startService startService()} and +{@link android.content.Context#bindService bindService()} service methods, as well as how to use +them from other application components.

            Declaring a service in the manifest

            -

            Like activities (and other components), you must declare all services in your application's -manifest file.

            +

            You must declare all services in your application's +manifest file, just as you do for activities and other components.

            To declare your service, add a {@code } element +href="{@docRoot}guide/topics/manifest/service-element.html">{@code <service>} element as a child of the {@code } -element. For example:

            +href="{@docRoot}guide/topics/manifest/application-element.html">{@code <application>} +element. Here is an example:

             <manifest ... >
            @@ -205,48 +218,44 @@ element. For example:

            See the {@code } element +href="{@docRoot}guide/topics/manifest/service-element.html">{@code <service>} element reference for more information about declaring your service in the manifest.

            -

            There are other attributes you can include in the {@code } element to -define properties such as permissions required to start the service and the process in +

            There are other attributes that you can include in the {@code <service>} element to +define properties such as the permissions that are required to start the service and the process in which the service should run. The {@code android:name} -attribute is the only required attribute—it specifies the class name of the service. Once -you publish your application, you should not change this name, because if you do, you risk breaking +attribute is the only required attribute—it specifies the class name of the service. After +you publish your application, leave this name unchanged to avoid the risk of breaking code due to dependence on explicit intents to start or bind the service (read the blog post, Things That Cannot Change). -

            To ensure your app is secure, always use an explicit intent when starting or binding -your {@link android.app.Service} and do not declare intent filters for the service. If -it's critical that you allow for some amount of ambiguity as to which service starts, you can -supply intent filters for your services and exclude the component name from the {@link -android.content.Intent}, but you then must set the package for the intent with {@link -android.content.Intent#setPackage setPackage()}, which provides sufficient disambiguation for the -target service.

            +

            Caution: To ensure that your app is secure, always use an +explicit intent when starting a {@link android.app.Service} and do not declare intent filters for +your services. Using an implicit intent to start a service is a security hazard because you cannot +be certain of the service that will respond to the intent, and the user cannot see which service +starts. Beginning with Android 5.0 (API level 21), the system throws an exception if you call +{@link android.content.Context#bindService bindService()} with an implicit intent.

            -

            Additionally, you can ensure that your service is available to only your app by +

            You can ensure that your service is available to only your app by including the {@code android:exported} -attribute and setting it to {@code "false"}. This effectively stops other apps from starting your +attribute and setting it to {@code false}. This effectively stops other apps from starting your service, even when using an explicit intent.

            - - - -

            Creating a Started Service

            +

            Creating a started service

            A started service is one that another component starts by calling {@link -android.content.Context#startService startService()}, resulting in a call to the service's +android.content.Context#startService startService()}, which results in a call to the service's {@link android.app.Service#onStartCommand onStartCommand()} method.

            When a service is started, it has a lifecycle that's independent of the -component that started it and the service can run in the background indefinitely, even if +component that started it. The service can run in the background indefinitely, even if the component that started it is destroyed. As such, the service should stop itself when its job -is done by calling {@link android.app.Service#stopSelf stopSelf()}, or another component can stop it -by calling {@link android.content.Context#stopService stopService()}.

            +is complete by calling {@link android.app.Service#stopSelf stopSelf()}, or another component can +stop it by calling {@link android.content.Context#stopService stopService()}.

            An application component such as an activity can start the service by calling {@link android.content.Context#startService startService()} and passing an {@link android.content.Intent} @@ -254,65 +263,65 @@ that specifies the service and includes any data for the service to use. The ser this {@link android.content.Intent} in the {@link android.app.Service#onStartCommand onStartCommand()} method.

            -

            For instance, suppose an activity needs to save some data to an online database. The activity can -start a companion service and deliver it the data to save by passing an intent to {@link +

            For instance, suppose an activity needs to save some data to an online database. The activity +can start a companion service and deliver it the data to save by passing an intent to {@link android.content.Context#startService startService()}. The service receives the intent in {@link -android.app.Service#onStartCommand onStartCommand()}, connects to the Internet and performs the -database transaction. When the transaction is done, the service stops itself and it is +android.app.Service#onStartCommand onStartCommand()}, connects to the Internet, and performs the +database transaction. When the transaction is complete, the service stops itself and is destroyed.

            Caution: A service runs in the same process as the application -in which it is declared and in the main thread of that application, by default. So, if your service +in which it is declared and in the main thread of that application by default. If your service performs intensive or blocking operations while the user interacts with an activity from the same -application, the service will slow down activity performance. To avoid impacting application -performance, you should start a new thread inside the service.

            +application, the service slows down activity performance. To avoid impacting application +performance, start a new thread inside the service.

            Traditionally, there are two classes you can extend to create a started service:

            +
            {@link android.app.Service}
            -
            This is the base class for all services. When you extend this class, it's important that -you create a new thread in which to do all the service's work, because the service uses your -application's main thread, by default, which could slow the performance of any activity your +
            This is the base class for all services. When you extend this class, it's important to +create a new thread in which the service can complete all of its work; the service uses your +application's main thread by default, which can slow the performance of any activity that your application is running.
            {@link android.app.IntentService}
            -
            This is a subclass of {@link android.app.Service} that uses a worker thread to handle all -start requests, one at a time. This is the best option if you don't require that your service -handle multiple requests simultaneously. All you need to do is implement {@link +
            This is a subclass of {@link android.app.Service} that uses a worker thread to handle all of +the start requests, one at a time. This is the best option if you don't require that your service +handle multiple requests simultaneously. Implement {@link android.app.IntentService#onHandleIntent onHandleIntent()}, which receives the intent for each -start request so you can do the background work.
            +start request so that you can complete the background work.

            The following sections describe how you can implement your service using either one for these classes.

            -

            Extending the IntentService class

            -

            Because most started services don't need to handle multiple requests simultaneously -(which can actually be a dangerous multi-threading scenario), it's probably best if you +

            Because most of the started services don't need to handle multiple requests simultaneously +(which can actually be a dangerous multi-threading scenario), it's best that you implement your service using the {@link android.app.IntentService} class.

            -

            The {@link android.app.IntentService} does the following:

            +

            The {@link android.app.IntentService} class does the following:

              -
            • Creates a default worker thread that executes all intents delivered to {@link -android.app.Service#onStartCommand onStartCommand()} separate from your application's main +
            • It creates a default worker thread that executes all of the intents that are delivered to +{@link android.app.Service#onStartCommand onStartCommand()}, separate from your application's main thread.
            • Creates a work queue that passes one intent at a time to your {@link android.app.IntentService#onHandleIntent onHandleIntent()} implementation, so you never have to worry about multi-threading.
            • -
            • Stops the service after all start requests have been handled, so you never have to call +
            • Stops the service after all of the start requests are handled, so you never have to call {@link android.app.Service#stopSelf}.
            • -
            • Provides default implementation of {@link android.app.IntentService#onBind onBind()} that -returns null.
            • +
            • Provides a default implementation of {@link android.app.IntentService#onBind onBind()} + that returns null.
            • Provides a default implementation of {@link android.app.IntentService#onStartCommand onStartCommand()} that sends the intent to the work queue and then to your {@link android.app.IntentService#onHandleIntent onHandleIntent()} implementation.
            -

            All this adds up to the fact that all you need to do is implement {@link -android.app.IntentService#onHandleIntent onHandleIntent()} to do the work provided by the -client. (Though, you also need to provide a small constructor for the service.)

            +

            To complete the work that is provided by the client, implement {@link +android.app.IntentService#onHandleIntent onHandleIntent()}. +However, you also need to provide a small constructor for the service.

            Here's an example implementation of {@link android.app.IntentService}:

            @@ -352,12 +361,12 @@ android.app.IntentService#onHandleIntent onHandleIntent()}.

            If you decide to also override other callback methods, such as {@link android.app.IntentService#onCreate onCreate()}, {@link android.app.IntentService#onStartCommand onStartCommand()}, or {@link -android.app.IntentService#onDestroy onDestroy()}, be sure to call the super implementation, so +android.app.IntentService#onDestroy onDestroy()}, be sure to call the super implementation so that the {@link android.app.IntentService} can properly handle the life of the worker thread.

            For example, {@link android.app.IntentService#onStartCommand onStartCommand()} must return -the default implementation (which is how the intent gets delivered to {@link -android.app.IntentService#onHandleIntent onHandleIntent()}):

            +the default implementation, which is how the intent is delivered to {@link +android.app.IntentService#onHandleIntent onHandleIntent()}:

             @Override
            @@ -369,22 +378,21 @@ public int onStartCommand(Intent intent, int flags, int startId) {
             
             

            Besides {@link android.app.IntentService#onHandleIntent onHandleIntent()}, the only method from which you don't need to call the super class is {@link android.app.IntentService#onBind -onBind()} (but you only need to implement that if your service allows binding).

            +onBind()}. You need to implement this only if your service allows binding.

            In the next section, you'll see how the same kind of service is implemented when extending -the base {@link android.app.Service} class, which is a lot more code, but which might be +the base {@link android.app.Service} class, which uses more code, but might be appropriate if you need to handle simultaneous start requests.

            -

            Extending the Service class

            -

            As you saw in the previous section, using {@link android.app.IntentService} makes your +

            Using {@link android.app.IntentService} makes your implementation of a started service very simple. If, however, you require your service to -perform multi-threading (instead of processing start requests through a work queue), then you +perform multi-threading (instead of processing start requests through a work queue), you can extend the {@link android.app.Service} class to handle each intent.

            -

            For comparison, the following example code is an implementation of the {@link -android.app.Service} class that performs the exact same work as the example above using {@link +

            For comparison, the following example code shows an implementation of the {@link +android.app.Service} class that performs the same work as the previous example using {@link android.app.IntentService}. That is, for each start request, it uses a worker thread to perform the job and processes only one request at a time.

            @@ -460,20 +468,20 @@ public class HelloService extends Service {

            However, because you handle each call to {@link android.app.Service#onStartCommand onStartCommand()} yourself, you can perform multiple requests simultaneously. That's not what -this example does, but if that's what you want, then you can create a new thread for each -request and run them right away (instead of waiting for the previous request to finish).

            +this example does, but if that's what you want, you can create a new thread for each +request and run them right away instead of waiting for the previous request to finish.

            Notice that the {@link android.app.Service#onStartCommand onStartCommand()} method must return an integer. The integer is a value that describes how the system should continue the service in the -event that the system kills it (as discussed above, the default implementation for {@link -android.app.IntentService} handles this for you, though you are able to modify it). The return value +event that the system kills it. The default implementation for {@link +android.app.IntentService} handles this for you, but you are able to modify it. The return value from {@link android.app.Service#onStartCommand onStartCommand()} must be one of the following constants:

            {@link android.app.Service#START_NOT_STICKY}
            If the system kills the service after {@link android.app.Service#onStartCommand -onStartCommand()} returns, do not recreate the service, unless there are pending +onStartCommand()} returns, do not recreate the service unless there are pending intents to deliver. This is the safest option to avoid running your service when not necessary and when your application can simply restart any unfinished jobs.
            {@link android.app.Service#START_STICKY}
            @@ -481,9 +489,9 @@ and when your application can simply restart any unfinished jobs. onStartCommand()} returns, recreate the service and call {@link android.app.Service#onStartCommand onStartCommand()}, but do not redeliver the last intent. Instead, the system calls {@link android.app.Service#onStartCommand onStartCommand()} with a -null intent, unless there were pending intents to start the service, in which case, +null intent unless there are pending intents to start the service. In that case, those intents are delivered. This is suitable for media players (or similar services) that are not -executing commands, but running indefinitely and waiting for a job. +executing commands but are running indefinitely and waiting for a job.
            {@link android.app.Service#START_REDELIVER_INTENT}
            If the system kills the service after {@link android.app.Service#onStartCommand onStartCommand()} returns, recreate the service and call {@link @@ -494,35 +502,35 @@ actively performing a job that should be immediately resumed, such as downloadin

            For more details about these return values, see the linked reference documentation for each constant.

            - - -

            Starting a Service

            +

            Starting a service

            You can start a service from an activity or other application component by passing an {@link android.content.Intent} (specifying the service to start) to {@link android.content.Context#startService startService()}. The Android system calls the service's {@link android.app.Service#onStartCommand onStartCommand()} method and passes it the {@link -android.content.Intent}. (You should never call {@link android.app.Service#onStartCommand -onStartCommand()} directly.)

            +android.content.Intent}. + +

            Note: Never call +{@link android.app.Service#onStartCommand onStartCommand()} directly.

            For example, an activity can start the example service in the previous section ({@code HelloService}) using an explicit intent with {@link android.content.Context#startService -startService()}:

            +startService()}, as shown here:

             Intent intent = new Intent(this, HelloService.class);
             startService(intent);
             
            -

            The {@link android.content.Context#startService startService()} method returns immediately and +

            The {@link android.content.Context#startService startService()} method returns immediately, and the Android system calls the service's {@link android.app.Service#onStartCommand onStartCommand()} method. If the service is not already running, the system first calls {@link -android.app.Service#onCreate onCreate()}, then calls {@link android.app.Service#onStartCommand -onStartCommand()}.

            +android.app.Service#onCreate onCreate()}, and then it calls +{@link android.app.Service#onStartCommand onStartCommand()}.

            -

            If the service does not also provide binding, the intent delivered with {@link +

            If the service does not also provide binding, the intent that is delivered with {@link android.content.Context#startService startService()} is the only mode of communication between the -application component and the service. However, if you want the service to send a result back, then +application component and the service. However, if you want the service to send a result back, the client that starts the service can create a {@link android.app.PendingIntent} for a broadcast (with {@link android.app.PendingIntent#getBroadcast getBroadcast()}) and deliver it to the service in the {@link android.content.Intent} that starts the service. The service can then use the @@ -533,109 +541,102 @@ broadcast to deliver a result.

            the service (with {@link android.app.Service#stopSelf stopSelf()} or {@link android.content.Context#stopService stopService()}) is required to stop it.

            -

            Stopping a service

            A started service must manage its own lifecycle. That is, the system does not stop or destroy the service unless it must recover system memory and the service -continues to run after {@link android.app.Service#onStartCommand onStartCommand()} returns. So, -the service must stop itself by calling {@link android.app.Service#stopSelf stopSelf()} or another +continues to run after {@link android.app.Service#onStartCommand onStartCommand()} returns. The +service must stop itself by calling {@link android.app.Service#stopSelf stopSelf()}, or another component can stop it by calling {@link android.content.Context#stopService stopService()}.

            Once requested to stop with {@link android.app.Service#stopSelf stopSelf()} or {@link android.content.Context#stopService stopService()}, the system destroys the service as soon as possible.

            -

            However, if your service handles multiple requests to {@link -android.app.Service#onStartCommand onStartCommand()} concurrently, then you shouldn't stop the -service when you're done processing a start request, because you might have since received a new +

            If your service handles multiple requests to {@link +android.app.Service#onStartCommand onStartCommand()} concurrently, you shouldn't stop the +service when you're done processing a start request, as you might have received a new start request (stopping at the end of the first request would terminate the second one). To avoid this problem, you can use {@link android.app.Service#stopSelf(int)} to ensure that your request to stop the service is always based on the most recent start request. That is, when you call {@link android.app.Service#stopSelf(int)}, you pass the ID of the start request (the startId delivered to {@link android.app.Service#onStartCommand onStartCommand()}) to which your stop request -corresponds. Then if the service received a new start request before you were able to call {@link -android.app.Service#stopSelf(int)}, then the ID will not match and the service will not stop.

            +corresponds. Then, if the service receives a new start request before you are able to call {@link +android.app.Service#stopSelf(int)}, the ID does not match and the service does not stop.

            -

            Caution: It's important that your application stops its services -when it's done working, to avoid wasting system resources and consuming battery power. If necessary, -other components can stop the service by calling {@link +

            Caution: To avoid wasting system resources and consuming +battery power, ensure that your application stops its services when it's done working. +If necessary, other components can stop the service by calling {@link android.content.Context#stopService stopService()}. Even if you enable binding for the service, -you must always stop the service yourself if it ever received a call to {@link +you must always stop the service yourself if it ever receives a call to {@link android.app.Service#onStartCommand onStartCommand()}.

            For more information about the lifecycle of a service, see the section below about Managing the Lifecycle of a Service.

            - - -

            Creating a Bound Service

            +

            Creating a bound service

            A bound service is one that allows application components to bind to it by calling {@link -android.content.Context#bindService bindService()} in order to create a long-standing connection -(and generally does not allow components to start it by calling {@link -android.content.Context#startService startService()}).

            +android.content.Context#bindService bindService()} to create a long-standing connection. +It generally doesn't allow components to start it by calling {@link +android.content.Context#startService startService()}.

            -

            You should create a bound service when you want to interact with the service from activities +

            Create a bound service when you want to interact with the service from activities and other components in your application or to expose some of your application's functionality to -other applications, through interprocess communication (IPC).

            +other applications through interprocess communication (IPC).

            -

            To create a bound service, you must implement the {@link +

            To create a bound service, implement the {@link android.app.Service#onBind onBind()} callback method to return an {@link android.os.IBinder} that defines the interface for communication with the service. Other application components can then call {@link android.content.Context#bindService bindService()} to retrieve the interface and begin calling methods on the service. The service lives only to serve the application component that -is bound to it, so when there are no components bound to the service, the system destroys it -(you do not need to stop a bound service in the way you must when the service is started -through {@link android.app.Service#onStartCommand onStartCommand()}).

            +is bound to it, so when there are no components bound to the service, the system destroys it. +You do not need to stop a bound service in the same way that you must when the service is +started through {@link android.app.Service#onStartCommand onStartCommand()}.

            -

            To create a bound service, the first thing you must do is define the interface that specifies -how a client can communicate with the service. This interface between the service +

            To create a bound service, you must define the interface that specifies how a client can +communicate with the service. This interface between the service and a client must be an implementation of {@link android.os.IBinder} and is what your service must return from the {@link android.app.Service#onBind -onBind()} callback method. Once the client receives the {@link android.os.IBinder}, it can begin +onBind()} callback method. After the client receives the {@link android.os.IBinder}, it can begin interacting with the service through that interface.

            -

            Multiple clients can bind to the service at once. When a client is done interacting with the -service, it calls {@link android.content.Context#unbindService unbindService()} to unbind. Once -there are no clients bound to the service, the system destroys the service.

            +

            Multiple clients can bind to the service simultaneously. When a client is done interacting with +the service, it calls {@link android.content.Context#unbindService unbindService()} to unbind. +When there are no clients bound to the service, the system destroys the service.

            -

            There are multiple ways to implement a bound service and the implementation is more -complicated than a started service, so the bound service discussion appears in a separate -document about There are multiple ways to implement a bound service, and the implementation is more +complicated than a started service. For these reasons, the bound service discussion appears in a +separate document about Bound Services.

            +

            Sending notifications to the user

            - -

            Sending Notifications to the User

            - -

            Once running, a service can notify the user of events using When a service is running, it can notify the user of events using Toast Notifications or Status Bar Notifications.

            -

            A toast notification is a message that appears on the surface of the current window for a -moment then disappears, while a status bar notification provides an icon in the status bar with a +

            A toast notification is a message that appears on the surface of the current window for only a +moment before disappearing. A status bar notification provides an icon in the status bar with a message, which the user can select in order to take an action (such as start an activity).

            -

            Usually, a status bar notification is the best technique when some background work has completed -(such as a file completed -downloading) and the user can now act on it. When the user selects the notification from the -expanded view, the notification can start an activity (such as to view the downloaded file).

            +

            Usually, a status bar notification is the best technique to use when background work such as +a file download has completed, and the user can now act on it. When the user +selects the notification from the expanded view, the notification can start an activity +(such as to display the downloaded file).

            See the Toast Notifications or Status Bar Notifications developer guides for more information.

            +

            Running a service in the foreground

            - -

            Running a Service in the Foreground

            - -

            A foreground service is a service that's considered to be something the -user is actively aware of and thus not a candidate for the system to kill when low on memory. A +

            A foreground service is a service that the +user is actively aware of and is not a candidate for the system to kill when low on memory. A foreground service must provide a notification for the status bar, which is placed under the -"Ongoing" heading, which means that the notification cannot be dismissed unless the service is -either stopped or removed from the foreground.

            +Ongoing heading. This means that the notification cannot be dismissed unless the service +is either stopped or removed from the foreground.

            For example, a music player that plays music from a service should be set to run in the foreground, because the user is explicitly aware @@ -643,9 +644,9 @@ of its operation. The notification in the status bar might indicate the current the user to launch an activity to interact with the music player.

            To request that your service run in the foreground, call {@link -android.app.Service#startForeground startForeground()}. This method takes two parameters: an integer -that uniquely identifies the notification and the {@link -android.app.Notification} for the status bar. For example:

            +android.app.Service#startForeground startForeground()}. This method takes two parameters: an +integer that uniquely identifies the notification and the {@link +android.app.Notification} for the status bar. Here is an example:

             Notification notification = new Notification(R.drawable.icon, getText(R.string.ticker_text),
            @@ -657,30 +658,27 @@ notification.setLatestEventInfo(this, getText(R.string.notification_title),
             startForeground(ONGOING_NOTIFICATION_ID, notification);
             
            -

            Caution: The integer ID you give to {@link +

            Caution: The integer ID that you give to {@link android.app.Service#startForeground startForeground()} must not be 0.

            -

            To remove the service from the foreground, call {@link -android.app.Service#stopForeground stopForeground()}. This method takes a boolean, indicating +android.app.Service#stopForeground stopForeground()}. This method takes a boolean, which indicates whether to remove the status bar notification as well. This method does not stop the -service. However, if you stop the service while it's still running in the foreground, then the +service. However, if you stop the service while it's still running in the foreground, the notification is also removed.

            For more information about notifications, see Creating Status Bar Notifications.

            +

            Managing the lifecycle of a service

            +

            The lifecycle of a service is much simpler than that of an activity. However, it's even more +important that you pay close attention to how your service is created and destroyed because a +service can run in the background without the user being aware.

            -

            Managing the Lifecycle of a Service

            - -

            The lifecycle of a service is much simpler than that of an activity. However, it's even more important -that you pay close attention to how your service is created and destroyed, because a service -can run in the background without the user being aware.

            - -

            The service lifecycle—from when it's created to when it's destroyed—can follow two -different paths:

            +

            The service lifecycle—from when it's created to when it's destroyed—can follow +either of these two paths:

            • A started service @@ -689,27 +687,26 @@ android.content.Context#startService startService()}. The service then runs inde stop itself by calling {@link android.app.Service#stopSelf() stopSelf()}. Another component can also stop the service by calling {@link android.content.Context#stopService -stopService()}. When the service is stopped, the system destroys it..

            • +stopService()}. When the service is stopped, the system destroys it.

            • A bound service

              The service is created when another component (a client) calls {@link android.content.Context#bindService bindService()}. The client then communicates with the service through an {@link android.os.IBinder} interface. The client can close the connection by calling {@link android.content.Context#unbindService unbindService()}. Multiple clients can bind to -the same service and when all of them unbind, the system destroys the service. (The service -does not need to stop itself.)

            • +the same service and when all of them unbind, the system destroys the service. The service +does not need to stop itself.

            -

            These two paths are not entirely separate. That is, you can bind to a service that was already -started with {@link android.content.Context#startService startService()}. For example, a background -music service could be started by calling {@link android.content.Context#startService +

            These two paths are not entirely separate. You can bind to a service that is already +started with {@link android.content.Context#startService startService()}. For example, you can +start a background music service by calling {@link android.content.Context#startService startService()} with an {@link android.content.Intent} that identifies the music to play. Later, possibly when the user wants to exercise some control over the player or get information about the current song, an activity can bind to the service by calling {@link -android.content.Context#bindService bindService()}. In cases like this, {@link +android.content.Context#bindService bindService()}. In cases such as this, {@link android.content.Context#stopService stopService()} or {@link android.app.Service#stopSelf -stopSelf()} does not actually stop the service until all clients unbind.

            - +stopSelf()} doesn't actually stop the service until all of the clients unbind.

            Implementing the lifecycle callbacks

            @@ -763,20 +760,30 @@ shows the lifecycle when the service is created with {@link android.content.Cont startService()} and the diagram on the right shows the lifecycle when the service is created with {@link android.content.Context#bindService bindService()}.

            -

            By implementing these methods, you can monitor two nested loops of the service's lifecycle:

            +

            Figure 2 illustrates the typical callback methods for a service. Although the figure separates +services that are created by {@link android.content.Context#startService startService()} from those +created by {@link android.content.Context#bindService bindService()}, keep +in mind that any service, no matter how it's started, can potentially allow clients to bind to it. +A service that was initially started with {@link android.app.Service#onStartCommand +onStartCommand()} (by a client calling {@link android.content.Context#startService startService()}) +can still receive a call to {@link android.app.Service#onBind onBind()} (when a client calls +{@link android.content.Context#bindService bindService()}).

            + +

            By implementing these methods, you can monitor these two nested loops of the service's +lifecycle:

              -
            • The entire lifetime of a service happens between the time {@link -android.app.Service#onCreate onCreate()} is called and the time {@link +
            • The entire lifetime of a service occurs between the time that {@link +android.app.Service#onCreate onCreate()} is called and the time that {@link android.app.Service#onDestroy} returns. Like an activity, a service does its initial setup in {@link android.app.Service#onCreate onCreate()} and releases all remaining resources in {@link -android.app.Service#onDestroy onDestroy()}. For example, a -music playback service could create the thread where the music will be played in {@link -android.app.Service#onCreate onCreate()}, then stop the thread in {@link +android.app.Service#onDestroy onDestroy()}. For example, a +music playback service can create the thread where the music is played in {@link +android.app.Service#onCreate onCreate()}, and then it can stop the thread in {@link android.app.Service#onDestroy onDestroy()}. -

              The {@link android.app.Service#onCreate onCreate()} and {@link android.app.Service#onDestroy -onDestroy()} methods are called for all services, whether +

              Note: The {@link android.app.Service#onCreate onCreate()} +and {@link android.app.Service#onDestroy onDestroy()} methods are called for all services, whether they're created by {@link android.content.Context#startService startService()} or {@link android.content.Context#bindService bindService()}.

            • @@ -784,8 +791,8 @@ android.content.Context#bindService bindService()}.

              android.app.Service#onStartCommand onStartCommand()} or {@link android.app.Service#onBind onBind()}. Each method is handed the {@link android.content.Intent} that was passed to either {@link android.content.Context#startService -startService()} or {@link android.content.Context#bindService bindService()}, respectively. -

              If the service is started, the active lifetime ends the same time that the entire lifetime +startService()} or {@link android.content.Context#bindService bindService()}. +

              If the service is started, the active lifetime ends at the same time that the entire lifetime ends (the service is still active even after {@link android.app.Service#onStartCommand onStartCommand()} returns). If the service is bound, the active lifetime ends when {@link android.app.Service#onUnbind onUnbind()} returns.

              @@ -795,26 +802,16 @@ android.app.Service#onUnbind onUnbind()} returns.

              Note: Although a started service is stopped by a call to either {@link android.app.Service#stopSelf stopSelf()} or {@link android.content.Context#stopService stopService()}, there is not a respective callback for the -service (there's no {@code onStop()} callback). So, unless the service is bound to a client, +service (there's no {@code onStop()} callback). Unless the service is bound to a client, the system destroys it when the service is stopped—{@link android.app.Service#onDestroy onDestroy()} is the only callback received.

              -

              Figure 2 illustrates the typical callback methods for a service. Although the figure separates -services that are created by {@link android.content.Context#startService startService()} from those -created by {@link android.content.Context#bindService bindService()}, keep -in mind that any service, no matter how it's started, can potentially allow clients to bind to it. -So, a service that was initially started with {@link android.app.Service#onStartCommand -onStartCommand()} (by a client calling {@link android.content.Context#startService startService()}) -can still receive a call to {@link android.app.Service#onBind onBind()} (when a client calls -{@link android.content.Context#bindService bindService()}).

              -

              For more information about creating a service that provides binding, see the Bound Services document, which includes more information about the {@link android.app.Service#onRebind onRebind()} callback method in the section about Managing the Lifecycle of -a Bound Service.

              - +href="{@docRoot}guide/components/bound-services.html#Lifecycle">Managing the lifecycle of +a bound service.

              -

              Nine-patch

              - -

              A {@link android.graphics.drawable.NinePatchDrawable} graphic is a stretchable bitmap -image, which Android - will automatically resize to accommodate the contents of the View in which you have -placed it as the background. - An example use of a NinePatch is the backgrounds used by standard Android buttons — - buttons must stretch to accommodate strings of various lengths. A NinePatch drawable is a -standard PNG - image that includes an extra 1-pixel-wide border. It must be saved with the extension - .9.png, - and saved into the res/drawable/ directory of your project. -

              -

              - The border is used to define the stretchable and static areas of - the image. You indicate a stretchable section by drawing one (or more) 1-pixel-wide - black line(s) in the left and top part of the border (the other border pixels should - be fully transparent or white). You can have as many stretchable sections as you want: - their relative size stays the same, so the largest sections always remain the largest. -

              -

              - You can also define an optional drawable section of the image (effectively, - the padding lines) by drawing a line on the right and bottom lines. - If a View object sets the NinePatch as its background and then specifies the - View's text, it will stretch itself so that all the text fits inside only - the area designated by the right and bottom lines (if included). If the - padding lines are not included, Android uses the left and top lines to - define this drawable area. -

              -

              To clarify the difference between the different lines, the left and top lines define - which pixels of the image are allowed to be replicated in order to stretch the image. - The bottom and right lines define the relative area within the image that the contents - of the View are allowed to lie within.

              -

              - Here is a sample NinePatch file used to define a button: -

              - - -

              This NinePatch defines one stretchable area with the left and top lines - and the drawable area with the bottom and right lines. In the top image, the dotted grey - lines identify the regions of the image that will be replicated in order to stretch the -image. The pink - rectangle in the bottom image identifies the region in which the contents of the View are -allowed. - If the contents don't fit in this region, then the image will be stretched so that they -do. +

              Nine-patch

              + +

              + A {@link android.graphics.drawable.NinePatchDrawable} graphic is a + stretchable bitmap image, which Android will automatically resize to + accommodate the contents of the View in which you have placed it as the + background. An example use of a NinePatch is the backgrounds used by + standard Android buttons — buttons must stretch to accommodate strings of + various lengths. A NinePatch drawable is a standard PNG image that includes + an extra 1-pixel-wide border. It must be saved with the extension + .9.png, and saved into the res/drawable/ directory + of your project.

              -

              The Draw 9-patch tool offers - an extremely handy way to create your NinePatch images, using a WYSIWYG graphics editor. It -even raises warnings if the region you've defined for the stretchable area is at risk of -producing drawing artifacts as a result of the pixel replication. +

              + The border is used to define the stretchable and static areas of the image. + You indicate a stretchable section by drawing one (or more) 1-pixel-wide + black line(s) in the left and top part of the border (the other border + pixels should be fully transparent or white). You can have as many + stretchable sections as you want: their relative size stays the same, so the + largest sections always remain the largest. +

              + +

              + You can also define an optional drawable section of the image (effectively, + the padding lines) by drawing a line on the right and bottom lines. If a + View object sets the NinePatch as its background and then specifies the + View's text, it will stretch itself so that all the text fits inside only + the area designated by the right and bottom lines (if included). If the + padding lines are not included, Android uses the left and top lines to + define this drawable area. +

              + +

              + To clarify the difference between the different lines, the left and top + lines define which pixels of the image are allowed to be replicated in order + to stretch the image. The bottom and right lines define the relative area + within the image that the contents of the View are allowed to lie within. +

              + +

              + Here is a sample NinePatch file used to define a button: +

              + +

              + This NinePatch defines one stretchable area with the left and top lines and + the drawable area with the bottom and right lines. In the top image, the + dotted grey lines identify the regions of the image that will be replicated + in order to stretch the image. The pink rectangle in the bottom image + identifies the region in which the contents of the View are allowed. If the + contents don't fit in this region, then the image will be stretched so that + they do. +

              + +

              + The Draw 9-patch tool + offers an extremely handy way to create your NinePatch images, using a + WYSIWYG graphics editor. It even raises warnings if the region you've + defined for the stretchable area is at risk of producing drawing artifacts + as a result of the pixel replication.

              Example XML

              @@ -516,3 +525,265 @@ stretches to accommodate it.

              + +

              + Vector Drawables +

              + +

              + A {@link android.graphics.drawable.VectorDrawable} graphic replaces multiple + PNG assets with a single vector graphic. The vector graphic is defined in an + XML file as a set of points, lines, and curves along with its associated + color information. +

              + +

              + The major advantage of using a vector graphic is image scalability. Using + vector graphics resizes the same file for different screen densities without + loss of image quality. This results in smaller APK files and less developer + maintenance. You can also use vector images for animation by using multiple + XML files instead of multiple images for each display resolution. +

              + +

              + Let's go through an example to understand the benefits. An image of size 100 + x 100 dp may render good quality on a smaller display resolution. On larger + devices, the app might want to use a 400 x 400 dp version of the image. + Normally, developers create multiple versions of an asset to cater to + different screen densities. This approach consumes more development efforts, + and results in a larger APK, which takes more space on the device. +

              + +

              + As of Android 5.0 (API level 21), there are two classes that support vector + graphics as a drawable resource: {@link + android.graphics.drawable.VectorDrawable} and {@link + android.graphics.drawable.AnimatedVectorDrawable}. For more information + about using the VectorDrawable and the AnimatedVectorDrawable classes, read + the About VectorDrawable class and + About AnimatedVectorDrawable + class sections. +

              + +

              About VectorDrawable class

              +

              + {@link android.graphics.drawable.VectorDrawable} defines a static drawable + object. Similar to the SVG format, each vector graphic is defined as a tree + hierachy, which is made up of path and group objects. + Each path contains the geometry of the object's outline and + group contains details for transformation. All paths are drawn + in the same order as they appear in the XML file. +

              + + +

              + Figure 1. Sample hierarchy of a vector drawable asset +

              + + +

              + The Vector Asset + Studio tool offers a simple way to add a vector graphic to the project + as an XML file. +

              + +

              + Example XML +

              + +

              + Here is a sample VectorDrawable XML file that renders an image + of a battery in the charging mode. +

              + +
              +<!-- res/drawable/battery_charging.xml -->
              +<vector xmlns:android="http://schemas.android.com/apk/res/android"
              +    <!-- intrinsic size of the drawable -->
              +    android:height="24dp"
              +    android:width="24dp"
              +    <!-- size of the virtual canvas -->
              +    android:viewportWidth="24.0"
              +    android:viewportHeight="24.0">
              +   <group
              +         android:name="rotationGroup"
              +         android:pivotX="10.0"
              +         android:pivotY="10.0"
              +         android:rotation="15.0" >
              +      <path
              +        android:name="vect"
              +        android:fillColor="#FF000000"
              +        android:pathData="M15.67,4H14V2h-4v2H8.33C7.6,4 7,4.6 7,5.33V9h4.93L13,7v2h4V5.33C17,4.6 16.4,4 15.67,4z"
              +        android:fillAlpha=".3"/>
              +      <path
              +        android:name="draw"
              +        android:fillColor="#FF000000"
              +        android:pathData="M13,12.5h2L11,20v-5.5H9L11.93,9H7v11.67C7,21.4 7.6,22 8.33,22h7.33c0.74,0 1.34,-0.6 1.34,-1.33V9h-4v3.5z"/>
              +   </group>
              +</vector>
              +
              + +

              This XML renders the following image: +

              + + + +

              + About AnimatedVectorDrawable class +

              + +

              + {@link android.graphics.drawable.AnimatedVectorDrawable + AnimatedVectorDrawable} adds animation to the properties of a vector + graphic. You can define an animated vector graphic as three separate + resource files or as a single XML file defining the entire drawable. Let's + look at both the approaches for better understanding: Multiple XML files and Single + XML file. +

              + +

              + Multiple XML files +

              +

              + By using this approach, you can define three separate XML files: + +

                +
              • A {@link android.graphics.drawable.VectorDrawable} XML file. +
              • + +
              • + An {@link android.graphics.drawable.AnimatedVectorDrawable} XML file that +defines the target {@link android.graphics.drawable.VectorDrawable}, the +target paths and groups to animate, the properties, and the animations defined +as {@link android.animation.ObjectAnimator ObjectAnimator} objects or {@link +android.animation.AnimatorSet AnimatorSet} objects. +
              • + +
              • An animator XML file. +
              • +
              +

              + +
              + Example of multiple XML files +
              +

              + The following XML files demonstrate the animation of a vector graphic. + +

                +
              • VectorDrawable's XML file: vd.xml +
              • + +
              • +
                +<vector xmlns:android="http://schemas.android.com/apk/res/android"
                +   android:height="64dp"
                +   android:width="64dp"
                +   android:viewportHeight="600"
                +   android:viewportWidth="600" >
                +   <group
                +      android:name="rotationGroup"
                +      android:pivotX="300.0"
                +      android:pivotY="300.0"
                +      android:rotation="45.0" >
                +      <path
                +         android:name="vectorPath"
                +         android:fillColor="#000000"
                +         android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" />
                +   </group>
                +</vector>
                +
                +
              • + +
              • AnimatedVectorDrawable's XML file: avd.xml +
              • + +
              • +
                +<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
                +   android:drawable="@drawable/vd" >
                +     <target
                +         android:name="rotationGroup"
                +         android:animation="@anim/rotation" />
                +     <target
                +         android:name="vectorPath"
                +         android:animation="@anim/path_morph" />
                +</animated-vector>
                +
                +
              • + +
              • Animator XML files that are used in the AnimatedVectorDrawable's XML + file: rotation.xml and path_morph.xml +
              • + +
              • +
                +<objectAnimator
                +   android:duration="6000"
                +   android:propertyName="rotation"
                +   android:valueFrom="0"
                +   android:valueTo="360" />
                +
                + +
                +<set xmlns:android="http://schemas.android.com/apk/res/android">
                +   <objectAnimator
                +      android:duration="3000"
                +      android:propertyName="pathData"
                +      android:valueFrom="M300,70 l 0,-70 70,70 0,0   -70,70z"
                +      android:valueTo="M300,70 l 0,-70 70,0  0,140 -70,0 z"
                +      android:valueType="pathType"/>
                +</set>
                +
                +
              • +
              +

              +

              + Single XML file +

              + +

              + By using this approach, you can merge the related XML files into a single + XML file through the XML Bundle Format. At the time of building the app, the + aapt tag creates separate resources and references them in the + animated vector. This approach requires Build Tools 24 or higher, and the + output is backward compatible. +

              + +
              + Example of a single XML file +
              +
              +<animated-vector
              +    xmlns:android="http://schemas.android.com/apk/res/android"
              +    xmlns:aapt="http://schemas.android.com/aapt">
              +    <aapt:attr name="android:drawable">
              +        <vector
              +            android:width="24dp"
              +            android:height="24dp"
              +            android:viewportWidth="24"
              +            android:viewportHeight="24">
              +            <path
              +                android:name="root"
              +                android:strokeWidth="2"
              +                android:strokeLineCap="square"
              +                android:strokeColor="?android:colorControlNormal"
              +                android:pathData="M4.8,13.4 L9,17.6 M10.4,16.2 L19.6,7" />
              +        </vector>
              +    </aapt:attr>
              +    <target android:name="root">
              +        <aapt:attr name="android:animation">
              +            <objectAnimator
              +                android:propertyName="pathData"
              +                android:valueFrom="M4.8,13.4 L9,17.6 M10.4,16.2 L19.6,7"
              +                android:valueTo="M6.4,6.4 L17.6,17.6 M6.4,17.6 L17.6,6.4"
              +                android:duration="300"
              +                android:interpolator="@android:interpolator/fast_out_slow_in"
              +                android:valueType="pathType" />
              +        </aapt:attr>
              +    </target>
              +</animated-vector>
              +
              \ No newline at end of file diff --git a/docs/html/guide/topics/location/strategies.jd b/docs/html/guide/topics/location/strategies.jd index 2dfed2ce6e8e4070b892ad9a6bd3abe7a989ad9a..548ed9c99f34b04340e6999e3bbdeb1d1b3c3f6f 100755 --- a/docs/html/guide/topics/location/strategies.jd +++ b/docs/html/guide/topics/location/strategies.jd @@ -133,36 +133,69 @@ notifications and the third is the minimum change in distance between notificati both to zero requests location notifications as frequently as possible. The last parameter is your {@link android.location.LocationListener}, which receives callbacks for location updates.

              -

              To request location updates from the GPS provider, -substitute GPS_PROVIDER for NETWORK_PROVIDER. You can also request -location updates from both the GPS and the Network Location Provider by calling {@link -android.location.LocationManager#requestLocationUpdates requestLocationUpdates()} twice—once -for NETWORK_PROVIDER and once for GPS_PROVIDER.

              +

              To request location updates from the GPS provider, use {@link +android.location.LocationManager#GPS_PROVIDER} instead of {@link +android.location.LocationManager#NETWORK_PROVIDER}. You can also request +location updates from both the GPS and the Network Location Provider by calling +{@link android.location.LocationManager#requestLocationUpdates +requestLocationUpdates()} twice—once for {@link +android.location.LocationManager#NETWORK_PROVIDER} and once for {@link +android.location.LocationManager#GPS_PROVIDER}.

              Requesting User Permissions

              -

              In order to receive location updates from NETWORK_PROVIDER or -GPS_PROVIDER, you must request user permission by declaring either the {@code -ACCESS_COARSE_LOCATION} or {@code ACCESS_FINE_LOCATION} permission, respectively, in your Android -manifest file. For example:

              +

              + In order to receive location updates from {@link + android.location.LocationManager#NETWORK_PROVIDER} or {@link + android.location.LocationManager#GPS_PROVIDER}, you must request the user's + permission by declaring either the {@code ACCESS_COARSE_LOCATION} or {@code + ACCESS_FINE_LOCATION} permission, respectively, in your Android manifest file. + Without these permissions, your application will fail at runtime when + requesting location updates. +

              + +

              + If you are using both {@link + android.location.LocationManager#NETWORK_PROVIDER} and {@link + android.location.LocationManager#GPS_PROVIDER}, then you need to request only + the {@code ACCESS_FINE_LOCATION} permission, because it includes permission + for both providers. Permission for {@code ACCESS_COARSE_LOCATION} allows + access only to {@link android.location.LocationManager#NETWORK_PROVIDER}. +

              + +

              + Caution: If your app targets Android 5.0 (API level 21) or + higher, you must declare that your app uses the + android.hardware.location.network or + android.hardware.location.gps hardware feature in the manifest + file, depending on whether your app receives location updates from {@link + android.location.LocationManager#NETWORK_PROVIDER} or from {@link + android.location.LocationManager#GPS_PROVIDER}. If your app receives location + information from either of these location provider sources, you need to + declare that the app uses these hardware features in your app manifest. + On devices running verions prior to Android 5.0 (API 21), requesting the + {@code ACCESS_FINE_LOCATION} or {@code ACCESS_COARSE_LOCATION} permission + includes an implied request for location hardware features. However, + requesting those permissions does not automatically request location + hardware features on Android 5.0 (API level 21) and higher. +

              +

              + The following code sample demonstrates how to declare the permission and + hardware feature in the manifest file of an app that reads data from the + device's GPS: +

               <manifest ... >
                   <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
                   ...
              +    <!-- Needed only if your app targets Android 5.0 (API level 21) or higher. -->
              +    <uses-feature android:name="android.hardware.location.gps" />
              +    ...
               </manifest>
               
              -

              Without these permissions, your application will fail at runtime when requesting -location updates.

              - -

              Note: If you are using both NETWORK_PROVIDER and -GPS_PROVIDER, then you need to request only the {@code ACCESS_FINE_LOCATION} -permission, because it includes permission for both providers. (Permission for {@code -ACCESS_COARSE_LOCATION} includes permission only for NETWORK_PROVIDER.)

              - -

              Defining a Model for the Best Performance

              Location-based applications are now commonplace, but due to the less than optimal @@ -404,9 +437,10 @@ don't have a device, you can still test your location-based features by mocking the Android emulator. There are three different ways to send your application mock location data: using Android Studio, DDMS, or the "geo" command in the emulator console.

              -

              Note: Providing mock location data is injected as GPS location -data, so you must request location updates from GPS_PROVIDER in order for mock location -data to work.

              +

              Note: Providing mock location data is injected +as GPS location data, so you must request location updates from {@link +android.location.LocationManager#GPS_PROVIDER} in order for mock location data +to work.

              Using Android Studio

              diff --git a/docs/html/guide/topics/manifest/meta-data-element.jd b/docs/html/guide/topics/manifest/meta-data-element.jd index 945b116dbe5a1c5332385ca0ce95bade3c7459af..2d1bdfe59259c8b4be0f614ce446297f3796c9ef 100644 --- a/docs/html/guide/topics/manifest/meta-data-element.jd +++ b/docs/html/guide/topics/manifest/meta-data-element.jd @@ -60,7 +60,7 @@ Java-style naming convention — for example,
              {@code android:resource}
              A reference to a resource. The ID of the resource is the value assigned to the item. The ID can be retrieved from the meta-data Bundle by the -{@link android.os.BaseBundle#getInt Bundle.getInt()} method.
              +{@link android.os.Bundle#getInt Bundle.getInt()} method.
            {@code android:value}
            The value assigned to the item. The data types that can be assigned as values and the Bundle methods that components use to retrieve those values are listed in the following table: @@ -72,17 +72,17 @@ to the item. The ID can be retrieved from the meta-data Bundle by the String value, using double backslashes ({@code \\}) to escape characters — such as "{@code \\n}" and "{@code \\uxxxxx}" for a Unicode character. - {@link android.os.BaseBundle#getString(String) getString()} + {@link android.os.Bundle#getString(String) getString()} Integer value, such as "{@code 100}" - {@link android.os.BaseBundle#getInt(String) getInt()} + {@link android.os.Bundle#getInt(String) getInt()} Boolean value, either "{@code true}" or "{@code false}" - {@link android.os.BaseBundle#getBoolean(String) getBoolean()} + {@link android.os.Bundle#getBoolean(String) getBoolean()} Color value, in the form "{@code #rgb}", "{@code #argb}", "{@code #rrggbb}", or "{@code #aarrggbb}" - {@link android.os.BaseBundle#getInt(String) getInt()} + {@link android.os.Bundle#getInt(String) getInt()} Float value, such as "{@code 1.23}" {@link android.os.Bundle#getFloat(String) getFloat()} diff --git a/docs/html/guide/topics/manifest/provider-element.jd b/docs/html/guide/topics/manifest/provider-element.jd index 1947849e56f83f494be2a6a01f18d27de0a1a4d3..0e729c36f37e6db901f435d98253dcfaa518a2f7 100644 --- a/docs/html/guide/topics/manifest/provider-element.jd +++ b/docs/html/guide/topics/manifest/provider-element.jd @@ -215,17 +215,15 @@ it can also be set as a raw string.

            {@code android:multiprocess}
            -
            Whether or not an instance of the content provider can be created in -every client process — "{@code true}" if instances can run in multiple -processes, and "{@code false}" if not. The default value is "{@code false}". - -

            -Normally, a content provider is instantiated in the process of the -application that defined it. However, if this flag is set to "{@code true}", -the system can create an instance in every process where there's a client -that wants to interact with it, thus avoiding the overhead of interprocess -communication. -

            +
            If the app runs in multiple processes, this attribute determines whether +multiple instances of the content provder are created. If true, +each of the app's processes has its own content provider object. If +false, the app's processes share only one content provider object. +The default value is false. + +

            Setting this flag to true may improve performance by reducing +the overhead of interprocess communication, but it also increases the memory +footprint of each process.

            {@code android:name}
            The name of the class that implements the content provider, a subclass of diff --git a/docs/html/guide/topics/manifest/receiver-element.jd b/docs/html/guide/topics/manifest/receiver-element.jd index 800ee8a6e4c755ea444162abde10662444d68cd7..c866047447e08f56f5432e9665aa8b8ac8029b67 100644 --- a/docs/html/guide/topics/manifest/receiver-element.jd +++ b/docs/html/guide/topics/manifest/receiver-element.jd @@ -33,8 +33,18 @@ There are two ways to make a broadcast receiver known to the system: One is declare it in the manifest file with this element. The other is to create the receiver dynamically in code and register it with the {@link android.content.Context#registerReceiver Context.registerReceiver()} -method. See the {@link android.content.BroadcastReceiver} class description -for more on dynamically created receivers. +method. For more information about how to dynamically create receivers, see the +{@link android.content.BroadcastReceiver} class description. +

            + +

            + Warning: Limit how many broadcast + receivers you set in your app. Having too many broadcast receivers can + affect your app's performance and the battery life of users' devices. + For more information about APIs you can use instead of the + {@link android.content.BroadcastReceiver} class for scheduling background + work, see + Background Optimizations.

            attributes:
            diff --git a/docs/html/guide/topics/manifest/uses-feature-element.jd b/docs/html/guide/topics/manifest/uses-feature-element.jd index 9b32244b736f92530e8781f4a7fc1179f4d7b2fe..843fe1c863f97b9803c5fd905e396a1de64cf49f 100755 --- a/docs/html/guide/topics/manifest/uses-feature-element.jd +++ b/docs/html/guide/topics/manifest/uses-feature-element.jd @@ -512,10 +512,11 @@ You can find your unsigned .apk in the
          21. Next, locate the aapt tool, if it is not already in your PATH. If you are using SDK Tools r8 or higher, you can find aapt in the -<SDK>/platform-tools/ directory. +<SDK>/build-tools/<tools version number> +directory.

            Note: You must use the version of -aapt that is provided for the latest Platform-Tools component available. If -you do not have the latest Platform-Tools component, download it using the aapt that is provided for the latest Build-Tools component available. If +you do not have the latest Build-Tools component, download it using the Android SDK Manager.

          22. Run aapt using this syntax:
          23. @@ -1666,6 +1667,15 @@ densities: '160'
            <uses-feature android:name="android.hardware.camera" android:required="false" />
            +

            + Caution: If your app targets Android 5.0 (API level 21) or + higher and uses the ACCESS_COARSE_LOCATION or + ACCESS_FINE_LOCATION permission in order to receive location + updates from the network or a GPS, respectively, you must also explicitly + declare that your app uses the android.hardware.location.network + or android.hardware.location.gps hardware features. +

            +

            Table 2. Device permissions that imply device hardware use.

            @@ -1717,14 +1727,29 @@ densities: '160' ACCESS_COARSE_LOCATION - android.hardware.location.network and -
            android.hardware.location + +

            + android.hardware.location +

            +

            + android.hardware.location.network + (Only when target API level is 20 or lower.) +

            + ACCESS_FINE_LOCATION - android.hardware.location.gps and -
            android.hardware.location + +

            + android.hardware.location +

            +

            + android.hardware.location.gps + (Only when target API level is 20 or lower.) +

            + + diff --git a/docs/html/guide/topics/media/camera.jd b/docs/html/guide/topics/media/camera.jd index 4995a13dda91e16011b86765866f4cd60d89b8ca..383b6c1f32ca563b4e1885ea6f7e32dc0e377164 100644 --- a/docs/html/guide/topics/media/camera.jd +++ b/docs/html/guide/topics/media/camera.jd @@ -154,10 +154,16 @@ application must request the audio capture permission. <uses-permission android:name="android.permission.RECORD_AUDIO" />
          24. -
          25. Location Permission - If your application tags images with GPS location -information, you must request location permission: +
          26. +

            Location Permission - If your application tags images + with GPS location information, you must request the {@code ACCESS_FINE_LOCATION} + permission. Note that, if your app targets Android 5.0 (API level 21) or + higher, you also need to declare that your app uses the device's GPS:

             <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
            +...
            +<!-- Needed only if your app targets Android 5.0 (API level 21) or higher. -->
            +<uses-feature android:name="android.hardware.location.gps" />
             

            For more information about getting user location, see Location Strategies.

            diff --git a/docs/html/guide/topics/providers/calendar-provider.jd b/docs/html/guide/topics/providers/calendar-provider.jd index 01a1bfcd9e1c161fef801a441f98e5d73e7d8469..485f3c1676305a8dc01379ceb8bef968b305bf36 100644 --- a/docs/html/guide/topics/providers/calendar-provider.jd +++ b/docs/html/guide/topics/providers/calendar-provider.jd @@ -278,9 +278,9 @@ private static final int PROJECTION_OWNER_ACCOUNT_INDEX = 3; @@ -21,9 +22,12 @@ page.tags=switch,togglebutton

            A toggle button allows the user to change a setting between two states.

            -

            You can add a basic toggle button to your layout with the {@link android.widget.ToggleButton} -object. Android 4.0 (API level 14) introduces another kind of toggle button called a switch that -provides a slider control, which you can add with a {@link android.widget.Switch} object.

            +

            You can add a basic toggle button to your layout with the +{@link android.widget.ToggleButton} object. Android 4.0 (API level 14) +introduces another kind of toggle button called a switch that provides a slider +control, which you can add with a {@link android.widget.Switch} object. +{@link android.support.v7.widget.SwitchCompat} is a version of the Switch +widget which runs on devices back to API 7.

            If you need to change a button's state yourself, you can use the {@link diff --git a/docs/html/guide/topics/ui/declaring-layout.jd b/docs/html/guide/topics/ui/declaring-layout.jd index ecdcfdc69ae162ea24e929467355efec9d0b1450..bf0db576cf2ebea27a644551669f700b5ba0e933 100755 --- a/docs/html/guide/topics/ui/declaring-layout.jd +++ b/docs/html/guide/topics/ui/declaring-layout.jd @@ -423,7 +423,7 @@ ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,

          27. The string array
          28. Then simply call -{@link android.widget.AdapterView#setAdapter setAdapter()} on your {@link android.widget.ListView}:

            +{@link android.widget.ListView#setAdapter setAdapter()} on your {@link android.widget.ListView}:

             ListView listView = (ListView) findViewById(R.id.listview);
             listView.setAdapter(adapter);
            diff --git a/docs/html/guide/topics/ui/dialogs.jd b/docs/html/guide/topics/ui/dialogs.jd
            index 52cd1a03c38e82dc340f2778813135a5993ffd29..7ab4ca552b4d59a5f499cf43d3bc973ef442fa64 100644
            --- a/docs/html/guide/topics/ui/dialogs.jd
            +++ b/docs/html/guide/topics/ui/dialogs.jd
            @@ -643,7 +643,7 @@ android.support.v4.app.Fragment}.

            or other {@link android.app.Dialog} objects to build the dialog in this case. If you want the {@link android.support.v4.app.DialogFragment} to be embeddable, you must define the dialog's UI in a layout, then load the layout in the -{@link android.support.v4.app.Fragment#onCreateView +{@link android.support.v4.app.DialogFragment#onCreateView onCreateView()} callback.

            Here's an example {@link android.support.v4.app.DialogFragment} that can appear as either a diff --git a/docs/html/guide/topics/ui/drag-drop.jd b/docs/html/guide/topics/ui/drag-drop.jd index 8871c87f4f2585bd43bd5b7b204847944852ceaf..8e4297f8ce1b738950e58b18bb141965ffd287e5 100644 --- a/docs/html/guide/topics/ui/drag-drop.jd +++ b/docs/html/guide/topics/ui/drag-drop.jd @@ -152,7 +152,7 @@ DraggableDot.java in

            The user releases the drag shadow within the bounding box of a View that can accept the - data. The system sends the View object's listener a drag event with action type + data, but not within its descendant view that can accept the data. The system sends the View + object's listener a drag event with action type {@link android.view.DragEvent#ACTION_DROP}. The drag event contains the data that was passed to the system in the call to {@link android.view.View#startDrag(ClipData,View.DragShadowBuilder,Object,int) startDrag()} @@ -317,6 +318,10 @@ DraggableDot.java in A View object's drag event listener receives this event action type when the drag shadow has just entered the bounding box of the View. This is the first event action type the - listener receives when the drag shadow enters the bounding box. If the listener wants to - continue receiving drag events for this operation, it must return boolean - true to the system. + listener receives when the drag shadow enters the bounding box. @@ -334,7 +337,8 @@ DraggableDot.java in @@ -395,7 +400,7 @@ DraggableDot.java in X X X -   + X     @@ -711,8 +716,7 @@ imageView.setOnLongClickListener(new View.OnLongClickListener() { If the listener can accept a drop, it should return true. This tells the system to continue to send drag events to the listener. If it can't accept a drop, it should return false, and the system - will stop sending drag events until it sends out - {@link android.view.DragEvent#ACTION_DRAG_ENDED}. + will stop sending drag events for the current drag operation.

          @@ -754,7 +758,8 @@ imageView.setOnLongClickListener(new View.OnLongClickListener() {

        1. {@link android.view.DragEvent#ACTION_DRAG_EXITED}: This event is sent to a listener that previously received {@link android.view.DragEvent#ACTION_DRAG_ENTERED}, after - the drag shadow is no longer within the bounding box of the listener's View. + the drag shadow is no longer within the bounding box of the listener's View or it's within + the bounding box of a descendant view that can accept the data.
        2. diff --git a/docs/html/guide/topics/ui/layout/gridview.jd b/docs/html/guide/topics/ui/layout/gridview.jd index 4ed6ff55efa31bfe92708ebd8d0203fb0aea0d82..13467ae17245b2771e1e972ec0beb2f00d8c671b 100644 --- a/docs/html/guide/topics/ui/layout/gridview.jd +++ b/docs/html/guide/topics/ui/layout/gridview.jd @@ -81,7 +81,7 @@ public void onCreate(Bundle savedInstanceState) {

          After the {@code main.xml} layout is set for the content view, the {@link android.widget.GridView} is captured from the layout with {@link android.app.Activity#findViewById(int)}. The {@link -android.widget.AdapterView#setAdapter(T) setAdapter()} method then sets a custom adapter ({@code +android.widget.GridView#setAdapter(T) setAdapter()} method then sets a custom adapter ({@code ImageAdapter}) as the source for all items to be displayed in the grid. The {@code ImageAdapter} is created in the next step.

          To do something when an item in the grid is clicked, the {@link @@ -170,7 +170,7 @@ the height and width for the View—this ensures that, no matter the size of image is resized and cropped to fit in these dimensions, as appropriate.

        3. {@link android.widget.ImageView#setScaleType(ImageView.ScaleType)} declares that images should be cropped toward the center (if necessary).
        4. -
        5. {@link android.view.View#setPadding(int,int,int,int)} defines the padding for all +
        6. {@link android.widget.ImageView#setPadding(int,int,int,int)} defines the padding for all sides. (Note that, if the images have different aspect-ratios, then less padding will cause more cropping of the image if it does not match the dimensions given to the ImageView.)
        7. diff --git a/docs/html/guide/topics/ui/menus.jd b/docs/html/guide/topics/ui/menus.jd index 38f6e21bef269f764c40a175833980f2b6d61006..3325c0e8b1206353e0c75e24cb35941814ce5609 100644 --- a/docs/html/guide/topics/ui/menus.jd +++ b/docs/html/guide/topics/ui/menus.jd @@ -682,7 +682,7 @@ listView.setMultiChoiceModeListener(new MultiChoiceModeListener() {

          That's it. Now when the user selects an item with a long-click, the system calls the {@link -android.view.ActionMode.Callback#onCreateActionMode onCreateActionMode()} +android.widget.AbsListView.MultiChoiceModeListener#onCreateActionMode onCreateActionMode()} method and displays the contextual action bar with the specified actions. While the contextual action bar is visible, users can select additional items.

          diff --git a/docs/html/guide/topics/ui/multi-window.jd b/docs/html/guide/topics/ui/multi-window.jd index dede557ecc9a703ec663625d9d9a41d1d14b0fb6..bab582dd0b8c3c1d0b496e12c74b868091429a4d 100644 --- a/docs/html/guide/topics/ui/multi-window.jd +++ b/docs/html/guide/topics/ui/multi-window.jd @@ -215,7 +215,7 @@ android:resizeableActivity=["true" | "false"] Set this attribute in your manifest's
          <activity> node to indicate whether the activity supports Picture-in-Picture + "{@docRoot}training/tv/playback/picture-in-picture.html">Picture-in-Picture display. This attribute is ignored if android:resizeableActivity is false.

          diff --git a/docs/html/images/brand/android_logo_no.png b/docs/html/images/brand/android_logo_no.png index 8de22d87d9a25340539ec04e8d22c0f2f59a7b56..946bc49a4c784272ffc92d3582e2c3209f205b53 100644 Binary files a/docs/html/images/brand/android_logo_no.png and b/docs/html/images/brand/android_logo_no.png differ diff --git a/docs/html/images/brand/android_logo_no_2x.png b/docs/html/images/brand/android_logo_no_2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8434c795ab799485f599e56413519607367ba1f4 Binary files /dev/null and b/docs/html/images/brand/android_logo_no_2x.png differ diff --git a/docs/html/images/cards/distribute/stories/animoca.jpg b/docs/html/images/cards/distribute/stories/animoca.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1886bcef0268252f608c4dfd3c678d1ff86509ce Binary files /dev/null and b/docs/html/images/cards/distribute/stories/animoca.jpg differ diff --git a/docs/html/images/cards/distribute/stories/drupe.jpg b/docs/html/images/cards/distribute/stories/drupe.jpg new file mode 100644 index 0000000000000000000000000000000000000000..52956956744c4da0bb3feddf08b91d5604f94bf0 Binary files /dev/null and b/docs/html/images/cards/distribute/stories/drupe.jpg differ diff --git a/docs/html/images/cards/distribute/stories/economist-espresso.png b/docs/html/images/cards/distribute/stories/economist-espresso.png new file mode 100644 index 0000000000000000000000000000000000000000..923bf5769d3fd04ade4971cac40b9d472a5b2c7e Binary files /dev/null and b/docs/html/images/cards/distribute/stories/economist-espresso.png differ diff --git a/docs/html/images/cards/distribute/stories/expressen-sport.png b/docs/html/images/cards/distribute/stories/expressen-sport.png new file mode 100644 index 0000000000000000000000000000000000000000..842ed3da77a8082bca7b2939e3954a6d4be95b52 Binary files /dev/null and b/docs/html/images/cards/distribute/stories/expressen-sport.png differ diff --git a/docs/html/images/cards/distribute/stories/glamour.png b/docs/html/images/cards/distribute/stories/glamour.png new file mode 100644 index 0000000000000000000000000000000000000000..770b03fc7df5fad88f83fda2a42b5b9817e6bd21 Binary files /dev/null and b/docs/html/images/cards/distribute/stories/glamour.png differ diff --git a/docs/html/images/cards/distribute/stories/happylabs-logo.png b/docs/html/images/cards/distribute/stories/happylabs-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ea20e71a6ed6caad9deb6f651b332e1608ddafde Binary files /dev/null and b/docs/html/images/cards/distribute/stories/happylabs-logo.png differ diff --git a/docs/html/images/cards/distribute/stories/lifesum.png b/docs/html/images/cards/distribute/stories/lifesum.png new file mode 100644 index 0000000000000000000000000000000000000000..3975ff260ed4f6eada0a2c95fc02ca8963920569 Binary files /dev/null and b/docs/html/images/cards/distribute/stories/lifesum.png differ diff --git a/docs/html/images/cards/distribute/stories/noom.jpg b/docs/html/images/cards/distribute/stories/noom.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dde18a21e417e9a99fa9a4be1e49fce2dce85da6 Binary files /dev/null and b/docs/html/images/cards/distribute/stories/noom.jpg differ diff --git a/docs/html/images/cards/distribute/stories/playlab.jpg b/docs/html/images/cards/distribute/stories/playlab.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3b641e63871de7c56d51df3434c0b447c0713e85 Binary files /dev/null and b/docs/html/images/cards/distribute/stories/playlab.jpg differ diff --git a/docs/html/images/develop/hero-layout-editor.png b/docs/html/images/develop/hero-layout-editor.png new file mode 100644 index 0000000000000000000000000000000000000000..195150e77c191aad1a3de80c6f022f77b3929d64 Binary files /dev/null and b/docs/html/images/develop/hero-layout-editor.png differ diff --git a/docs/html/images/develop/hero-layout-editor_2x.png b/docs/html/images/develop/hero-layout-editor_2x.png new file mode 100644 index 0000000000000000000000000000000000000000..60c3d2415a079c8eb78b47b750dd1f90d7d510ac Binary files /dev/null and b/docs/html/images/develop/hero-layout-editor_2x.png differ diff --git a/docs/html/images/distribute/stories/animoca-flow.jpg b/docs/html/images/distribute/stories/animoca-flow.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d2aa2f692edf8f1a73ccdd51edcd86407d48b0bb Binary files /dev/null and b/docs/html/images/distribute/stories/animoca-flow.jpg differ diff --git a/docs/html/images/distribute/stories/animoca-graph.jpg b/docs/html/images/distribute/stories/animoca-graph.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c2a42f436d48d2cd084811e1c4b620ed236b7896 Binary files /dev/null and b/docs/html/images/distribute/stories/animoca-graph.jpg differ diff --git a/docs/html/images/distribute/stories/animoca-logo.png b/docs/html/images/distribute/stories/animoca-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4b5b6b53c7502bed66a126907f805a202f78b306 Binary files /dev/null and b/docs/html/images/distribute/stories/animoca-logo.png differ diff --git a/docs/html/images/distribute/stories/drupe-icon.png b/docs/html/images/distribute/stories/drupe-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1b75ccae83189d984e8e049709676a46143fbfe5 Binary files /dev/null and b/docs/html/images/distribute/stories/drupe-icon.png differ diff --git a/docs/html/images/distribute/stories/drupe-screenshot.png b/docs/html/images/distribute/stories/drupe-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..6fd4445348e8f60af4141155a56246e0aa82fb61 Binary files /dev/null and b/docs/html/images/distribute/stories/drupe-screenshot.png differ diff --git a/docs/html/images/distribute/stories/economist-espresso-icon.png b/docs/html/images/distribute/stories/economist-espresso-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..923bf5769d3fd04ade4971cac40b9d472a5b2c7e Binary files /dev/null and b/docs/html/images/distribute/stories/economist-espresso-icon.png differ diff --git a/docs/html/images/distribute/stories/expressen-icon.png b/docs/html/images/distribute/stories/expressen-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4547ce77576040febf73a5b60ce940db49435bbf Binary files /dev/null and b/docs/html/images/distribute/stories/expressen-icon.png differ diff --git a/docs/html/images/distribute/stories/glamour-icon.png b/docs/html/images/distribute/stories/glamour-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..770b03fc7df5fad88f83fda2a42b5b9817e6bd21 Binary files /dev/null and b/docs/html/images/distribute/stories/glamour-icon.png differ diff --git a/docs/html/images/distribute/stories/happylabs-happy_pet_icon.png b/docs/html/images/distribute/stories/happylabs-happy_pet_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9b24c4ad685925a20f692308e37d49a75dce4bc2 Binary files /dev/null and b/docs/html/images/distribute/stories/happylabs-happy_pet_icon.png differ diff --git a/docs/html/images/distribute/stories/happylabs-logo.png b/docs/html/images/distribute/stories/happylabs-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ea20e71a6ed6caad9deb6f651b332e1608ddafde Binary files /dev/null and b/docs/html/images/distribute/stories/happylabs-logo.png differ diff --git a/docs/html/images/distribute/stories/happylabs-variant.png b/docs/html/images/distribute/stories/happylabs-variant.png new file mode 100644 index 0000000000000000000000000000000000000000..3ce5342091573cde65caa9299f663edd60887c53 Binary files /dev/null and b/docs/html/images/distribute/stories/happylabs-variant.png differ diff --git a/docs/html/images/distribute/stories/lifesum-icon.png b/docs/html/images/distribute/stories/lifesum-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3975ff260ed4f6eada0a2c95fc02ca8963920569 Binary files /dev/null and b/docs/html/images/distribute/stories/lifesum-icon.png differ diff --git a/docs/html/images/distribute/stories/noom-icon.png b/docs/html/images/distribute/stories/noom-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a85321878f0fbffda70d911ae388dcd73a3de358 Binary files /dev/null and b/docs/html/images/distribute/stories/noom-icon.png differ diff --git a/docs/html/images/distribute/stories/noom-screenshot.png b/docs/html/images/distribute/stories/noom-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..0293eea85d68bbd98fd8685f848f8862b05618bf Binary files /dev/null and b/docs/html/images/distribute/stories/noom-screenshot.png differ diff --git a/docs/html/images/distribute/stories/playlab-icon.png b/docs/html/images/distribute/stories/playlab-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..af8018348df34723c15c7f56a03fbc582ebfdef1 Binary files /dev/null and b/docs/html/images/distribute/stories/playlab-icon.png differ diff --git a/docs/html/images/distribute/stories/playlab-screenshot.png b/docs/html/images/distribute/stories/playlab-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..42ffb6ae93a6a9fe0df254c4a6c32a8fa6ba281f Binary files /dev/null and b/docs/html/images/distribute/stories/playlab-screenshot.png differ diff --git a/docs/html/images/guide/topics/graphics/ic_battery_charging_80_black_24dp.png b/docs/html/images/guide/topics/graphics/ic_battery_charging_80_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..44a4e8688e87a41595eb004ad387d8d951552e9d Binary files /dev/null and b/docs/html/images/guide/topics/graphics/ic_battery_charging_80_black_24dp.png differ diff --git a/docs/html/images/guide/topics/graphics/vectorpath.png b/docs/html/images/guide/topics/graphics/vectorpath.png new file mode 100644 index 0000000000000000000000000000000000000000..592bab67ecd933e7a7006a855ad3c189b111bf5b Binary files /dev/null and b/docs/html/images/guide/topics/graphics/vectorpath.png differ diff --git a/docs/html/images/tools/sdk-manager-support-libs.png b/docs/html/images/tools/sdk-manager-support-libs.png deleted file mode 100644 index cb4cea5795a6318fd772413e8c220f5b658dec69..0000000000000000000000000000000000000000 Binary files a/docs/html/images/tools/sdk-manager-support-libs.png and /dev/null differ diff --git a/docs/html/images/tools/studio-sdk-manager-packages.png b/docs/html/images/tools/studio-sdk-manager-packages.png deleted file mode 100644 index 79ea912e183a0ed0e8f93280f1f0063a06a252ca..0000000000000000000000000000000000000000 Binary files a/docs/html/images/tools/studio-sdk-manager-packages.png and /dev/null differ diff --git a/docs/html/images/training/ctl-config.png b/docs/html/images/training/ctl-config.png index 82f63c85274d7b50ed0ca6dd0c7ed24dd1f784d5..3a4f7385183c6917a7773d0010101c0a342beb5d 100644 Binary files a/docs/html/images/training/ctl-config.png and b/docs/html/images/training/ctl-config.png differ diff --git a/docs/html/images/training/tv/playback/onboarding-fragment-diagram.png b/docs/html/images/training/tv/playback/onboarding-fragment-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..5839a50d572c6b112d898d1276060c503bca0575 Binary files /dev/null and b/docs/html/images/training/tv/playback/onboarding-fragment-diagram.png differ diff --git a/docs/html/images/training/tv/playback/onboarding-fragment.png b/docs/html/images/training/tv/playback/onboarding-fragment.png new file mode 100644 index 0000000000000000000000000000000000000000..5b7da55c8422caced861259c1d666f6c5c4128e2 Binary files /dev/null and b/docs/html/images/training/tv/playback/onboarding-fragment.png differ diff --git a/docs/html/images/training/tv/playback/onboarding-fragment_2x.png b/docs/html/images/training/tv/playback/onboarding-fragment_2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0034be44fbc861c99a75a3fbacb9076d3bb55b02 Binary files /dev/null and b/docs/html/images/training/tv/playback/onboarding-fragment_2x.png differ diff --git a/docs/html/index.jd b/docs/html/index.jd index dc59b71935dc5e89eafe2f535442bd70f3d4df6f..78fc84852f7c52b4654932cf2d76a95e37df0fd1 100644 --- a/docs/html/index.jd +++ b/docs/html/index.jd @@ -6,16 +6,6 @@ nonavpage=true @jd:body - -
          @@ -45,7 +35,7 @@ nonavpage=true
          -
        +

        You should also read

        + + @@ -146,7 +154,7 @@ as the UI thread by default.

        If you implement {@link java.lang.Thread} or {@link android.os.HandlerThread}, be sure that your UI thread does not block while waiting for the worker thread to -complete—do not call {@link java.lang.Object#wait Thread.wait()} or +complete—do not call {@link java.lang.Thread#wait Thread.wait()} or {@link java.lang.Thread#sleep Thread.sleep()}. Instead of blocking while waiting for a worker thread to complete, your main thread should provide a {@link android.os.Handler} for the other threads to post back to upon completion. @@ -165,6 +173,16 @@ application should start an {@link android.app.IntentService} if a potentially long running action needs to be taken in response to an intent broadcast.

        +

        + Another common issue with {@link android.content.BroadcastReceiver} objects + occurs when they execute too frequently. Frequent background execution can + reduce the amount of memory available to other apps. + For more information about how to enable and disable + {@link android.content.BroadcastReceiver} objects efficiently, see + Manipulating + Broadcast Receivers on Demand. +

        +

        Tip: You can use {@link android.os.StrictMode} to help find potentially long running operations such as network or database operations that diff --git a/docs/html/training/articles/perf-tips.jd b/docs/html/training/articles/perf-tips.jd index 82de69a55249a32eeadc90a680834ca76d0b62cb..30cab14d5da671605cf172864c1a7c5c6c0a22a8 100644 --- a/docs/html/training/articles/perf-tips.jd +++ b/docs/html/training/articles/perf-tips.jd @@ -28,7 +28,8 @@ when combined, but it's unlikely that these changes will result in dramatic performance effects. Choosing the right algorithms and data structures should always be your priority, but is outside the scope of this document. You should use the tips in this document as general coding practices that you can incorporate into your habits for general code -efficiency.

        +efficiency. +

        There are two basic rules for writing efficient code:

          @@ -49,8 +50,7 @@ code for a device with a JIT is not always the best code for a device without.

          To ensure your app performs well across a wide variety of devices, ensure -your code is efficient at all levels and agressively optimize your performance.

          - +your code is efficient at all levels and aggressively optimize your performance.

          Avoid Creating Unnecessary Objects

          diff --git a/docs/html/training/articles/security-tips.jd b/docs/html/training/articles/security-tips.jd index abf6711ba618fc29e0ace8c47d12d36ee952823f..9796d9a4189e08d6cadb5a4e85a8c61644cedacb 100644 --- a/docs/html/training/articles/security-tips.jd +++ b/docs/html/training/articles/security-tips.jd @@ -6,34 +6,32 @@ page.article=true -

          Android has security features built -into the operating system that significantly reduce the frequency and impact of -application security issues. The system is designed so you can typically build your apps with -default system and file permissions and avoid difficult decisions about security.

          +

          Android has built-in security features that significantly reduce the frequency and impact of +application security issues. The system is designed so that you can typically build your apps with +the default system and file permissions and avoid difficult decisions about security.

          -

          Some of the core security features that help you build secure apps -include: +

          The following core security features help you build secure apps:

          • The Android Application Sandbox, which isolates your app data and code execution from other apps.
          • @@ -43,47 +41,54 @@ security functionality such as cryptography, permissions, and secure
          • Technologies like ASLR, NX, ProPolice, safe_iop, OpenBSD dlmalloc, OpenBSD calloc, and Linux mmap_min_addr to mitigate risks associated with common memory management errors.
          • -
          • An encrypted filesystem that can be enabled to protect data on lost or +
          • An encrypted file system that can be enabled to protect data on lost or stolen devices.
          • User-granted permissions to restrict access to system features and user data.
          • Application-defined permissions to control application data on a per-app basis.
          -

          Nevertheless, it is important that you be familiar with the Android +

          It is important that you be familiar with the Android security best practices in this document. Following these practices as general coding habits -will reduce the likelihood of inadvertently introducing security issues that + reduces the likelihood of inadvertently introducing security issues that adversely affect your users.

          -

          Storing Data

          +

          Storing data

          The most common security concern for an application on Android is whether the data that you save on the device is accessible to other apps. There are three fundamental ways to save data on the device:

          +
            +
          • Internal storage.
          • +
          • External storage.
          • +
          • Content providers.
          • +
          + +The following paragraphs describe the security issues associated with each approach. +

          Using internal storage

          By default, files that you create on internal -storage are accessible only to your app. This -protection is implemented by Android and is sufficient for most -applications.

          +storage are accessible only to your app. + Android implements this protection, and it's sufficient for most applications.

          -

          You should generally avoid using the {@link android.content.Context#MODE_WORLD_WRITEABLE} or +

          Generally, avoid the {@link android.content.Context#MODE_WORLD_WRITEABLE} or {@link android.content.Context#MODE_WORLD_READABLE} modes for IPC files because they do not provide the ability to limit data access to particular applications, nor do they -provide any control on data format. If you want to share your data with other -app processes, you might instead consider using a +provide any control of data format. If you want to share your data with other +app processes, instead consider using a content provider, which offers read and write permissions to other apps and can make dynamic permission grants on a case-by-case basis.

          -

          To provide additional protection for sensitive data, you might -choose to encrypt local files using a key that is not directly accessible to the -application. For example, a key can be placed in a {@link java.security.KeyStore} -and protected with a user password that is not stored on the device. While this +

          To provide additional protection for sensitive data, you can + encrypt local files using a key that is not directly accessible to the +application. For example, you can place a key in a {@link java.security.KeyStore} +and protect it with a user password that is not stored on the device. While this does not protect data from a root compromise that can monitor the user inputting the password, it can provide protection for a lost device without file system @@ -94,14 +99,14 @@ encryption.

          Files created on external -storage, such as SD Cards, are globally readable and writable. Because +storage, such as SD cards, are globally readable and writable. Because external storage can be removed by the user and also modified by any -application, you should not store sensitive information using +application, don't store sensitive information using external storage.

          -

          As with data from any untrusted source, you should perform input -validation when handling data from external storage. -We strongly recommend that you not store executables or +

          You should Perform input validation when handling +data from external storage as you would with data from any untrusted source. +You should not store executables or class files on external storage prior to dynamic loading. If your app does retrieve executable files from external storage, the files should be signed and cryptographically verified prior to dynamic loading.

          @@ -117,22 +122,22 @@ applications with access to your {@link android.content.ContentProvider}, mark t href="{@docRoot}guide/topics/manifest/provider-element.html#exported"> android:exported=false
          in the application manifest. Otherwise, set the android:exported -attribute {@code "true"} to allow other apps to access the stored data. +attribute to {@code true} to allow other apps to access the stored data.

          When creating a {@link android.content.ContentProvider} -that will be exported for use by other applications, you can specify a single +that is exported for use by other applications, you can specify a single permission - for reading and writing, or distinct permissions for reading and writing -within the manifest. We recommend that you limit your permissions to those + for reading and writing, or you can specify distinct permissions for reading and writing. +You should limit your permissions to those required to accomplish the task at hand. Keep in mind that it’s usually easier to add permissions later to expose new functionality than it is to take -them away and break existing users.

          +them away and impact existing users.

          If you are using a content provider for sharing data between only your own apps, it is preferable to use the {@code -android:protectionLevel} attribute set to {@code "signature"} protection. +android:protectionLevel} attribute set to {@code signature} protection. Signature permissions do not require user confirmation, so they provide a better user experience and more controlled access to the content provider data when the apps accessing the data are @@ -148,7 +153,7 @@ android.content.Intent#FLAG_GRANT_WRITE_URI_PERMISSION} flags in the that activates the component. The scope of these permissions can be further limited by the -<grant-uri-permission element>.

          +<grant-uri-permission> element.

          When accessing a content provider, use parameterized query methods such as {@link android.content.ContentProvider#query(Uri,String[],String,String[],String) query()}, @@ -158,11 +163,11 @@ potential SQL injection from untrusted sources. Note that using parameterized me sufficient if the selection argument is built by concatenating user data prior to submitting it to the method.

          -

          Do not have a false sense of security about the write permission. Consider -that the write permission allows SQL statements which make it possible for some +

          Don't have a false sense of security about the write permission. + The write permission allows SQL statements that make it possible for some data to be confirmed using creative WHERE clauses and parsing the -results. For example, an attacker might probe for presence of a specific phone -number in a call-log by modifying a row only if that phone number already +results. For example, an attacker might probe for the presence of a specific phone +number in a call log by modifying a row only if that phone number already exists. If the content provider data has predictable structure, the write permission may be equivalent to providing both reading and writing.

          @@ -172,7 +177,7 @@ permission may be equivalent to providing both reading and writing.

          -

          Using Permissions

          +

          Using permissions

          Because Android sandboxes applications from each other, applications must explicitly share resources and data. They do this by declaring the permissions they need for additional @@ -180,25 +185,25 @@ capabilities not provided by the basic sandbox, including access to device featu the camera.

          -

          Requesting Permissions

          +

          Requesting permissions

          -

          We recommend minimizing the number of permissions that your app requests. -Not having access to sensitive permissions reduces the risk of -inadvertently misusing those permissions, can improve user adoption, and makes +

          You should minimize the number of permissions that your app requests. +Restricting access to sensitive permissions reduces the risk of +inadvertently misusing those permissions, improves user adoption, and makes your app less vulnerable for attackers. Generally, -if a permission is not required for your app to function, do not request it.

          +if a permission is not required for your app to function, don't request it.

          If it's possible to design your application in a way that does not require any permissions, that is preferable. For example, rather than requesting access to device information to create a unique identifier, create a GUID for your application -(see the section about Handling User Data). Or, rather than +(see the section about Handling user data). Or, rather than using external storage (which requires permission), store data on the internal storage.

          In addition to requesting permissions, your application can use the {@code } -to protect IPC that is security sensitive and will be exposed to other +href="{@docRoot}guide/topics/manifest/permission-element.html">{@code <permission>} + element to protect IPC that is security sensitive and is exposed to other applications, such as a {@link android.content.ContentProvider}. In general, we recommend using access controls other than user confirmed permissions where possible because permissions can @@ -211,13 +216,14 @@ provided by a single developer.

          data over IPC that is available only because your app has permission to access that data. The clients of your app's IPC interface may not have that same data-access permission. More details on the frequency and potential effects -of this issue appear in this -research paper, published at USENIX. +of this issue appear in the research paper +Permission Re-Delegation: Attacks and Defenses +, published at USENIX. -

          Creating Permissions

          +

          Creating permissions

          Generally, you should strive to define as few permissions as possible while satisfying your security requirements. Creating a new permission is relatively @@ -228,18 +234,18 @@ perform access checks using existing permissions.

          If you must create a new permission, consider whether you can accomplish your task with a "signature" +href="{@docRoot}guide/topics/manifest/permission-element.html#plevel">signature protection level. Signature permissions are transparent -to the user and only allow access by applications signed by the same developer -as application performing the permission check.

          +to the user and allow access only by applications signed by the same developer +as the application performing the permission check.

          If you create a permission with the "dangerous" +href="{@docRoot}guide/topics/manifest/permission-element.html#plevel">dangerous protection level, there are a number of complexities that you need to consider:

          • The permission must have a string that concisely expresses to a user the -security decision they will be required to make.
          • +security decision they are required to make.
          • The permission string must be localized to many different languages.
          • Users may choose not to install an application because a permission is confusing or perceived as risky.
          • @@ -247,28 +253,28 @@ confusing or perceived as risky. has not been installed.
          -

          Each of these poses a significant non-technical challenge for you as the developer +

          Each of these poses a significant nontechnical challenge for you as the developer while also confusing your users, -which is why we discourage the use of the "dangerous" permission level.

          +which is why we discourages the use of the dangerous permission level.

          -

          Using Networking

          +

          Using networking

          -

          Network transactions are inherently risky for security, because it involves transmitting +

          Network transactions are inherently risky for security, because they involve transmitting data that is potentially private to the user. People are increasingly aware of the privacy concerns of a mobile device, especially when the device performs network transactions, so it's very important that your app implement all best practices toward keeping the user's data secure at all times.

          -

          Using IP Networking

          +

          Using IP networking

          Networking on Android is not significantly different from other Linux environments. The key consideration is making sure that appropriate protocols are used for sensitive data, such as {@link javax.net.ssl.HttpsURLConnection} for -secure web traffic. We prefer use of HTTPS over HTTP anywhere that HTTPS is +secure web traffic. You should use HTTPS over HTTP anywhere that HTTPS is supported on the server, because mobile devices frequently connect on networks that are not secured, such as public Wi-Fi hotspots.

          @@ -278,32 +284,32 @@ class. Given the frequency with which Android devices connect to unsecured wireless networks using Wi-Fi, the use of secure networking is strongly encouraged for all applications that communicate over the network.

          -

          We have seen some applications use localhost network ports for -handling sensitive IPC. We discourage this approach since these interfaces are -accessible by other applications on the device. Instead, you should use an Android IPC -mechanism where authentication is possible such as with a {@link android.app.Service}. (Even -worse than using loopback is to bind to INADDR_ANY since then your application -may receive requests from anywhere.)

          +

          Some applications use localhost network ports for +handling sensitive IPC. You should not use this approach because these interfaces are +accessible by other applications on the device. Instead, use an Android IPC +mechanism where authentication is possible, such as with a {@link android.app.Service}. +Binding to INADDR_ANY is worse than using loopback because then your application +may receive requests from anywhere.

          -

          Also, one common issue that warrants repeating is to make sure that you do -not trust data downloaded from HTTP or other insecure protocols. This includes +

          Make sure that you don't + trust data downloaded from HTTP or other insecure protocols. This includes validation of input in {@link android.webkit.WebView} and any responses to intents issued against HTTP.

          -

          Using Telephony Networking

          +

          Using telephony networking

          The SMS protocol was primarily designed for user-to-user communication and is not well-suited for apps that want to transfer data. -Due to the limitations of SMS, we strongly recommend the use of Google Cloud Messaging (GCM) and IP networking for sending data messages from a web server to your app on a user device.

          Beware that SMS is neither encrypted nor strongly -authenticated on either the network or the device. In particular, any SMS receiver -should expect that a malicious user may have sent the SMS to your application—Do -not rely on unauthenticated SMS data to perform sensitive commands. +authenticated on either the network or the device. In particular, any SMS receiver +should expect that a malicious user may have sent the SMS to your application. Don't + rely on unauthenticated SMS data to perform sensitive commands. Also, you should be aware that SMS may be subject to spoofing and/or interception on the network. On the Android-powered device itself, SMS messages are transmitted as broadcast intents, so they may be read or captured @@ -314,32 +320,32 @@ permission.

          -

          Performing Input Validation

          +

          Performing input validation

          Insufficient input validation is one of the most common security problems -affecting applications, regardless of what platform they run on. Android does -have platform-level countermeasures that reduce the exposure of applications to -input validation issues and you should use those features where possible. Also -note that selection of type-safe languages tends to reduce the likelihood of +affecting applications, regardless of what platform they run on. Android +has platform-level countermeasures that reduce the exposure of applications to +input validation issues, and you should use those features where possible. Also +note that the selection of type-safe languages tends to reduce the likelihood of input validation issues.

          -

          If you are using native code, then any data read from files, received over +

          If you are using native code, any data read from files, received over the network, or received from an IPC has the potential to introduce a security issue. The most common problems are buffer overflows, use after +href="http://en.wikipedia.org/wiki/Buffer_overflow" class="external-link">buffer overflows, use after free, and off-by-one errors. +href="http://en.wikipedia.org/wiki/Off-by-one_error" class="external-link">off-by-one errors. Android provides a number of technologies like ASLR and DEP that reduce the -exploitability of these errors, but they do not solve the underlying problem. -You can prevent these vulneratbilities by careful handling pointers and managing +exploitability of these errors, but they don't solve the underlying problem. +You can prevent these vulnerabilities by carefully handling pointers and managing buffers.

          -

          Dynamic, string based languages such as JavaScript and SQL are also subject +

          Dynamic, string-based languages such as JavaScript and SQL are also subject to input validation problems due to escape characters and script injection.

          +href="http://en.wikipedia.org/wiki/Code_injection" class="external-link">script injection.

          If you are using data within queries that are submitted to an SQL database or a content provider, SQL injection may be an issue. The best defense is to use @@ -348,60 +354,59 @@ href="#ContentProviders">content providers. Limiting permissions to read-only or write-only can also reduce the potential for harm related to SQL injection.

          -

          If you cannot use the security features above, we strongly recommend the use -of well-structured data formats and verifying that the data conforms to the +

          If you can't use the security features above, you should make sure to use +well-structured data formats and verify that the data conforms to the expected format. While blacklisting of characters or character-replacement can -be an effective strategy, these techniques are error-prone in practice and +be an effective strategy, these techniques are error prone in practice and should be avoided when possible.

          -

          Handling User Data

          +

          Handling user data

          In general, the best approach for user data security is to minimize the use of APIs that access sensitive or personal user data. If you have access to user data and can avoid -storing or transmitting the information, do not store or transmit the data. -Finally, consider if there is a way that your application logic can be +storing or transmitting it, don't store or transmit the data. +Consider if there is a way that your application logic can be implemented using a hash or non-reversible form of the data. For example, your -application might use the hash of an an email address as a primary key, to +application might use the hash of an email address as a primary key to avoid transmitting or storing the email address. This reduces the chances of inadvertently exposing data, and it also reduces the chance of attackers attempting to exploit your application.

          If your application accesses personal information such as passwords or -usernames, keep in mind that some jurisdictions may require you to provide a -privacy policy explaining your use and storage of that data. So following the +user names, keep in mind that some jurisdictions may require you to provide a +privacy policy explaining your use and storage of that data. Following the security best practice of minimizing access to user data may also simplify compliance.

          You should also consider whether your application might be inadvertently exposing personal information to other parties such as third-party components for advertising or third-party services used by your application. If you don't -know why a component or service requires a personal information, don’t +know why a component or service requires personal information, don’t provide it. In general, reducing the access to personal information by your -application will reduce the potential for problems in this area.

          - -

          If access to sensitive data is required, evaluate whether that information -must be transmitted to a server, or whether the operation can be performed on -the client. Consider running any code using sensitive data on the client to -avoid transmitting user data.

          - -

          Also, make sure that you do not inadvertently expose user data to other -application on the device through overly permissive IPC, world writable files, -or network sockets. This is a special case of leaking permission-protected data, +application reduces the potential for problems in this area.

          + +

          If your app requires access to sensitive data, evaluate whether you need to + transmit it to a server or you can run the operation on +the client. Consider running any code using sensitive data on the client to +avoid transmitting user data. Also, make sure that you do not inadvertently expose user + data to other +applications on the device through overly permissive IPC, world-writable files, +or network sockets. Overly permissive IPC is a special case of leaking permission-protected data, discussed in the Requesting Permissions section.

          If a GUID -is required, create a large, unique number and store it. Do not -use phone identifiers such as the phone number or IMEI which may be associated +is required, create a large, unique number and store it. Don't +use phone identifiers such as the phone number or IMEI, which may be associated with personal information. This topic is discussed in more detail in the Android -Developer Blog.

          +href="http://android-developers.blogspot.com/2011/03/identifying-app-installations.html" +>Android Developer Blog.

          Be careful when writing to on-device logs. -In Android, logs are a shared resource, and are available +In Android, logs are a shared resource and are available to an application with the {@link android.Manifest.permission#READ_LOGS} permission. Even though the phone log data is temporary and erased on reboot, inappropriate logging of user information @@ -414,19 +419,23 @@ could inadvertently leak user data to other applications.

          Using WebView

          -

          Because {@link android.webkit.WebView} consumes web content that can include HTML and JavaScript, +

          Because {@link android.webkit.WebView} consumes web content that can include HTML + and JavaScript, improper use can introduce common web security issues such as cross-site-scripting +href="http://en.wikipedia.org/wiki/Cross_site_scripting" class="external-link"> +cross-site-scripting (JavaScript injection). Android includes a number of mechanisms to reduce -the scope of these potential issues by limiting the capability of {@link android.webkit.WebView} to +the scope of these potential issues by limiting the capability of + {@link android.webkit.WebView} to the minimum functionality required by your application.

          -

          If your application does not directly use JavaScript within a {@link android.webkit.WebView}, do -not call {@link android.webkit.WebSettings#setJavaScriptEnabled setJavaScriptEnabled()}. +

          If your application doesn't directly use JavaScript within a {@link android.webkit.WebView}, + do not call + {@link android.webkit.WebSettings#setJavaScriptEnabled setJavaScriptEnabled()}. Some sample code uses this method, which you might repurpose in production application, so remove that method call if it's not required. By default, {@link android.webkit.WebView} does -not execute JavaScript so cross-site-scripting is not possible.

          +not execute JavaScript, so cross-site-scripting is not possible.

          Use {@link android.webkit.WebView#addJavascriptInterface addJavaScriptInterface()} with @@ -441,55 +450,55 @@ addJavaScriptInterface()} only to JavaScript that is contained within your appli

          If your application accesses sensitive data with a {@link android.webkit.WebView}, you may want to use the {@link android.webkit.WebView#clearCache clearCache()} method to delete any files stored -locally. Server-side -headers like no-cache can also be used to indicate that an application should +locally. You can also use server-side +headers such as no-cache to indicate that an application should not cache particular content.

          Devices running platforms older than Android 4.4 (API level 19) use a version of {@link android.webkit webkit} that has a number of security issues. As a workaround, if your app is running on these devices, it -should confirm that {@link android.webkit.WebView} objects display only trusted -content. You should also use the updatable security {@link -java.security.Provider Provider} object to make sure your app isn’t exposed to -potential vulnerabilities in SSL, as described in Updating Your Security Provider to Protect Against SSL Exploits. If your application must render content from the open web, consider providing your own renderer so you can keep it up to date with the latest security patches.

          -

          Handling Credentials

          +

          Handling credentials

          -

          In general, we recommend minimizing the frequency of asking for user -credentials—to make phishing attacks more conspicuous, and less likely to be -successful. Instead use an authorization token and refresh it.

          +

          To make phishing attacks more conspicuous and less likely to be +successful, minimize the frequency of asking for user +credentials. Instead use an authorization token and refresh it.

          -

          Where possible, username and password should not be stored on the device. -Instead, perform initial authentication using the username and password -supplied by the user, and then use a short-lived, service-specific +

          Where possible, don't store user names and passwords on the device. +Instead, perform initial authentication using the user name and password + supplied by the user, and then use a short-lived, service-specific authorization token.

          -

          Services that will be accessible to multiple applications should be accessed +

          Services that are accessible to multiple applications should be accessed using {@link android.accounts.AccountManager}. If possible, use the -{@link android.accounts.AccountManager} class to invoke a cloud-based service and do not store +{@link android.accounts.AccountManager} class to invoke a cloud-based service and don't store passwords on the device.

          After using {@link android.accounts.AccountManager} to retrieve an -{@link android.accounts.Account}, {@link android.accounts.Account#CREATOR} -before passing in any credentials, so that you do not inadvertently pass +{@link android.accounts.Account}, use {@link android.accounts.Account#CREATOR} +before passing in any credentials so that you do not inadvertently pass credentials to the wrong application.

          -

          If credentials are to be used only by applications that you create, then you -can verify the application which accesses the {@link android.accounts.AccountManager} using +

          If credentials are used only by applications that you create, you +can verify the application that accesses the {@link android.accounts.AccountManager} using {@link android.content.pm.PackageManager#checkSignatures checkSignature()}. -Alternatively, if only one application will use the credential, you might use a +Alternatively, if only one application uses the credential, you might use a {@link java.security.KeyStore} for storage.

          -

          Using Cryptography

          +

          Using cryptography

          In addition to providing data isolation, supporting full-filesystem encryption, and providing secure communications channels, Android provides a @@ -500,21 +509,21 @@ implementation that can support your use case. If you need to securely retrieve a file from a known location, a simple HTTPS URI may be adequate and requires no knowledge of cryptography. If you need a secure tunnel, consider using {@link javax.net.ssl.HttpsURLConnection} or -{@link javax.net.ssl.SSLSocket}, rather than writing your own protocol.

          +{@link javax.net.ssl.SSLSocket} rather than writing your own protocol.

          -

          If you do find yourself needing to implement your own protocol, we strongly -recommend that you not implement your own cryptographic algorithms. Use +

          If you do need to implement your own protocol, you should not +implement your own cryptographic algorithms. Use existing cryptographic algorithms such as those in the implementation of AES or RSA provided in the {@link javax.crypto.Cipher} class.

          Use a secure random number generator, {@link java.security.SecureRandom}, -to initialize any cryptographic keys, {@link javax.crypto.KeyGenerator}. +to initialize any cryptographic keys generated by {@link javax.crypto.KeyGenerator}. Use of a key that is not generated with a secure random -number generator significantly weakens the strength of the algorithm, and may +number generator significantly weakens the strength of the algorithm and may allow offline attacks.

          -

          If you need to store a key for repeated use, use a mechanism like - {@link java.security.KeyStore} that +

          If you need to store a key for repeated use, use a mechanism, such as + {@link java.security.KeyStore}, that provides a mechanism for long term storage and retrieval of cryptographic keys.

          @@ -522,10 +531,10 @@ keys.

          -

          Using Interprocess Communication

          +

          Using interprocess communication

          Some apps attempt to implement IPC using traditional Linux -techniques such as network sockets and shared files. We strongly encourage you to instead +techniques such as network sockets and shared files. However, you should instead use Android system functionality for IPC such as {@link android.content.Intent}, {@link android.os.Binder} or {@link android.os.Messenger} with a {@link android.app.Service}, and {@link android.content.BroadcastReceiver}. @@ -535,19 +544,19 @@ mechanism.

          Many of the security elements are shared across IPC mechanisms. If your IPC mechanism is not intended for use by other applications, set the -{@code android:exported} attribute to {@code "false"} in the component's manifest element, +{@code android:exported} attribute to {@code false} in the component's manifest element, such as for the {@code } +href="{@docRoot}guide/topics/manifest/service-element.html#exported">{@code <service>} element. This is useful for applications that consist of multiple processes -within the same UID, or if you decide late in development that you do not -actually want to expose functionality as IPC but you don’t want to rewrite +within the same UID or if you decide late in development that you don't +actually want to expose functionality as IPC, but you don’t want to rewrite the code.

          -

          If your IPC is intended to be accessible to other applications, you can +

          If your IPC is accessible to other applications, you can apply a security policy by using the {@code } +href="{@docRoot}guide/topics/manifest/permission-element.html">{@code <permission>} element. If IPC is between your own separate apps that are signed with the same key, -it is preferable to use {@code "signature"} level permission in the {@code android:protectionLevel}.

          @@ -556,31 +565,42 @@ android:protectionLevel}.

          Using intents

          -

          Intents are the preferred mechanism for asynchronous IPC in Android. +

          For activities and broadcast receivers, intents are the preferred mechanism for + asynchronous IPC in Android. Depending on your application requirements, you might use {@link android.content.Context#sendBroadcast sendBroadcast()}, {@link android.content.Context#sendOrderedBroadcast sendOrderedBroadcast()}, or an explicit intent to a specific application component.

          -

          Note that ordered broadcasts can be “consumed” by a recipient, so they +

          Caution: If you use an intent to bind to a + {@link android.app.Service}, ensure that your app is secure by using an + explicit +intent. Using an implicit intent to start a service is a +security hazard because you can't be certain what service will respond to the intent, +and the user can't see which service starts. Beginning with Android 5.0 (API level 21), + the system +throws an exception if you call {@link android.content.Context#bindService bindService()} +with an implicit intent.

          + +

          Note that ordered broadcasts can be consumed by a recipient, so they may not be delivered to all applications. If you are sending an intent that must be delivered -to a specific receiver, then you must use an explicit intent that declares the receiver -by nameintent.

          +to a specific receiver, you must use an explicit intent that declares the receiver +by name.

          -

          Senders of an intent can verify that the recipient has a permission -specifying a non-Null permission with the method call. Only applications with that -permission will receive the intent. If data within a broadcast intent may be +

          Senders of an intent can verify that the recipient has permission + by specifying a non-null permission with the method call. Only applications with that +permission receive the intent. If data within a broadcast intent may be sensitive, you should consider applying a permission to make sure that -malicious applications cannot register to receive those messages without -appropriate permissions. In those circumstances, you may also consider +malicious applications can't register to receive those messages without +appropriate permissions. In those circumstances, you may also consider invoking the receiver directly, rather than raising a broadcast.

          Note: Intent filters should not be considered -a security feature—components +a security feature. Components can be invoked with explicit intents and may not have data that would conform to the intent -filter. You should perform input validation within your intent receiver to +filter. To confirm that it is properly formatted for the invoked receiver, service, or -activity.

          +activity, perform input validation within your intent receiver.

          @@ -589,26 +609,32 @@ activity.

          A {@link android.app.Service} is often used to supply functionality for other applications to use. Each service class must have a corresponding {@code } declaration in its +href="{@docRoot}guide/topics/manifest/service-element.html">{@code } + declaration in its manifest file.

          By default, services are not exported and cannot be invoked by any other -application. However, if you add any intent filters to the service declaration, then it is exported +application. However, if you add any intent filters to the service declaration, it is exported by default. It's best if you explicitly declare the {@code android:exported} attribute to be sure it behaves as you'd like. Services can also be protected using the {@code android:permission} -attribute. By doing so, other applications will need to declare +attribute. By doing so, other applications need to declare a corresponding <uses-permission> element in their own manifest to be able to start, stop, or bind to the service.

          +

          Note: If your app targets Android 5.0 (API level 21) or later, + you should use the {@link android.app.job.JobScheduler} to execute background + services. For more information about {@link android.app.job.JobScheduler}, see its + {@link android.app.job.JobScheduler API-reference documentation}.

          +

          A service can protect individual IPC calls into it with permissions, by calling {@link android.content.Context#checkCallingPermission checkCallingPermission()} before executing -the implementation of that call. We generally recommend using the +the implementation of that call. You should use the declarative permissions in the manifest, since those are less prone to oversight.

          @@ -620,24 +646,24 @@ oversight.

          preferred mechanism for RPC-style IPC in Android. They provide a well-defined interface that enables mutual authentication of the endpoints, if required.

          -

          We strongly encourage designing interfaces in a manner that does not require -interface specific permission checks. {@link android.os.Binder} and +

          You should design your app interfaces in a manner that does not require +interface-specific permission checks. {@link android.os.Binder} and {@link android.os.Messenger} objects are not declared within the application manifest, and therefore you cannot apply declarative permissions directly to them. They generally inherit permissions declared in the application manifest for the {@link android.app.Service} or {@link android.app.Activity} within which they are implemented. If you are creating an interface that requires authentication -and/or access controls, those controls must be -explicitly added as code in the {@link android.os.Binder} or {@link android.os.Messenger} +and/or access controls, you must explicitly add those controls + as code in the {@link android.os.Binder} or {@link android.os.Messenger} interface.

          -

          If providing an interface that does require access controls, use {@link +

          If you are providing an interface that does require access controls, use {@link android.content.Context#checkCallingPermission checkCallingPermission()} to verify whether the caller has a required permission. This is especially important before accessing a service on behalf of the caller, as the identify of your -application is passed to other interfaces. If invoking an interface provided +application is passed to other interfaces. If you are invoking an interface provided by a {@link android.app.Service}, the {@link android.content.Context#bindService bindService()} invocation may fail if you do not have permission to access the given service. @@ -660,8 +686,8 @@ application. If your {@link android.content.BroadcastReceiver} is intended for use by other applications, you may want to apply security permissions to receivers using the -<receiver> element within the application manifest. This will -prevent applications without appropriate permissions from sending an intent to +<receiver> element within the application manifest. This +prevents applications without appropriate permissions from sending an intent to the {@link android.content.BroadcastReceiver}.

          @@ -671,57 +697,58 @@ the {@link android.content.BroadcastReceiver}.

          -

          Dynamically Loading Code

          +

          Dynamically loading code

          We strongly discourage loading code from outside of your application APK. Doing so significantly increases the likelihood of application compromise due -to code injection or code tampering. It also adds complexity around version -management and application testing. Finally, it can make it impossible to +to code injection or code tampering. It also adds complexity around version +management and application testing. It can also make it impossible to verify the behavior of an application, so it may be prohibited in some environments.

          If your application does dynamically load code, the most important thing to -keep in mind about dynamically loaded code is that it runs with the same -security permissions as the application APK. The user made a decision to -install your application based on your identity, and they are expecting that +keep in mind about dynamically-loaded code is that it runs with the same +security permissions as the application APK. The user makes a decision to +install your application based on your identity, and the user expects that you provide any code run within the application, including code that is dynamically loaded.

          The major security risk associated with dynamically loading code is that the code needs to come from a verifiable source. If the modules are included -directly within your APK, then they cannot be modified by other applications. +directly within your APK, they cannot be modified by other applications. This is true whether the code is a native library or a class being loaded using -{@link dalvik.system.DexClassLoader}. We have seen many instances of applications -attempting to load code from insecure locations, such as downloaded from the -network over unencrypted protocols or from world writable locations such as +{@link dalvik.system.DexClassLoader}. Many applications +attempt to load code from insecure locations, such as downloaded from the +network over unencrypted protocols or from world-writable locations such as external storage. These locations could allow someone on the network to modify -the content in transit, or another application on a users device to modify the -content on the device, respectively.

          +the content in transit or another application on a user's device to modify the +content on the device.

          -

          Security in a Virtual Machine

          +

          Security in a virtual machine

          Dalvik is Android's runtime virtual machine (VM). Dalvik was built specifically for Android, but many of the concerns regarding secure code in other virtual machines also apply to Android. In general, you shouldn't concern yourself with security issues relating to the virtual machine. -Your application runs in a secure sandbox environment, so other processes on the system cannnot +Your application runs in a secure sandbox environment, so other processes on the system can't access your code or private data.

          -

          If you're interested in diving deeper on the subject of virtual machine security, -we recommend that you familiarize yourself with some +

          If you're interested in learning more about virtual machine security, + familiarize yourself with some existing literature on the subject. Two of the more popular resources are:

          -

          This document is focused on the areas which are Android specific or +

          This document focuses on areas that are Android specific or different from other VM environments. For developers experienced with VM programming in other environments, there are two broad issues that may be different about writing apps for Android: @@ -742,21 +769,19 @@ because that code might be modified to include malicious behavior. -

          Security in Native Code

          +

          Security in native code

          -

          In general, we encourage developers to use the Android SDK for +

          In general, you should use the Android SDK for application development, rather than using native code with the Android NDK. Applications built with native code are more complex, less portable, and more like to include -common memory corruption errors such as buffer overflows.

          +common memory-corruption errors such as buffer overflows.

          -

          Android is built using the Linux kernel and being familiar with Linux -development security best practices is especially useful if you are going to -use native code. Linux security practices are beyond the scope of this document, -but one of the most popular resources is “Secure Programming for -Linux and Unix HOWTO”, available at -http://www.dwheeler.com/secure-programs.

          +

          Android is built using the Linux kernel, and being familiar with Linux +development security best practices is especially useful if you are +using native code. Linux security practices are beyond the scope of this document, +but one of the most popular resources is Secure Programming HOWTO - Creating Secure Software.

          An important difference between Android and most Linux environments is the Application Sandbox. On Android, all applications run in the Application @@ -765,6 +790,5 @@ good way to think about it for developers familiar with Linux is to know that every application is given a unique UID with very limited permissions. This is discussed in more detail in the Android Security -Overview and you should be familiar with application permissions even if +Overview, and you should be familiar with application permissions even if you are using native code.

          - diff --git a/docs/html/training/auto/audio/index.jd b/docs/html/training/auto/audio/index.jd index 3a1b1e883494161db56cb30b54a2cf7aa629787c..65883671f956ea49b0d0622d86ff816ff2c093f2 100644 --- a/docs/html/training/auto/audio/index.jd +++ b/docs/html/training/auto/audio/index.jd @@ -596,7 +596,7 @@ href="https://www.youtube.com/watch?v=xc2HZSwPcwM">

          Support Voice Actions

          -

          To reduce driver distractions, you can add voice actions in your audio playback app. With voice +

          To reduce driver distractions, you must add voice actions in your audio playback app. With voice action support, users can launch your app and play audio by providing voice input on Auto screens. If your audio playback app is already active and the user says “Play a song”, the system starts playing music without requiring the user to look at or touch diff --git a/docs/html/training/backup/autosyncapi.jd b/docs/html/training/backup/autosyncapi.jd deleted file mode 100644 index e0df7bb658aed5554fd295e8910184f0c042b0d0..0000000000000000000000000000000000000000 --- a/docs/html/training/backup/autosyncapi.jd +++ /dev/null @@ -1,370 +0,0 @@ -page.title=Configuring Auto Backup for Apps -page.tags=backup, marshmallow, androidm -page.keywords=backup, autobackup -page.image=images/cards/card-auto-backup_2x.png - -@jd:body - -

          - -

          - Users frequently invest time and effort to configure apps just the way they like them. Switching - to a new device can cancel out all that careful configuration. For apps whose target SDK version - is Android 6.0 (API level 23) and higher, devices running Android 6.0 and higher automatically - back up app data to the cloud. The system performs this automatic backup - for nearly all app data by default, and does so without your having to write any additional app - code. -

          - -

          -Note: To protect user privacy, the device user must have opted in to Google -services for Auto Backup to work. The Google services opt-in dialog appears when the user goes -through the Setup Wizard or configures the first Google account on the device. -

          - -

          - When a user installs your app on - a new device, or reinstalls your app on one (for example, after a factory reset), the system - automatically restores the app data from the cloud. This lesson provides information about how to - configure the Auto Backup for Apps feature, explaining its default behavior and how to - exclude data that you don't want the system to back up. -

          - -

          - The automatic backup feature preserves the data your app creates on a user device by uploading it - to the user’s Google Drive account and encrypting it. There is no charge to you or the user for - data storage, and the saved data does not count towards the user's personal Google Drive quota. - Each app can store up to 25MB. Once its backed-up data reaches 25MB, the app no longer sends - data to the cloud. If the system performs a data restore, it uses the last data snapshot that - the app had sent to the cloud. -

          - -

          Automatic backups occur when the following conditions are met:

          -
            -
          • The device is idle.
          • -
          • The device is charging.
          • -
          • The device is connected to a Wi-Fi network.
          • -
          • At least 24 hours have elapsed since the last backup.
          • -
          -

          - -

          Configure Data Backup

          - -

          - On devices running Android 6.0 (API level 23) or higher, the default system behavior is to back up - almost all data that an app creates. The exception is - automatically excluded data files. This section explains how you can use settings in - your app manifest to further - limit and configure what data the system backs up. -

          - -

          Including or excluding data

          - -

          - Depending on what data your app needs and how you save it, you may need to set specific - rules for including or excluding certain files or directories. Auto Backup for Apps - lets you set these backup rules through the app manifest, in which you specify a backup scheme - configuration XML file. For example: -

          - -
          -<?xml version="1.0" encoding="utf-8"?>
          -<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          -        xmlns:tools="http://schemas.android.com/tools"
          -        package="com.my.appexample">
          -    <uses-sdk android:minSdkVersion="23"/>
          -    <uses-sdk android:targetSdkVersion="23"/>
          -    <application ...
          -        android:fullBackupContent="@xml/mybackupscheme">
          -    </app>
          -    ...
          -</manifest>
          -
          - -

          - In this example, the android:fullBackupContent attribute specifies an XML file - called {@code mybackupscheme.xml}, which resides in the res/xml/ directory of your - app development project. This configuration file contains rules controlling which files are backed - up. The following example code shows a configuration file that excludes a specific file, - {@code device_info.db}: -

          - -
          -<?xml version="1.0" encoding="utf-8"?>
          -<full-backup-content>
          -    <exclude domain="database" path="device_info.db"/>
          -</full-backup-content>
          -
          - -

          Automatically excluded data files

          - -

          - Most apps do not need to, and in fact should not, back up all data. For example, the system - should not back up temporary files and caches. For this reason, the automatic backup - service excludes certain data files by default: -

          - -
            -
          • Files in the directories to which the - {@link android.content.Context#getCacheDir getCacheDir()} and - {@link android.content.Context#getCodeCacheDir getCodeCacheDir()} methods refer. -
          • - -
          • Files located on external storage, unless they reside in the directory to which the - {@link android.content.Context#getExternalFilesDir getExternalFilesDir()} method refers. -
          • - -
          • Files located in the directory to which the - {@link android.content.Context#getNoBackupFilesDir getNoBackupFilesDir()} method refers. -
          • -
          -

          Backup Configuration Syntax

          - -

          - The backup service configuration allows you to specify what files to include or exclude from - backup. The syntax for the data backup configuration XML file is as follows: -

          - -
          -<full-backup-content>
          -    <include domain=["file" | "database" | "sharedpref" | "external" | "root"]
          -    path="string" />
          -    <exclude domain=["file" | "database" | "sharedpref" | "external" | "root"]
          -    path="string" />
          -</full-backup-content>
          -
          - -

          - The following elements and attributes allow you to specify the files to include in, and exclude - from, backup: -

          - -
            -
          • - <include>: Specifies a set of resources to - back up, instead of having the system back up all data in your app by default. If you specify - an <include> element, the system backs up only the resources specified - with this element. You can specify multiple sets of resources to back up by using multiple - <include> elements -
          • - -
          • - <exclude>: Specifies any data you want the system to exclude - when it does a full backup. If you target the same set of resources with both the - <include> and <exclude> elements, - <exclude> takes precedence. -
          • - -
          • - domain: Specifies the type of resource you want to include in, - or exclude from, backup. Valid values for this attribute include: - - - -
              -
            • - root: Specifies that the resource is in the app’s root directory. -
            • - -
            • - file: Specifies a resource in the directory returned by the - {@link android.content.Context#getFilesDir getFilesDir()} method. -
            • - -
            • - database: Specifies a database that the - {@link android.content.Context#getDatabasePath getDatabasePath()} method returns, or that - the app interacts with via the {@link android.database.sqlite.SQLiteOpenHelper} class. -
            • - -
            • - sharedpref: Specifies a {@link android.content.SharedPreferences} object - that the {@link android.content.Context#getSharedPreferences getSharedPreferences()} - method returns. -
            • - -
            • - external: Specifies that the resource is in external storage, and corresponds - to a file in the directory that the - {@link android.content.Context#getExternalFilesDir getExternalFilesDir()} method returns. -
            • -
            -
          • -
          • - path: Specifies the file path to a resource that you want to include in, or - exclude from, backup. -
          • - - -
          - - -

          Disabling data backups

          - -

          - You can choose to prevent automatic backups of any of your app data by setting the - android:allowBackup attribute to false in the {@code app} element of - your manifest. This setting is illustrated in the following example: -

          - -
          -<?xml version="1.0" encoding="utf-8"?>
          -<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          -        xmlns:tools="http://schemas.android.com/tools"
          -        package="com.my.appexample">
          -    <uses-sdk android:minSdkVersion="23"/>
          -    <uses-sdk android:targetSdkVersion="23"/>
          -    <application ...
          -        android:allowBackup="false">
          -    </application>
          -    ...
          -</manifest>
          -
          - -

          Support Lower Versions of Android

          - -

          There are two scenarios in which you may also need to support versions of Android lower -than 6.0 (API level 23): You may be updating your existing app to take advantage of the -new auto backup functionality in Android 6.0, while wanting -to continue supporting earlier versions of Android. Or you may be releasing a new app, but -want to make sure devices running on versions of Android predating 6.0 also have backup -functionality.

          - -

          Updating an existing app to support auto backup

          - -

          Earlier versions of Android supported a key/value-pair-based backup mechanism, in which the app -defines a subclass of {@link android.app.backup.BackupAgent} and sets - -{@code android:backupAgent} in its -app manifest. If your app -used this legacy approach, you can transition to full-data backups by adding the -{@code android:fullBackupOnly="true"} attribute to the -{@code } -element in the manifest. When running on a device with Android 5.1 -(API level 22) or lower, your app ignores this value in the manifest, and continues performing -backups in the previous manner.

          - -

          Even if you’re not using key/value backups, you can still use the approach described above to do -any custom processing in {@link android.app.Activity#onCreate(android.os.Bundle) onCreate()} -or {@link android.app.backup.BackupAgent#onFullBackup onFullBackup()}. You can also use that -approach to receive a notification when a restore operation happens in -{@link android.app.backup.BackupAgent#onRestoreFinished onRestoreFinished()}. If you want to retain -the system's default implementation of -XML include/exclude rules handling, call -{@link android.app.backup.BackupAgent#onFullBackup super.onFullBackup()}.

          - -

          Giving your new app support for lower versions of Android

          - -

          If you are creating a new app that targets Android 6.0, but you also want to enable cloud backup -for devices running on Android 5.1 (API level 22) and lower, you must also -implement the Backup API.

          - -

          Test Backup Configuration

          - -

          - Once you have created a backup configuration, you should test it to make sure your app saves data - and can restore it properly. -

          - - -

          Enabling Backup Logging

          - -

          - To help determine how the backup feature is parsing your XML file, enable logging before - performing a test backup: -

          - -
          -$ adb shell setprop log.tag.BackupXmlParserLogging VERBOSE
          -
          - -

          Testing Backup

          - -

          To manually run a backup, first initialize the Backup Manager by executing the following - command: -

          - -
          -$ adb shell bmgr run
          -
          - -

          - Next, manually back up your application using the following command. Use the - <PACKAGE> parameter to specify the package name for your app: -

          - -
          -$ adb shell bmgr fullbackup <PACKAGE>
          - - -

          Testing restore

          - -

          - To manually initiate a restore after the system has backed up your app data, execute the following - command, using the <PACKAGE> parameter to specify the package name for your - app: -

          - -
          -$ adb shell bmgr restore <PACKAGE>
          -
          - -

          - Warning: This action stops your app and wipes its data before performing the restore - operation. -

          - -

          - You can test automatic restore for your app by uninstalling and reinstalling your app. The app - data is automatically restored from the cloud once the app installation is complete. -

          - - -

          Troubleshooting backups

          - -

          - If backup fails, you can clear the backup data and associated metadata either by turning backup - off and on in Settings > Backup, factory-resetting the device, or - executing this command: -

          - -
          $ adb shell bmgr wipe <TRANSPORT> <PACKAGE>
          - -

          - You must prepend com.google.android.gms to the {@code } value. - To get the list of transports, execute the - following command: -

          - -
          $ adb shell bmgr list transports
          - -

          Handle Google Cloud Messaging

          - -

          - For apps that use Google Cloud - Messaging (GCM) for push notifications, backing up the registration - token that Google Cloud Messaging registration returned can cause unexpected behavior in - notifications for the restored app. This is because when a user installs your app on a new device, - the app must - query the GCM API for a new registration token. If the old registration is present, because the - system had backed it up and restored it, the app doesn't seek the new token. To prevent this issue - from arising, exclude the registration token from the set of backed-up files. -

          diff --git a/docs/html/training/backup/backupapi.jd b/docs/html/training/backup/backupapi.jd deleted file mode 100644 index 2f3e93943f374bf7aeca9d3d7853114c9f5025ab..0000000000000000000000000000000000000000 --- a/docs/html/training/backup/backupapi.jd +++ /dev/null @@ -1,200 +0,0 @@ -page.title=Using the Backup API -parent.title=Backing up App Data to the Cloud -parent.link=index.html - -trainingnavtop=true - -next.title=Making the Most of Google Cloud Messaging -next.link=gcm.html - -@jd:body - -
          -
          -

          This lesson teaches you to

          -
            -
          1. Register for the Android Backup Service
          2. -
          3. Configure Your Manifest
          4. -
          5. Write Your Backup Agent
          6. -
          7. Request a Backup
          8. -
          9. Restore from a Backup
          10. -
          -

          You should also read

          - -
          -
          - -

          When a user purchases a new device or resets their existing one, they might -expect that when Google Play restores your app back to their device during the -initial setup, the previous data associated with the app restores as well. On versions of Android -prior to 6.0 (API level 23), app data is not restored by default, and all the user's accomplishments -or settings in your app are lost.

          -

          For situations where the volume of data is relatively light (less than a -megabyte), like the user's preferences, notes, game high scores or other -stats, the Backup API provides a lightweight solution. This lesson walks you -through integrating the Backup API into your application, and restoring data to -new devices using the Backup API. - -

          -Note: Devices running Android 6.0 and higher -automatically back up -nearly all data by default. -

          - -

          Register for the Android Backup Service

          -

          This lesson requires the use of the Android Backup - Service, which requires registration. Go ahead and register here. Once -that's done, the service pre-populates an XML tag for insertion in your Android -Manifest, which looks like this:

          -
          -<meta-data android:name="com.google.android.backup.api_key"
          -android:value="ABcDe1FGHij2KlmN3oPQRs4TUvW5xYZ" />
          -
          -

          Note that each backup key works with a specific package name. If you have -different applications, register separate keys for each one.

          - - -

          Configure Your Manifest

          -

          Use of the Android Backup Service requires two additions to your application -manifest. First, declare the name of the class that acts as your backup agent, -then add the snippet above as a child element of the Application tag. Assuming -your backup agent is going to be called {@code TheBackupAgent}, here's an example of -what the manifest looks like with this tag included:

          - -
          -<application android:label="MyApp"
          -             android:backupAgent="TheBackupAgent">
          -    ...
          -    <meta-data android:name="com.google.android.backup.api_key"
          -    android:value="ABcDe1FGHij2KlmN3oPQRs4TUvW5xYZ" />
          -    ...
          -</application>
          -
          -

          Write Your Backup Agent

          -

          The easiest way to create your backup agent is by extending the wrapper class -{@link android.app.backup.BackupAgentHelper}. Creating this helper class is -actually a very simple process. Just create a class with the same name as you -used in the manifest in the previous step (in this example, {@code -TheBackupAgent}), -and extend {@code BackupAgentHelper}. Then override the {@link -android.app.backup.BackupAgent#onCreate()}.

          - -

          Inside the {@link android.app.backup.BackupAgent#onCreate()} method, create a {@link -android.app.backup.BackupHelper}. These helpers are -specialized classes for backing up certain kinds of data. The Android framework -currently includes two such helpers: {@link -android.app.backup.FileBackupHelper} and {@link -android.app.backup.SharedPreferencesBackupHelper}. After you create the helper -and point it at the data you want to back up, just add it to the -BackupAgentHelper using the {@link android.app.backup.BackupAgentHelper#addHelper(String, BackupHelper) addHelper()} -method, adding a key which is used to -retrieve the data later. In most cases the entire -implementation is perhaps 10 lines of code.

          - -

          Here's an example that backs up a high scores file.

          - -
          -import android.app.backup.BackupAgentHelper;
          -import android.app.backup.FileBackupHelper;
          -
          -
          -public class TheBackupAgent extends BackupAgentHelper {
          -  // The name of the SharedPreferences file
          -  static final String HIGH_SCORES_FILENAME = "scores";
          -
          -  // A key to uniquely identify the set of backup data
          -  static final String FILES_BACKUP_KEY = "myfiles";
          -
          -  // Allocate a helper and add it to the backup agent
          -  @Override
          -  void onCreate() {
          -      FileBackupHelper helper = new FileBackupHelper(this, HIGH_SCORES_FILENAME);
          -      addHelper(FILES_BACKUP_KEY, helper);
          -  }
          -}
          -
          -

          For added flexibility, {@link android.app.backup.FileBackupHelper}'s -constructor can take a variable number of filenames. You could just as easily -have backed up both a high scores file and a game progress file just by adding -an extra parameter, like this:

          -
          -@Override
          -  void onCreate() {
          -      FileBackupHelper helper = new FileBackupHelper(this, HIGH_SCORES_FILENAME, PROGRESS_FILENAME);
          -      addHelper(FILES_BACKUP_KEY, helper);
          -  }
          -
          -

          Backing up preferences is similarly easy. Create a {@link -android.app.backup.SharedPreferencesBackupHelper} the same way you did a {@link -android.app.backup.FileBackupHelper}. In this case, instead of adding filenames -to the constructor, add the names of the shared preference groups being used by -your application. Here's an example of how your backup agent helper might look if -high scores are implemented as preferences instead of a flat file:

          - -
          -import android.app.backup.BackupAgentHelper;
          -import android.app.backup.SharedPreferencesBackupHelper;
          -
          -public class TheBackupAgent extends BackupAgentHelper {
          -    // The names of the SharedPreferences groups that the application maintains.  These
          -    // are the same strings that are passed to getSharedPreferences(String, int).
          -    static final String PREFS_DISPLAY = "displayprefs";
          -    static final String PREFS_SCORES = "highscores";
          -
          -    // An arbitrary string used within the BackupAgentHelper implementation to
          -    // identify the SharedPreferencesBackupHelper's data.
          -    static final String MY_PREFS_BACKUP_KEY = "myprefs";
          -
          -    // Simply allocate a helper and install it
          -    void onCreate() {
          -       SharedPreferencesBackupHelper helper =
          -                new SharedPreferencesBackupHelper(this, PREFS_DISPLAY, PREFS_SCORES);
          -        addHelper(MY_PREFS_BACKUP_KEY, helper);
          -    }
          -}
          -
          - -

          You can add as many backup helper instances to your backup agent helper as you -like, but remember that you only need one of each type. One {@link -android.app.backup.FileBackupHelper} handles all the files that you need to back up, and one -{@link android.app.backup.SharedPreferencesBackupHelper} handles all the shared -preferencegroups you need backed up. -

          - - -

          Request a Backup

          -

          In order to request a backup, just create an instance of the {@link -android.app.backup.BackupManager}, and call it's {@link -android.app.backup.BackupManager#dataChanged()} method.

          - -
          -import android.app.backup.BackupManager;
          -...
          -
          -public void requestBackup() {
          -  BackupManager bm = new BackupManager(this);
          -  bm.dataChanged();
          -}
          -
          - -

          This call notifies the backup manager that there is data ready to be backed -up to the cloud. At some point in the future, the backup manager then calls -your backup agent's {@link -android.app.backup.BackupAgent#onBackup(ParcelFileDescriptor, BackupDataOutput, -ParcelFileDescriptor) onBackup()} method. You can make -the call whenever your data has changed, without having to worry about causing -excessive network activity. If you request a backup twice before a backup -occurs, the backup only occurs once.

          - - -

          Restore from a Backup

          -

          Typically you shouldn't ever have to manually request a restore, as it -happens automatically when your application is installed on a device. However, -if it is necessary to trigger a manual restore, just call the -{@link android.app.backup.BackupManager#requestRestore(RestoreObserver) requestRestore()} method.

          diff --git a/docs/html/training/backup/index.jd b/docs/html/training/backup/index.jd deleted file mode 100644 index 4449fde1d5c3c12f2a72f283c2e62c93d91fec9b..0000000000000000000000000000000000000000 --- a/docs/html/training/backup/index.jd +++ /dev/null @@ -1,47 +0,0 @@ -page.title=Backing up App Data to the Cloud -page.tags=cloud,sync,backup - -trainingnavtop=true -startpage=true - -@jd:body - -
          -
          - -

          Dependencies and prerequisites

          -
            -
          • Android 2.2 (API level 8) and higher
          • -
          -
          -
          - -

          Users often invest significant time and effort creating data and setting -preferences within apps. Preserving that data for users if they replace a broken -device or upgrade to a new one is an important part of ensuring a great user -experience.

          - -

          This class covers techniques for backing up data to the cloud so that -users can restore their data when recovering from a data loss (such as a factory -reset) or installing your application on a new device.

          - -

          It is important to note that the API for cloud backup changed with the -release of Android 6.0 (API level 23). For your app to support backup both -on devices running Android 6.0, and those running Android 5.1 (API level -22) and lower, you must implement both techniques that this class explains.

          - -

          Lessons

          - -
          -
          Configuring Auto Backup for Apps
          -
          This lesson applies to Android 6.0 (API level 23) and higher. Learn how to accomplish - seamless app data backup and restore with zero additional lines of application code.
          -
          - -
          -
          Using the Backup API
          -
          This lesson applies to Android 5.1 (API level 22) and lower. Learn how to integrate the Backup - API into your Android app, so all of that app's user data, such as preferences, notes, and high - scores, updates seamlessly across all devices linked to that Google account.
          -
          - diff --git a/docs/html/training/basics/firstapp/building-ui.jd b/docs/html/training/basics/firstapp/building-ui.jd index a680c733f99e7edb62a02551f39ea1c12672286d..6f321e990ce5dd20501a3245fa32d9878b7a6de1 100644 --- a/docs/html/training/basics/firstapp/building-ui.jd +++ b/docs/html/training/basics/firstapp/building-ui.jd @@ -71,17 +71,17 @@ android.view.View} objects.

          Create a Linear Layout

            -
          1. From the res/layout/ directory, open the - activity_main.xml file. +
          2. In Android Studio's Project window, open app > res > + layout > activity_main.xml.

            This XML file defines the layout of your activity. It contains the default "Hello World" text view.

          3. When you open a layout file, you’re first shown the design editor in the Layout Editor. For this lesson, - you work directly with the XML, so click the Text tab to switch to - the text editor. + you work directly with the XML, so click the Text tab at the bottom + of the window to switch to the text editor.
          4. -
          5. Replace the contents of the file with the following XML: +
          6. Delete everything and insert the following XML:
            <?xml version="1.0" encoding="utf-8"?>
             <LinearLayout
                 xmlns:android="http://schemas.android.com/apk/res/android"
            @@ -138,6 +138,9 @@ href="{@docRoot}guide/topics/ui/declaring-layout.html">Layout guide.

            </LinearLayout>
            +

            Don't worry about the error that appears for +@string/edit_message; you'll fix that soon.

            +

            Here is a description of the attributes in the {@link android.widget.EditText <EditText>} you added:

            @@ -157,7 +160,7 @@ XML. It is followed by the resource type ({@code id} in this case), a slash, the

            A resource object is a unique integer name that's associated with an app resource, such as a bitmap, layout file, or string.

            Every resource has a -corresponding resource object defined in your project's {@code gen/R.java} file. You can use the +corresponding resource object defined in your project's {@code R.java} file. You can use the object names in the {@code R} class to refer to your resources, such as when you need to specify a string value for the {@code android:hint} @@ -174,7 +177,7 @@ href="{@docRoot}guide/topics/resources/providing-resources.html">Providing Resou

            The plus sign (+) before the resource type is needed only when you're defining a resource ID for the first time. When you compile the app, the SDK tools use the ID name to create a new resource ID in -your project's {@code gen/R.java} file that refers to the {@link +your project's {@code R.java} file that refers to the {@link android.widget.EditText} element. With the resource ID declared once this way, other references to the ID do not need the plus sign. Using the plus sign is necessary only when specifying a new resource ID and not @@ -211,10 +214,10 @@ the same name does not cause collisions.

            Add String Resources

            By default, your Android project includes a string resource file at -res/values/strings.xml. Here, you'll add two new strings.

            +res > values > strings.xml. Here, you'll add two new strings.

              -
            1. From the res/values/ directory, open strings.xml.
            2. +
            3. From the Project window, open res > values > strings.xml.
            4. Add two strings so that your file looks like this:
              <?xml version="1.0" encoding="utf-8"?>
               <resources>
              @@ -340,15 +343,12 @@ android.widget.LinearLayout}.

              Run Your App

              -

              This layout is applied by the default {@link android.app.Activity} class -that the SDK tools generated when you created the project.

              - -

              To run the app and see the results, - click Run 'app' +

              To see how the app now looks on your device or emulator, + click Run in the toolbar.

              -

              Continue to the next -lesson to learn how to respond to button presses, read content -from the text field, start another activity, and more.

              \ No newline at end of file +

              To add app behaviors such as responding to a button and starting +another activity, continue to the next +lesson.

              \ No newline at end of file diff --git a/docs/html/training/basics/firstapp/creating-project.jd b/docs/html/training/basics/firstapp/creating-project.jd index cad32bf077d87b54b4b1059960ff8b7279ec9d71..60be5f6a3ab42d2b1cc3b0ef1b0f8cd97030b538 100644 --- a/docs/html/training/basics/firstapp/creating-project.jd +++ b/docs/html/training/basics/firstapp/creating-project.jd @@ -31,129 +31,71 @@ next.link=running-app.html
              1. In Android Studio, create a new project:
                  -
                • If you don't have a project opened, in the Welcome screen, click - New Project.
                • -
                • If you have a project opened, from the File menu, select New - Project. The Create New Project screen appears.
                • +
                • If you don't have a project opened, in the Welcome to Android Studio window, click + Start a new Android Studio project.
                • +
                • If you have a project opened, select File > New Project.
              2. -
              3. Fill out the fields on the screen. For Application Name - use "My First App". For Company Domain, use "example.com". - For the other fields, use the default values and click Next -

                Here's a brief explanation of each field:

                +
              4. In the New Project screen, enter the following values:

                  -
                • Application Name is the app name that appears to users.
                • -
                • Company domain provides a qualifier that will be appended to the package - name; Android Studio will remember this qualifier for each new project you create.
                • -
                • Package name is the fully qualified name for the project (following the - same rules as those for naming packages in the Java programming language). Your package name - must be unique across all packages installed on the Android system. You can - Edit this value independently from the application name or the company - domain.
                • -
                • Project location is the directory on your system that holds the project - files.
                • +
                • Application Name: "My First App"
                • +
                • Company Domain: "example.com"
                +

                Android Studio fills in the package name and project location for you, + but you can edit these if you'd like.

              5. -
              6. Under Target Android Devices, accept the default values - and click Next. -

                The Minimum Required SDK is the earliest version of Android that your app supports, - indicated using the +

              7. Click Next.
              8. +
              9. In the Target Android Devices screen, keep the default values and + click Next. +

                The Minimum Required SDK is the earliest version of Android that your app supports, + which is indicated by the API level. To support as many devices as possible, you should set this to the lowest version available that allows your app to provide its core feature set. If any feature of your - app is possible only on newer versions of Android and it's not critical to the app's core - feature set, you can enable the feature only when running on the versions that support it (as - discussed in + app is possible only on newer versions of Android and it's not critical to the core + feature set, enable that feature only when running on the versions that support it (see + Supporting Different Platform Versions).

              10. -
              11. Under Add an Activity to Mobile, select Empty +
              12. In the Add an Activity to Mobile screen, select Empty Activity and click Next.
              13. - - -
              14. Under Customize the Activity, accept the default values +
              15. In the Customize the Activity screen, keep the default values and click Finish.
              -

              Your Android project is now a basic "Hello World" app that contains some default files. Take a -moment to review the most important of these:

              +

              After some processing, Android Studio opens and displays a "Hello World" app +with default files. You will add functionality to some of +these files in the following lessons.

              + +

              Now take a moment to review the most important files. First, be sure that +the Project window is open (select View > Tool Windows > Project) +and the Android view is selected from the drop-down list at the top. +You can then see the following files:

              -
              app/src/main/java/com.example.myfirstapp/MainActivity.java
              +
              app > java > com.example.myfirstapp > MainActivity.java
              This file appears in Android Studio after the New Project wizard finishes. It contains the class definition for the activity you created earlier. When you build and run the app, the {@link android.app.Activity} starts and loads the layout file that says "Hello World!"
              -
              app/src/main/res/layout/activity_main.xml
              +
              app > res > layout > activity_main.xml
              This XML file defines the layout of the activity. It contains a {@code TextView} element with the text "Hello world!".
              -
              app/src/main/AndroidManifest.xml
              +
              app > manifests > AndroidManifest.xml
              The manifest file describes the fundamental characteristics of the app and defines each of its components. You'll revisit this file as you follow these lessons and add more components to your app.
              -
              app/build.gradle
              + +
              Gradle Scripts > build.gradle
              Android Studio uses Gradle to compile and build your app. There is a build.gradle file for each module of your project, as well as a build.gradle file for the entire - project. Usually, you're only interested in the build.gradle file for the module, - in this case the app or application module. This is where your app's build dependencies - are set, including the defaultConfig settings: -
                -
              • compiledSdkVersion is the platform version against which you will compile - your app. By default, this is set to the latest version of Android available in your SDK. - By default, this is set to the latest version of Android SDK installed on your - development machine. - You can still build your app to support older versions, but setting this to the latest - version allows you to enable new features and optimize your app for a great user experience - on the latest devices.
              • -
              • applicationId is the fully qualified package name for your application that - you specified in the New Project wizard.
              • -
              • minSdkVersion is the Minimum SDK version you specified during the New Project - wizard. This is the earliest version of the Android SDK that your app supports.
              • -
              • targetSdkVersion indicates the highest version of Android with which you have - tested your application. As new versions of Android become available, you should - test your app on the new version and update this value to match the latest API level and - thereby take advantage of new platform features. For more information, read - Supporting Different - Platform Versions.
              • -
              -

              See Building Your Project with Gradle - for more information about Gradle.

              -
              - -

              Note also the /res subdirectories that contain the -resources for your application:

              -
              -
              drawable-<density>/
              -
              Directories for - drawable resources, other than launcher icons, designed - for various densities. -
              -
              layout/
              -
              Directory for files that define your app's user interface like {@code activity_main.xml}, - discussed above, which describes a basic layout for the {@code MainActivity} - class.
              -
              menu/
              -
              Directory for files that define your app's menu items.
              -
              mipmap/
              -
              Launcher icons reside in the {@code mipmap/} folder rather than the - {@code drawable/} folders. This folder contains the {@code ic_launcher.png} image - that appears when you run the default app.
              -
              values/
              -
              Directory for other XML files that contain a collection of resources, such as - string and color definitions.
              + project. Usually, you're only interested in the build.gradle file for the module. + in this case the app or application module. For more information about this file, + see Building Your Project with Gradle.

              diff --git a/docs/html/training/basics/firstapp/running-app.jd b/docs/html/training/basics/firstapp/running-app.jd index e8098711b9a91d9698f88439ddcdcde17a940606..085849fe34d60c45d4f535646930ab919df85dcb 100755 --- a/docs/html/training/basics/firstapp/running-app.jd +++ b/docs/html/training/basics/firstapp/running-app.jd @@ -3,9 +3,7 @@ parent.title=Building Your First App parent.link=index.html trainingnavtop=true - page.tags=emulator -helpoutsWidget=true @jd:body @@ -18,7 +16,7 @@ helpoutsWidget=true

              1. Run on a Real Device
              2. -
              3. Run on the Emulator
              4. +
              5. Run on an Emulator

              You should also read

              @@ -34,8 +32,10 @@ helpoutsWidget=true

              In the previous lesson, you created an - Android project. The project contains a default app that displays - "Hello World". In this lesson, you will run the app on a device or emulator.

              +Android project that displays "Hello World." You can now run the app on a real +device or on an emulator. If you don't have a real device available, skip to +Run on an Emulator.

              +

              Run on a Real Device

              @@ -68,7 +68,7 @@ helpoutsWidget=true

              Android Studio installs the app on your connected device and starts it.

              -

              Run on the Emulator

              +

              Run on an Emulator

              Before you run your app on an emulator, you need to create an Android Virtual Device (AVD) @@ -82,12 +82,14 @@ helpoutsWidget=true Tools > Android > AVD Manager, or by clicking the AVD Manager icon in the toolbar.

            5. -
            6. On the AVD Manager main screen, click Create Virtual Device.
            7. -
            8. In the Select Hardware page, select a phone device, such as Nexus 6, - then click Next. +
            9. In the Your Virtual Devices screen, click Create Virtual Device.
            10. +
            11. In the Select Hardware screen, select a phone device, such as Nexus 6, + and then click Next.
            12. -
            13. In the Select Image page, choose the desired system image for the AVD and +
            14. In the System Image screen, choose the desired system image for the AVD and click Next. +

              If you don't have a particular system image installed, + you can get it by clicking the download link.

            15. Verify the configuration settings (for your first AVD, leave all the settings as they are), and then click Finish. diff --git a/docs/html/training/basics/firstapp/starting-activity.jd b/docs/html/training/basics/firstapp/starting-activity.jd index ebf42cbe04382d3b3b3579417941c01804187cb7..4385d1304b7f6767299e4f124f8083ae5b250800 100644 --- a/docs/html/training/basics/firstapp/starting-activity.jd +++ b/docs/html/training/basics/firstapp/starting-activity.jd @@ -38,7 +38,7 @@ starts a new activity when the user clicks the Send button.

              Respond to the Send Button

                -
              1. In the file res/layout/activity_main.xml, add the +
              2. In the file res > layout > activity_main.xml, add the {@code android:onClick} attribute to the {@link android.widget.Button <Button>} element as shown below: @@ -52,7 +52,7 @@ starts a new activity when the user clicks the Send button.

                method in your activity whenever a user clicks on the button.

              3. -
              4. In the file java/com.example.myfirstapp/MainActivity.java, +
              5. In the file java > com.example.myfirstapp > MainActivity.java, add the sendMessage() method stub as shown below:
                public class MainActivity extends AppCompatActivity {
                @@ -85,7 +85,9 @@ starts a new activity when the user clicks the Send button.

                Next, you’ll fill in this method to read the contents of the text field and deliver that text to another activity.

                +

                Build an Intent

                +

                An {@link android.content.Intent} is an object that provides runtime binding between separate components (such as two activities). The {@link android.content.Intent} represents an app’s "intent to do something." @@ -113,13 +115,22 @@ another activity.

                } }
                -

                Note: Android Studio will display - Cannot resolve symbol errors because the code references classes - like {@link android.content.Intent} and {@link android.widget.EditText} - that have not been imported. To import these classes, you can either 1) - use Android Studio's "import class" functionality by pressing Alt + Enter - (Option + Return on Mac) or 2) manually add import statements at the top of - the file.

                +

                Android Studio will display Cannot +resolve symbol errors because this code references classes that are not +imported. You can solve some of these with Android Studio's "import class" +functionality by pressing Alt + Enter (or Option + Return on Mac). +Your imports should end up as the following:

                +
                +import android.content.Intent;
                +import android.support.v7.app.AppCompatActivity;
                +import android.os.Bundle;
                +import android.view.View;
                +import android.widget.EditText;
                +
                + +

                An error remains for DisplayMessageActivity, but that's okay; +you'll fix that in the next section. +

                There’s a lot going on in sendMessage(), so let’s explain what's going on.

                @@ -150,6 +161,7 @@ another activity.

                method starts an instance of the DisplayMessageActivity specified by the {@link android.content.Intent}. Now you need to create the class.

                +

                Create the Second Activity

                  @@ -169,7 +181,8 @@ another activity.

                1. Creates the corresponding layout file activity_display_message.xml
                2. Adds the required - <activity> + <activity> element in AndroidManifest.xml.
        @@ -199,7 +212,16 @@ protected void onCreate(Bundle savedInstanceState) { layout.addView(textView); } -
      1. Press Alt + Enter (option + return on Mac) to import missing classes.
      2. +
      3. Press Alt + Enter (or Option + Return on Mac) to import missing classes. + Your imports should end up as the following: +
        +import android.content.Intent;
        +import android.support.v7.app.AppCompatActivity;
        +import android.os.Bundle;
        +import android.view.ViewGroup;
        +import android.widget.TextView;
        +
        +

      There’s a lot going on here, so let’s explain:

      diff --git a/docs/html/training/basics/network-ops/data-saver.jd b/docs/html/training/basics/network-ops/data-saver.jd index 75b72645282ad3105d6f1a525807efe80c87a982..babf7c67a66355a0798f1eecfd2c53398fb4101d 100644 --- a/docs/html/training/basics/network-ops/data-saver.jd +++ b/docs/html/training/basics/network-ops/data-saver.jd @@ -45,7 +45,7 @@ next.link=xml.html

      - The N Developer Preview extends the {@link android.net.ConnectivityManager} + Android 7.0 (API level 24) extends the {@link android.net.ConnectivityManager} API to provide apps with a way to retrieve the user’s Data Saver preferences and monitor preference changes. It is considered good practice for apps to check whether the @@ -58,7 +58,7 @@ next.link=xml.html

      - In the N Developer Preview, apps can use the {@link + In Android 7.0 (API level 24), apps can use the {@link android.net.ConnectivityManager} API to determine what data usage restrictions are being applied. The {@code getRestrictBackgroundStatus()} method returns one of the following values: diff --git a/docs/html/training/best-performance.jd b/docs/html/training/best-performance.jd index 8ea6fd5be4e5104703a57224436411246e9643e0..bb88e990ce486161632d0e9b24d5e24307243fb2 100644 --- a/docs/html/training/best-performance.jd +++ b/docs/html/training/best-performance.jd @@ -5,4 +5,9 @@ page.trainingcourse=true

      These classes and articles help you build an app that's smooth, responsive, -and uses as little battery as possible.

      \ No newline at end of file +and uses as little battery as possible.

      + +

      Along with this section, you can find additional information about optimizing +your app in the Performance and +Power section.

      + diff --git a/docs/html/training/camera/videobasics.jd b/docs/html/training/camera/videobasics.jd index 6da239a33031359ac99f7a96c6211596676a160a..b20cfefdf350c4a132ddb2bb91d9bab7b38f32ab 100644 --- a/docs/html/training/camera/videobasics.jd +++ b/docs/html/training/camera/videobasics.jd @@ -108,7 +108,7 @@ retrieves this video and displays it in a {@link android.widget.VideoView}.

       @Override
      -protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      +protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
           if (requestCode == REQUEST_VIDEO_CAPTURE && resultCode == RESULT_OK) {
               Uri videoUri = intent.getData();
               mVideoView.setVideoURI(videoUri);
      diff --git a/docs/html/training/constraint-layout/images/alignment-constraint-offset_2x.png b/docs/html/training/constraint-layout/images/alignment-constraint-offset_2x.png
      new file mode 100644
      index 0000000000000000000000000000000000000000..1e4867e6513a3ebd1570fc3a3ffe89733edbe5f0
      Binary files /dev/null and b/docs/html/training/constraint-layout/images/alignment-constraint-offset_2x.png differ
      diff --git a/docs/html/training/constraint-layout/images/alignment-constraint_2x.png b/docs/html/training/constraint-layout/images/alignment-constraint_2x.png
      new file mode 100644
      index 0000000000000000000000000000000000000000..afe7d4aed282bb3b5a58b4bf53796f941d238de9
      Binary files /dev/null and b/docs/html/training/constraint-layout/images/alignment-constraint_2x.png differ
      diff --git a/docs/html/training/constraint-layout/images/baseline-constraint_2x.png b/docs/html/training/constraint-layout/images/baseline-constraint_2x.png
      new file mode 100644
      index 0000000000000000000000000000000000000000..dfc35226fdb57c5218525f552db9a63ca2f4aaa4
      Binary files /dev/null and b/docs/html/training/constraint-layout/images/baseline-constraint_2x.png differ
      diff --git a/docs/html/training/constraint-layout/images/constraint-fail-fixed_2x.png b/docs/html/training/constraint-layout/images/constraint-fail-fixed_2x.png
      new file mode 100644
      index 0000000000000000000000000000000000000000..be9d54f4fbf50ad2ce1ef71fcb785b3a5478f9c9
      Binary files /dev/null and b/docs/html/training/constraint-layout/images/constraint-fail-fixed_2x.png differ
      diff --git a/docs/html/training/constraint-layout/images/constraint-fail_2x.png b/docs/html/training/constraint-layout/images/constraint-fail_2x.png
      new file mode 100644
      index 0000000000000000000000000000000000000000..3f28ef7906abe9e27dc46842736c79eb1d0a9fe0
      Binary files /dev/null and b/docs/html/training/constraint-layout/images/constraint-fail_2x.png differ
      diff --git a/docs/html/training/constraint-layout/images/layout-editor-convert-to-constraint_2x.png b/docs/html/training/constraint-layout/images/layout-editor-convert-to-constraint_2x.png
      new file mode 100644
      index 0000000000000000000000000000000000000000..ace31a6105d99af382a89f77d2739bd59e9ff794
      Binary files /dev/null and b/docs/html/training/constraint-layout/images/layout-editor-convert-to-constraint_2x.png differ
      diff --git a/docs/html/training/constraint-layout/images/layout-editor-margin-callout_2-2_2x.png b/docs/html/training/constraint-layout/images/layout-editor-margin-callout_2-2_2x.png
      new file mode 100644
      index 0000000000000000000000000000000000000000..07680227fbb731261eb93579ed0d8af5578879ff
      Binary files /dev/null and b/docs/html/training/constraint-layout/images/layout-editor-margin-callout_2-2_2x.png differ
      diff --git a/docs/html/training/constraint-layout/images/layout-editor-properties-callouts_2-2_2x.png b/docs/html/training/constraint-layout/images/layout-editor-properties-callouts_2-2_2x.png
      new file mode 100644
      index 0000000000000000000000000000000000000000..b4ffb2cd946a0c5f85010cf68fdac6c226a712cd
      Binary files /dev/null and b/docs/html/training/constraint-layout/images/layout-editor-properties-callouts_2-2_2x.png differ
      diff --git a/docs/html/training/constraint-layout/images/layout-editor_2-2_2x.png b/docs/html/training/constraint-layout/images/layout-editor_2-2_2x.png
      new file mode 100644
      index 0000000000000000000000000000000000000000..72a4e401a05cc078c6f8886cee80fa65fa0ab1ba
      Binary files /dev/null and b/docs/html/training/constraint-layout/images/layout-editor_2-2_2x.png differ
      diff --git a/docs/html/training/constraint-layout/images/parent-constraint_2x.png b/docs/html/training/constraint-layout/images/parent-constraint_2x.png
      new file mode 100644
      index 0000000000000000000000000000000000000000..0414f1d5b34bde4b63001e1a60bae57fa6102219
      Binary files /dev/null and b/docs/html/training/constraint-layout/images/parent-constraint_2x.png differ
      diff --git a/docs/html/training/constraint-layout/images/position-constraint_2x.png b/docs/html/training/constraint-layout/images/position-constraint_2x.png
      new file mode 100644
      index 0000000000000000000000000000000000000000..9f93e72dcd4d833e0201d301ff1c79606f7288be
      Binary files /dev/null and b/docs/html/training/constraint-layout/images/position-constraint_2x.png differ
      diff --git a/docs/html/training/constraint-layout/images/thumbnail-add-layout-guideline_2-2.png b/docs/html/training/constraint-layout/images/thumbnail-add-layout-guideline_2-2.png
      new file mode 100644
      index 0000000000000000000000000000000000000000..f863e5f99bd1feaf87037ed00fb9fe489ae79e8a
      Binary files /dev/null and b/docs/html/training/constraint-layout/images/thumbnail-add-layout-guideline_2-2.png differ
      diff --git a/docs/html/training/constraint-layout/images/thumbnail-adjust-constraint-bias.png b/docs/html/training/constraint-layout/images/thumbnail-adjust-constraint-bias.png
      new file mode 100644
      index 0000000000000000000000000000000000000000..d61e9b2354f1e39f760f90952cfd5e4dc72ae715
      Binary files /dev/null and b/docs/html/training/constraint-layout/images/thumbnail-adjust-constraint-bias.png differ
      diff --git a/docs/html/training/constraint-layout/images/thumbnail-studio-constraint-first.png b/docs/html/training/constraint-layout/images/thumbnail-studio-constraint-first.png
      new file mode 100644
      index 0000000000000000000000000000000000000000..97471025b00728cfbc1af9ebcbeea9a7a241f824
      Binary files /dev/null and b/docs/html/training/constraint-layout/images/thumbnail-studio-constraint-first.png differ
      diff --git a/docs/html/training/constraint-layout/images/thumbnail-studio-constraint-second.png b/docs/html/training/constraint-layout/images/thumbnail-studio-constraint-second.png
      new file mode 100644
      index 0000000000000000000000000000000000000000..940b8495527885915f731fa4b7d16f22c0c6b2dd
      Binary files /dev/null and b/docs/html/training/constraint-layout/images/thumbnail-studio-constraint-second.png differ
      diff --git a/docs/html/training/constraint-layout/index.html b/docs/html/training/constraint-layout/index.html
      new file mode 100644
      index 0000000000000000000000000000000000000000..62eaf15f62a7e2167312fddbf1070f0408aec96d
      --- /dev/null
      +++ b/docs/html/training/constraint-layout/index.html
      @@ -0,0 +1,498 @@
      +
      +
      +  Build a Responsive UI with ConstraintLayout
      +  
      +  
      +  
      +
      +
      +
      +
      +
      +
      +

      ConstraintLayout allows you to create large and complex layouts with a flat view +hierarchy (no nested view groups). It's similar to RelativeLayout in that all views are +layed out according to relationships between sibling views and the parent layout, but it's more +flexible than RelativeLayout and easier to use with Android Studio's Layout Editor. +

      + +

      Everything you can do with ConstraintLayout is available directly from the Layout Editor's visual +tools, because the layout API and the Layout Editor were specially built for each other. So you can +build your layout with ConstraintLayout entirely by drag-and-dropping instead of editing the XML. +

      + + +

      Figure 1. A ConstraintLayout in the Layout Editor

      + + +

      +ConstraintLayout is available in an API library that's compatible with Android +2.3 (API level 9) and higher, and the new layout editor is available in Android +Studio 2.2 and higher. +

      + +

      +This page provides a guide to building a layout with ConstraintLayout in Android +Studio. If you'd like more information about the Layout Editor itself, see the +Android Studio guide to Build a UI with +Layout Editor. +

      + + +

      Constraints overview

      +

      +To define a view's position in ConstraintLayout, you must add two +or more constraints for the view. Each constraint represents a connection or +alignment to another view, the parent layout, or an invisible guideline. Each +constraint defines the view's position along either the +vertical or horizontal axis; so each view must have a minimum of one constraint for each +axis, but often more are necessary. +

      + +

      +When you drop a view into the Layout Editor, it stays where you leave it even if +it has no constraints. However, this is only to make editing easier; if a view has +no constraints when you run your layout on a device, it is drawn at +position [0,0] (the top-left corner).

      + +

      In figure 2, the layout looks good in the +editor, but there's no vertical constraint on TextView B. When this +layout draws on a device, TextView B horizontally aligns with the left and +right edges of the ImageView, but appears at the top of the screen because +it has no vertical constraint. +

      + +
      +
      + +

      Figure 2. TextView B is missing a +vertical constraint

      +
      +
      + +

      Figure 3. TextView B is now vertically +constrained to the ImageView

      +
      +
      + +

      +Although a missing constraint won't cause a compilation error, the Layout Editor +indicates missing constraints as an error in the toolbar. To view the errors and +other warnings, click Show Warnings and Errors +. +To help you avoid missing constraints, the Layout Editor can automatically add +constraints for you with the Autoconnect and infer +constraints features. +

      + + +

      Add ConstraintLayout to your project

      +

      +To use ConstraintLayout in your project, proceed as follows: +

      + +
        +
      1. Ensure you have the latest Constraint Layout library: +
          +
        1. Click Tools > Android > SDK Manager. +
        2. Click the SDK Tools tab. +
        3. Expand Support Repository and then check +ConstraintLayout for Android and Solver for ConstraintLayout. +Check Show Package Details and take note of the version you're downloading +(you'll need this below).

          +
        4. Click OK. +
        5. Add the ConstraintLayout library as a dependency in your module-level + build.gradle file: +
          +dependencies {
          +    compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha8'
          +}
          +
          +

          The library version you download may be higher, so be sure the value you specify + here matches the version from step 3.

          +
        6. +
        7. In the toolbar or sync notification, click Sync Project with Gradle +Files.
        8. +
        +
      2. +
      + +

      Now you're ready to build your layout with ConstraintLayout.

      + +

      Convert a layout

      + +
      + +

      + Figure 4. The menu to convert a layout to ConstraintLayout

      +
      + +

      To convert an existing layout to a constraint layout, follow these steps:

      +
        +
      1. Open your layout in Android Studio and click the Design tab +at the bottom of the editor window. +
      2. In the Component Tree window, right-click the layout and +click Convert layout to ConstraintLayout.
      3. +
      + +

      Create a new layout

      + +

      To start a new constraint layout file, follow these steps:

      +
        +
      1. Click anywhere in the Project window and then select +File > New > XML > Layout XML. +
      2. Enter a name for the layout file and enter +"android.support.constraint.ConstraintLayout" for the Root Tag. +
      3. Click Finish.
      4. +
      + + +

      Add a constraint

      + +

      Start by dragging a view from the Palette window into the editor. +When you add a view in a ConstraintLayout, it displays a bounding box with square +resizing handles on each corner and circular constraint handles on each side. +

      + + +
      +
      + +
      +

      +Video 1. The left side of a view is constrained to the left side of the parent +

      +
      + +

      +Click the view to select it. Then click-and-hold one of the +constraint handles and drag the line to an available anchor point (the edge of +another view, the edge of the layout, or a guideline). When you release, the +constraint is made, with a default margin +separating the two views. +

      + +

      When creating constraints, remember the following rules:

      + +
        +
      • Every view must have at least two constraints: one horizontal and one +vertical. +
      • You can create constraints only between a constraint handle and an anchor +point that share the same plane. So a vertical plane (the left and right sides) +of a view can be constrained only to another vertical plane; and baselines can +constrain only to other baselines. +
      • Each constraint handle can be used for just one constraint, but you can +create multiple constraints (from different views) to the same anchor +point.
      • +
      + + + +
      +
      + +
      +

      +Video 2. Adding a constraint that opposes an existing one +

      +
      + + + +

      +To remove a constraint, select the view and then click the constraint handle. +

      + +

      If you add opposing constraints on a view, the constraint lines become squiggly +like a spring to indicate the opposing forces, as shown in video 2. The effect +is most visible when the view size is set to "fixed" or "wrap content," in which +case the view is centered between the constraints. If you instead +want the view to stretch its size to meet the constraints, switch the size to "any size"; or if you want +to keep the current size but move the view so that it is not centered, adjust the constraint bias. +

      + + + +

      +There are many ways to constrain a view, but the following constraint types +provide the basic building blocks. +

      + + + + +

      Parent constraint

      +
      +
      +

      + Connect the side of a view to the corresponding edge of the layout. +

      + In figure 5, the left side of a view is connected to the left edge of the + parent layout. +

      +

      +
      + +

      Figure 5. A horizontal constraint to the parent

      +
      +
      + + +

      Position constraint

      +
      +
      +

      Define the order of appearance for two views, either vertically or horizontally.

      +

      In figure 6, a Button is constrained below an ImageView with a 24dp +margin.

      +
      +
      + +

      Figure 6. A vertical position constraint

      +
      +
      + + + +

      Alignment constraint

      +
      +
      +

      Align the edge of a view to the same edge of another view.

      +

      In figure 7, the left side of a Button is aligned to the left side of an +ImageView.

      +

      You can offset the alignment by dragging the view +inward from the constraint. For example, figure 8 shows the same +Button with a 24dp offset alignment. +The offset is defined by the constrained view's margin.

      +
      +
      + +

      Figure 7. A horizontal alignment constraint

      +
      +
      + +

      Figure 8. An offset horizontal alignment constraint

      +
      +
      + + +

      Baseline alignment constraint

      +
      +
      +

      Align the text baseline of a view to the text baseline of another view.

      +

      In figure 9, the first line of a TextView is aligned with the text in a +Button.

      +

      To create a baseline constraint, hover your mouse over the baseline handle for +two seconds until the handle blinks white. Then click and drag the line to +another baseline.

      +
      +
      + +

      Figure 9. A baseline alignment constraint

      +
      +
      + + + + + +

      Constrain to a guideline

      +
      +
      + +

      +You can add a vertical or horizontal guideline to which you can attach +constraints. You can position the guideline within the layout based on either dp +units or percent, relative to the layout's edge. +

      + +

      +To create a guideline, click Guidelines + +in the toolbar, and then click either Add Vertical Guideline +or Add Horizontal Guideline. +

      + +

      +Click the circle at the edge of the guideline to toggle the measurements used to +position the guideline (either percent or dp units from the layout's edge). +

      + +

      +Guidelines are not visible to your users. +

      +
      + +
      +
      + +
      +

      Video 3. Adding a constraint to a guideline

      +
      +
      + + +

      Use Autoconnect and Infer Constraints

      + +
      +
      + +
      +

      Video 4. Adding a view with Autoconnect enabled

      +
      + +

      +Autoconnect is a persistent mode that automatically creates two or more +constraints for each view you add to the layout. Autoconnect is disabled by +default. You can enable it by clicking Turn on Autoconnect + +in the Layout Editor toolbar. +

      + +

      While enabled, Autoconnect creates constraints for each view as you add them; it does not create +constraints for existing views in the layout. If you drag a view once the constraints are made, the +constraints do not change (though the margins do), so you must delete the constraints if you want to +significantly reposition the view.

      + +

      Alternatively, you can click Infer Constraints + +to create constraints for all views in the layout. +

      + +

      Infer Constraints is a one-time action that scans the entire layout to determine the most +effective set of constraints for all views, so it may create constraints between elements that are +far from each other. Autoconnect, however, creates constraints only for the view you are adding, and +it creates constraints to only the nearest elements. In either case, you can always modify a +constraint by clicking the constraint handle to delete it, and then create a new constraint.

      + + +

      Adjust the view size

      + +

      +You can use the handles on each corner of the view to resize it, but doing so +hard codes the width and height values, which you should avoid for most views +because hard-coded view sizes cannot adapt to different content and screen +sizes. To select from one of the dynamic sizing modes or to define more specific +dimensions, click a view and open the Properties + +window on the right side of the editor. At the top of the window is the view +inspector, as shown in figure 10. +

      +
      + +

      Figure 10. The Properties window includes controls for +(1) view size, (2) margins, and +(3) constraint bias.

      +
      + +

      +The grey square represents the selected view. The symbols inside the square +represent the height and width settings as follows: +

      + +
        +
      • + + Wrap Content: The view expands exactly as needed to fit its +contents. +
      • + + Any Size: The view expands exactly as needed to match the +constraints. The actual value is 0dp because the view has no desired dimensions, but +it resizes as needed to meet the constraints. However, if the given dimension +has only one constraint, then the view expands to fit its contents. Another way +to think of it is "match constraints" (instead of match_parent) because it +expands the view as much as possible after accounting for the limits of each +constraint and its margins. +
      • + + Fixed: You specify the dimension in the text box below or by +resizing the view in the editor.
      • +
      + +

      To toggle between these settings, click the symbols.

      + +

      Note: You should not use match_parent for any view +in a ConstraintLayout. Instead use "Any Size" (0dp). +

      + + +

      Adjust the constraint bias

      + +

      When you add a constraint to both sides of a view (and the view size for the same dimension is +either "fixed" or "wrap content"), the view becomes centered between the two anchor points by +default. When a view is centered, the bias is 50%. You can adjust the bias by dragging the bias +slider in the Properties window or by dragging the view, as shown in video 5.

      + +
      + +
      +

      Video 5. Adjusting the constraint bias

      + +

      If you instead want the view to stretch its size to meet the constraints, switch the size to "any size".

      + + +

      Adjust the view margins

      + +

      To ensure that all your views are evenly spaced, click Margin in the toolbar +to select the default margin for each view that you add to the layout. The button changes to show +your current margin selection. Any change you make to the default margin applies only to the views +you add from then on.

      + + + +

      Figure 11. The toolbar's Margin button. +Click to adjust the default margin. +

      + +

      You can control the margin for each view in the Properties window by clicking +the number on the line that represents each constraint (in figure 10, the margins are each set to +16dp).

      + +

      All margins offered by the tool are factors of 8dp to help your views align to Material Design's +8dp square grid +recommendations.

      + + + diff --git a/docs/html/training/contacts-provider/display-contact-badge.jd b/docs/html/training/contacts-provider/display-contact-badge.jd index d286440998bb9b33be7982d8d1f8c2f17dead4e2..6c9616befe13ff22713c5d1e4b0865e1a39ae185 100644 --- a/docs/html/training/contacts-provider/display-contact-badge.jd +++ b/docs/html/training/contacts-provider/display-contact-badge.jd @@ -113,10 +113,10 @@ trainingnavtop=true

      For Android 3.0 (API level 11) and later, include the following columns in your projection:

        -
      • {@link android.provider.BaseColumns#_ID Contacts._ID}
      • -
      • {@link android.provider.ContactsContract.ContactsColumns#LOOKUP_KEY Contacts.LOOKUP_KEY}
      • +
      • {@link android.provider.ContactsContract.Contacts#_ID Contacts._ID}
      • +
      • {@link android.provider.ContactsContract.Contacts#LOOKUP_KEY Contacts.LOOKUP_KEY}
      • - {@link android.provider.ContactsContract.ContactsColumns#PHOTO_THUMBNAIL_URI + {@link android.provider.ContactsContract.Contacts#PHOTO_THUMBNAIL_URI Contacts.PHOTO_THUMBNAIL_URI}
      @@ -124,8 +124,8 @@ trainingnavtop=true For Android 2.3.3 (API level 10) and earlier, use the following columns:

        -
      • {@link android.provider.BaseColumns#_ID Contacts._ID}
      • -
      • {@link android.provider.ContactsContract.ContactsColumns#LOOKUP_KEY Contacts.LOOKUP_KEY}
      • +
      • {@link android.provider.ContactsContract.Contacts#_ID Contacts._ID}
      • +
      • {@link android.provider.ContactsContract.Contacts#LOOKUP_KEY Contacts.LOOKUP_KEY}

      The remainder of this lesson assumes that you've already loaded a @@ -187,14 +187,14 @@ trainingnavtop=true

      Note: The - {@link android.provider.ContactsContract.ContactsColumns#PHOTO_THUMBNAIL_URI} column isn't available + {@link android.provider.ContactsContract.Contacts#PHOTO_THUMBNAIL_URI} column isn't available in platform versions prior to 3.0. For those versions, you must retrieve the URI from the {@link android.provider.ContactsContract.Contacts.Photo Contacts.Photo} subtable.

      First, set up variables for accessing the {@link android.database.Cursor} containing the - {@link android.provider.BaseColumns#_ID Contacts._ID} and - {@link android.provider.ContactsContract.ContactsColumns#LOOKUP_KEY Contacts.LOOKUP_KEY} columns, as + {@link android.provider.ContactsContract.Contacts#_ID Contacts._ID} and + {@link android.provider.ContactsContract.Contacts#LOOKUP_KEY Contacts.LOOKUP_KEY} columns, as described previously:

      diff --git a/docs/html/training/contacts-provider/modify-data.jd b/docs/html/training/contacts-provider/modify-data.jd
      index e993c5633727579d3101fc12c9dc218d1e8b48d9..64853ef3a7b8e4201e3410ec56f1bb40862c9d12 100644
      --- a/docs/html/training/contacts-provider/modify-data.jd
      +++ b/docs/html/training/contacts-provider/modify-data.jd
      @@ -196,8 +196,8 @@ intent.putExtra(Intents.Insert.EMAIL, mEmailAddress.getText())
           Contacts.CONTENT_LOOKUP_URI}, call
           {@link android.provider.ContactsContract.Contacts#getLookupUri
           Contacts.getLookupUri(id, lookupkey)} with the contact's
      -    {@link android.provider.BaseColumns#_ID Contacts._ID} and
      -    {@link android.provider.ContactsContract.ContactsColumns#LOOKUP_KEY Contacts.LOOKUP_KEY} values as
      +    {@link android.provider.ContactsContract.Contacts#_ID Contacts._ID} and
      +    {@link android.provider.ContactsContract.Contacts#LOOKUP_KEY Contacts.LOOKUP_KEY} values as
           arguments.
       

      diff --git a/docs/html/training/contacts-provider/retrieve-details.jd b/docs/html/training/contacts-provider/retrieve-details.jd index a463b751de5f9c1660f225892c17df063ab3d30e..0de3b6750be462c324b7b1ba328a9039921ae59d 100644 --- a/docs/html/training/contacts-provider/retrieve-details.jd +++ b/docs/html/training/contacts-provider/retrieve-details.jd @@ -55,11 +55,11 @@ trainingnavtop=true

      To retrieve all the details for a contact, search the {@link android.provider.ContactsContract.Data} table for any rows that contain the contact's - {@link android.provider.ContactsContract.ContactsColumns#LOOKUP_KEY}. This column is available in + {@link android.provider.ContactsContract.Data#LOOKUP_KEY}. This column is available in the {@link android.provider.ContactsContract.Data} table, because the Contacts Provider makes an implicit join between the {@link android.provider.ContactsContract.Contacts} table and the {@link android.provider.ContactsContract.Data} table. The - {@link android.provider.ContactsContract.ContactsColumns#LOOKUP_KEY} column is described + {@link android.provider.ContactsContract.Contacts#LOOKUP_KEY} column is described in more detail in the Retrieving Contact Names lesson.

      @@ -85,9 +85,9 @@ trainingnavtop=true the data is in different columns depending on the data type. To ensure you get all the possible columns for all possible data types, you need to add all the column names to your projection. Always retrieve - {@link android.provider.BaseColumns#_ID Data._ID} if you're binding the result + {@link android.provider.ContactsContract.Data#_ID Data._ID} if you're binding the result {@link android.database.Cursor} to a {@link android.widget.ListView}; otherwise, the binding - won't work. Also retrieve {@link android.provider.ContactsContract.DataColumns#MIMETYPE Data.MIMETYPE} + won't work. Also retrieve {@link android.provider.ContactsContract.Data#MIMETYPE Data.MIMETYPE} so you can identify the data type of each row you retrieve. For example:

      @@ -128,7 +128,7 @@ trainingnavtop=true
       

      Define a constant for your selection clause, an array to hold selection arguments, and a variable to hold the selection value. Use - the {@link android.provider.ContactsContract.ContactsColumns#LOOKUP_KEY Contacts.LOOKUP_KEY} column to + the {@link android.provider.ContactsContract.Contacts#LOOKUP_KEY Contacts.LOOKUP_KEY} column to find the contact. For example:

      @@ -153,7 +153,7 @@ trainingnavtop=true
       

      Define the sort order you want in the resulting {@link android.database.Cursor}. To keep all rows for a particular data type together, sort by - {@link android.provider.ContactsContract.DataColumns#MIMETYPE Data.MIMETYPE}. This query argument + {@link android.provider.ContactsContract.Data#MIMETYPE Data.MIMETYPE}. This query argument groups all email rows together, all phone rows together, and so forth. For example:

      @@ -299,7 +299,7 @@ public class DetailsFragment extends Fragment implements
           
           
      Modify the selection text to search for the - {@link android.provider.ContactsContract.DataColumns#MIMETYPE MIMETYPE} value that's specific to + {@link android.provider.ContactsContract.Data#MIMETYPE MIMETYPE} value that's specific to your data type.
      @@ -307,7 +307,7 @@ public class DetailsFragment extends Fragment implements
      Since you're only selecting a single detail type, don't group the returned - {@link android.database.Cursor} by {@link android.provider.ContactsContract.DataColumns#MIMETYPE + {@link android.database.Cursor} by {@link android.provider.ContactsContract.Data#MIMETYPE Data.MIMETYPE}.
      @@ -344,9 +344,9 @@ public class DetailsFragment extends Fragment implements

      Define selection criteria

      Define a search text expression that retrieves rows for a specific contact's - {@link android.provider.ContactsContract.ContactsColumns#LOOKUP_KEY} and the - {@link android.provider.ContactsContract.DataColumns#MIMETYPE Data.MIMETYPE} of the details you - want. Enclose the {@link android.provider.ContactsContract.DataColumns#MIMETYPE MIMETYPE} value in + {@link android.provider.ContactsContract.Data#LOOKUP_KEY} and the + {@link android.provider.ContactsContract.Data#MIMETYPE Data.MIMETYPE} of the details you + want. Enclose the {@link android.provider.ContactsContract.Data#MIMETYPE MIMETYPE} value in single quotes by concatenating a "'" (single-quote) character to the start and end of the constant; otherwise, the provider interprets the constant as a variable name rather than as a string value. You don't need to use a placeholder for this value, because you're @@ -368,10 +368,10 @@ public class DetailsFragment extends Fragment implements

      Define a sort order

      Define a sort order for the returned {@link android.database.Cursor}. Since you're retrieving a - specific data type, omit the sort on {@link android.provider.ContactsContract.DataColumns#MIMETYPE}. + specific data type, omit the sort on {@link android.provider.ContactsContract.Data#MIMETYPE}. Instead, if the type of detail data you're searching includes a subtype, sort on it. For example, for email data you can sort on - {@link android.provider.ContactsContract.CommonDataKinds.CommonColumns#TYPE Email.TYPE}: + {@link android.provider.ContactsContract.CommonDataKinds.Email#TYPE Email.TYPE}:

           private static final String SORT_ORDER = Email.TYPE + " ASC ";
      diff --git a/docs/html/training/contacts-provider/retrieve-names.jd b/docs/html/training/contacts-provider/retrieve-names.jd
      index 7d70ceb2f4df51deafcfa874db1313a864b519e1..49d6e955536c99a136ba65a80d742b644068b4b0 100755
      --- a/docs/html/training/contacts-provider/retrieve-names.jd
      +++ b/docs/html/training/contacts-provider/retrieve-names.jd
      @@ -227,7 +227,7 @@ public class ContactsFragment extends Fragment implements
       

      Note: Since - {@link android.provider.ContactsContract.ContactNameColumns#DISPLAY_NAME_PRIMARY + {@link android.provider.ContactsContract.Contacts#DISPLAY_NAME_PRIMARY Contacts.DISPLAY_NAME_PRIMARY} requires Android 3.0 (API version 11) or later, setting your app's minSdkVersion to 10 or below generates an Android Lint warning in Android Studio. To turn off this warning, add the annotation @@ -261,7 +261,7 @@ public class ContactsFragment extends Fragment implements that displays the contacts, you need to call {@link android.app.Activity#findViewById Activity.findViewById()} using the parent activity of the {@link android.support.v4.app.Fragment}. Use the {@link android.content.Context} of the - parent activity when you call {@link android.widget.AdapterView#setAdapter setAdapter()}. + parent activity when you call {@link android.widget.ListView#setAdapter setAdapter()}. For example:

      @@ -293,7 +293,7 @@ public class ContactsFragment extends Fragment implements
       

      To continue setting up the listener, bind it to the {@link android.widget.ListView} by - calling the method {@link android.widget.AdapterView#setOnItemClickListener + calling the method {@link android.widget.ListView#setOnItemClickListener setOnItemClickListener()} in {@link android.support.v4.app.Fragment#onActivityCreated onActivityCreated()}. For example:

      @@ -318,15 +318,15 @@ public class ContactsFragment extends Fragment implements the {@link android.widget.ListView} displays the contact's display name, which contains the main form of the contact's name. In Android 3.0 (API version 11) and later, the name of this column is - {@link android.provider.ContactsContract.ContactNameColumns#DISPLAY_NAME_PRIMARY + {@link android.provider.ContactsContract.Contacts#DISPLAY_NAME_PRIMARY Contacts.DISPLAY_NAME_PRIMARY}; in versions previous to that, its name is - {@link android.provider.ContactsContract.ContactsColumns#DISPLAY_NAME Contacts.DISPLAY_NAME}. + {@link android.provider.ContactsContract.Contacts#DISPLAY_NAME Contacts.DISPLAY_NAME}.

      - The column {@link android.provider.BaseColumns#_ID Contacts._ID} is used by the + The column {@link android.provider.ContactsContract.Contacts#_ID Contacts._ID} is used by the {@link android.support.v4.widget.SimpleCursorAdapter} binding process. - {@link android.provider.BaseColumns#_ID Contacts._ID} and - {@link android.provider.ContactsContract.ContactsColumns#LOOKUP_KEY} are used together to + {@link android.provider.ContactsContract.Contacts#_ID Contacts._ID} and + {@link android.provider.ContactsContract.Contacts#LOOKUP_KEY} are used together to construct a content URI for the contact the user selects.

      @@ -635,7 +635,7 @@ public class ContactsFragment extends Fragment implements
           
           
    9. The name of the column that contains the custom MIME type value. This name is always - {@link android.provider.ContactsContract.DataColumns#MIMETYPE Data.MIMETYPE}. + {@link android.provider.ContactsContract.Data#MIMETYPE Data.MIMETYPE}.
    10. The custom MIME type value for the data type. As described previously, this is the constant diff --git a/docs/html/training/graphics/opengl/touch.jd b/docs/html/training/graphics/opengl/touch.jd index 6a961da904fad1dbf833bb1eba6b4bfbbfe7a7a8..089ede7b63dac088773da9420cf9eb9de1797555 100644 --- a/docs/html/training/graphics/opengl/touch.jd +++ b/docs/html/training/graphics/opengl/touch.jd @@ -36,7 +36,7 @@ class="button">Download the sample getting some attention, but what if you want to have users interact with your OpenGL ES graphics? The key to making your OpenGL ES application touch interactive is expanding your implementation of {@link android.opengl.GLSurfaceView} to override the {@link -android.view.View#onTouchEvent onTouchEvent()} to listen for touch events.

      +android.opengl.GLSurfaceView#onTouchEvent onTouchEvent()} to listen for touch events.

      This lesson shows you how to listen for touch events to let users rotate an OpenGL ES object.

      @@ -44,7 +44,7 @@ android.view.View#onTouchEvent onTouchEvent()} to listen for touch events.

      Setup a Touch Listener

      In order to make your OpenGL ES application respond to touch events, you must implement the -{@link android.view.View#onTouchEvent onTouchEvent()} method in your +{@link android.opengl.GLSurfaceView#onTouchEvent onTouchEvent()} method in your {@link android.opengl.GLSurfaceView} class. The example implementation below shows how to listen for {@link android.view.MotionEvent#ACTION_MOVE MotionEvent.ACTION_MOVE} events and translate them to an angle of rotation for a shape.

      diff --git a/docs/html/training/implementing-navigation/nav-drawer.jd b/docs/html/training/implementing-navigation/nav-drawer.jd index abc79b64992663801d2cddc105961a9f4c4b63aa..8aebd4b091d9e1f0d64a69a6e5d15052b204ed3f 100644 --- a/docs/html/training/implementing-navigation/nav-drawer.jd +++ b/docs/html/training/implementing-navigation/nav-drawer.jd @@ -148,7 +148,7 @@ public class MainActivity extends Activity { }
    11. -

      This code also calls {@link android.widget.AdapterView#setOnItemClickListener +

      This code also calls {@link android.widget.ListView#setOnItemClickListener setOnItemClickListener()} to receive click events in the navigation drawer's list. The next section shows how to implement this interface and change the content view when the user selects an item.

      @@ -160,7 +160,7 @@ and change the content view when the user selects an item.

      When the user selects an item in the drawer's list, the system calls {@link android.widget.AdapterView.OnItemClickListener#onItemClick onItemClick()} on the {@link android.widget.AdapterView.OnItemClickListener OnItemClickListener} given to -{@link android.widget.AdapterView#setOnItemClickListener setOnItemClickListener()}.

      +{@link android.widget.ListView#setOnItemClickListener setOnItemClickListener()}.

      What you do in the {@link android.widget.AdapterView.OnItemClickListener#onItemClick onItemClick()} method diff --git a/docs/html/training/location/display-address.jd b/docs/html/training/location/display-address.jd index daa6fd3832afc11f37ebe9ba029882481cae5f1d..088e926b8d1d25aa69ac07e1b9f67206366ab961 100644 --- a/docs/html/training/location/display-address.jd +++ b/docs/html/training/location/display-address.jd @@ -7,11 +7,11 @@ trainingnavtop=true

      This lesson teaches you how to

        -
      1. Get a Geographic Location
      2. -
      3. Define an Intent Service to Fetch the - Address
      4. -
      5. Start the Intent Service
      6. -
      7. Receive the Geocoding Results
      8. +
      9. Get a geographic location
      10. +
      11. Define an intent service to fetch the + address
      12. +
      13. Start the intent service
      14. +
      15. Receive the geocoding results

      You should also read

      @@ -58,7 +58,7 @@ trainingnavtop=true convert a geographic location to an address. The method returns an estimated street address corresponding to a given latitude and longitude.

      -

      Get a Geographic Location

      +

      Get a geographic location

      The last known location of the device is a useful starting point for the address lookup feature. The lesson on @@ -69,12 +69,12 @@ trainingnavtop=true fused location provider to find the latest location of the device.

      -

      To access the fused location provider, you need to create an instance of the +

      To access the fused location provider, create an instance of the Google Play services API client. To learn how to connect your client, see Connect to Google Play Services.

      -

      In order for the fused location provider to retrieve a precise street +

      To enable the fused location provider to retrieve a precise street address, set the location permission in your app manifest to {@code ACCESS_FINE_LOCATION}, as shown in the following example:

      @@ -86,12 +86,12 @@ trainingnavtop=true </manifest>
      -

      Define an Intent Service to Fetch the Address

      +

      Define an intent service to fetch the address

      The {@link android.location.Geocoder#getFromLocation getFromLocation()} method provided by the {@link android.location.Geocoder} class accepts a - latitude and longitude, and returns a list of addresses. The method is - synchronous, and may take a long time to do its work, so you should not call + latitude and longitude and returns a list of addresses. The method is + synchronous and may take a long time to do its work, so you should not call it from the main, user interface (UI) thread of your app.

      The {@link android.app.IntentService IntentService} class provides a @@ -100,23 +100,23 @@ trainingnavtop=true Note that the {@link android.os.AsyncTask AsyncTask} class also allows you to perform background operations, but it's designed for short operations. An {@link android.os.AsyncTask AsyncTask} shouldn't keep a reference to the UI if - the activity is recreated, for example when the device is rotated. In + the activity is re-created, such as when the device is rotated. In contrast, an {@link android.app.IntentService IntentService} doesn't need to be cancelled when the activity is rebuilt.

      Define a {@code FetchAddressIntentService} class that extends {@link android.app.IntentService}. This class is your address lookup service. - The intent service handles an intent asynchronously on a worker thread, and + The intent service handles an intent asynchronously on a worker thread and stops itself when it runs out of work. The intent extras provide the data needed by the service, including a {@link android.location.Location} object - for conversion to an address, and a {@link android.os.ResultReceiver} object + for conversion to an address and a {@link android.os.ResultReceiver} object to handle the results of the address lookup. The service uses a {@link - android.location.Geocoder} to fetch the address for the location, and sends + android.location.Geocoder} to fetch the address for the location and sends the results to the {@link android.os.ResultReceiver}.

      -

      Define the Intent Service in your App Manifest

      +

      Define the intent service in your app manifest

      -

      Add an entry to your app manifest defining the intent service:

      +

      Add an entry to your app manifest that defines the intent service, as shown here:

       <manifest xmlns:android="http://schemas.android.com/apk/res/android"
      @@ -131,26 +131,26 @@ trainingnavtop=true
       </manifest>
       
      -

      Note: The {@code } element in - the manifest doesn't need to include an intent filter, because your main +

      Note: The {@code <service>} element in + the manifest doesn't need to include an intent filter because your main activity creates an explicit intent by specifying the name of the class to use for the intent.

      -

      Create a Geocoder

      +

      Create a geocoder

      The process of converting a geographic location to an address is called - reverse geocoding. To perform the main work of the intent service, - that is, your reverse geocoding request, implement + reverse geocoding. To perform the main work of the intent service (your reverse + geocoding request), implement {@link android.app.IntentService#onHandleIntent onHandleIntent()} within the {@code FetchAddressIntentService} class. Create a {@link android.location.Geocoder} object to handle the reverse geocoding.

      A locale represents a specific geographical or linguistic region. Locale - objects are used to adjust the presentation of information, such as numbers or - dates, to suit the conventions in the region represented by the locale. Pass a + objects adjust the presentation of information, such as numbers or + dates, to suit the conventions in the region that is represented by the locale. Pass a {@code Locale} object - to the {@link android.location.Geocoder} object, to ensure that the resulting - address is localized to the user's geographic region.

      + to the {@link android.location.Geocoder} object to ensure that the resulting + address is localized to the user's geographic region. Here is an example:

       @Override
      @@ -162,7 +162,7 @@ protected void onHandleIntent(Intent intent) {
       
       

      Retrieve the street address data

      -

      The next step is to retrieve the street address from the geocoder, handle +

      You can now retrieve the street address from the geocoder, handle any errors that may occur, and send the results back to the activity that requested the address. To report the results of the geocoding process, you need two numeric constants that indicate success or failure. @@ -185,32 +185,34 @@ public final class Constants {

      To get a street address corresponding to a geographical location, call {@link android.location.Geocoder#getFromLocation getFromLocation()}, - passing it the latitude and longitude from the location object, and the - maximum number of addresses you want returned. In this case, you want just one - address. The geocoder returns an array of addresses. If no addresses were + passing it the latitude and longitude from the location object and the + maximum number of addresses that you want returned. In this case, you want just one + address. The geocoder returns an array of addresses. If no addresses are found to match the given location, it returns an empty list. If there is no backend geocoding service available, the geocoder returns null.

      -

      Check for the following errors as shown in the code sample below. If an error - occurs, place the corresponding error message in the {@code errorMessage} - variable, so you can send it back to the requesting activity:

      +

      Check for the following errors, as shown in the code sample below:

        -
      • No location data provided - The intent extras do not - include the {@link android.location.Location} object required for reverse +
      • No location data provided – The intent extras do not + include the {@link android.location.Location} object that is required for reverse geocoding.
      • -
      • Invalid latitude or longitude used - The latitude - and/or longitude values provided in the {@link android.location.Location} +
      • Invalid latitude or longitude used – The latitude + and/or longitude values that are provided in the {@link android.location.Location} object are invalid.
      • -
      • No geocoder available - The background geocoding service - is not available, due to a network error or IO exception.
      • -
      • Sorry, no address found - The geocoder could not find an +
      • No geocoder available – The background geocoding service + is not available due to a network error or IO exception.
      • +
      • Sorry, no address found – The geocoder can't find an address for the given latitude/longitude.
      +

      If an error + occurs, place the corresponding error message in the {@code errorMessage} + variable so that you can send it back to the requesting activity. +

      To get the individual lines of an address object, use the {@link android.location.Address#getAddressLine getAddressLine()} - method provided by the {@link android.location.Address} class. Then join the + method that is provided by the {@link android.location.Address} class. Join the lines into a list of address fragments ready to return to the activity that requested the address.

      @@ -220,7 +222,7 @@ public final class Constants { results consist of the previously-mentioned numeric success/failure code and a string. In the case of a successful reverse geocoding, the string contains the address. In the case of a failure, the string contains the error message, - as shown in the code sample below:

      + as shown in this code sample:

       @Override
      @@ -280,18 +282,18 @@ protected void onHandleIntent(Intent intent) {
       
       

      Return the address to the requestor

      -

      The final thing the intent service must do is send the address back to a +

      The final action that the intent service must complete is sending the address back to a {@link android.os.ResultReceiver} in the activity that started the service. The {@link android.os.ResultReceiver} class allows you to send a numeric result code as well as a message containing the result data. The numeric code is useful for reporting the success or failure of the geocoding request. In the case of a successful reverse geocoding, the message contains the address. In the case of a failure, the message contains some text - describing the reason for failure.

      + describing the reason for the failure.

      You have already retrieved the address from the geocoder, trapped any errors - that may occur, and called the {@code deliverResultToReceiver()} method. Now - you need to define the {@code deliverResultToReceiver()} method that sends + that may occur, and called the {@code deliverResultToReceiver()} method, so now + you must define the {@code deliverResultToReceiver()} method that sends a result code and message bundle to the result receiver.

      For the result code, use the value that you've passed to the @@ -299,7 +301,7 @@ protected void onHandleIntent(Intent intent) { To construct the message bundle, concatenate the {@code RESULT_DATA_KEY} constant from your {@code Constants} class (defined in Retrieve the street address data) and - the value in the {@code message} parameter passed to the + the value in the {@code message} parameter that is passed to the {@code deliverResultToReceiver()} method, as shown in the following sample:

      @@ -315,26 +317,26 @@ public class FetchAddressIntentService extends IntentService { }
      -

      Start the Intent Service

      +

      Start the intent service

      The intent service, as defined in the previous section, runs in the - background and is responsible for fetching the address corresponding to a + background and fetches the address corresponding to a given geographic location. When you start the service, the Android framework - instantiates and starts the service if it isn't already running, and creates a - process if needed. If the service is already running then it remains running. + instantiates and starts the service if it isn't already running, and it creates a + process if needed. If the service is already running, it remains running. Because the service extends {@link android.app.IntentService IntentService}, - it shuts down automatically when all intents have been processed.

      + it shuts down automatically after all intents are processed.

      -

      Start the service from your app's main activity, +

      Start the service from your app's main activity and create an {@link android.content.Intent} to pass data to the service. You - need an explicit intent, because you want only your service + need an explicit intent because you want only your service to respond to the intent. For more information, see Intent Types.

      To create an explicit intent, specify the name of the class to use for the service: {@code FetchAddressIntentService.class}. - Pass two pieces of information in the intent extras:

      + Pass this information in the intent extras:

      • A {@link android.os.ResultReceiver} to handle the results of the address @@ -362,6 +364,12 @@ public class MainActivity extends ActionBarActivity implements }
      +

      Caution: To ensure that your app is secure, always use an +explicit intent when starting a {@link android.app.Service} and do not declare intent filters for +your services. Using an implicit intent to start a service is a security hazard because you cannot +be certain of the service that will respond to the intent, and the user cannot see which service +starts.

      +

      Call the above {@code startIntentService()} method when the user takes an action that requires a geocoding address lookup. For example, the user may press a Fetch address button on your app's UI. Before @@ -391,7 +399,7 @@ public void fetchAddressButtonHandler(View view) { app's UI. The following code snippet shows the call to the {@code startIntentService()} method in the {@code onConnected()} - callback provided by the Google API Client:

      + callback that is provided by the Google API Client:

       public class MainActivity extends ActionBarActivity implements
      @@ -420,9 +428,9 @@ public class MainActivity extends ActionBarActivity implements
       }
       
      -

      Receive the Geocoding Results

      +

      Receive the geocoding results

      -

      The intent service has handled the geocoding request, and uses a +

      After the intent service handles the geocoding request, it uses a {@link android.os.ResultReceiver} to return the results to the activity that made the request. In the activity that makes the request, define an {@code AddressResultReceiver} that extends {@link android.os.ResultReceiver} @@ -430,14 +438,14 @@ public class MainActivity extends ActionBarActivity implements

      The result includes a numeric result code (resultCode) as well as a message containing the result data (resultData). If the - reverse geocoding process was successful, the resultData contains + reverse geocoding process is successful, the resultData contains the address. In the case of a failure, the resultData contains - text describing the reason for failure. For details of the possible errors, + text describing the reason for the failure. For details of the possible errors, see Return the address to the requestor.

      Override the {@link android.os.ResultReceiver#onReceiveResult onReceiveResult()} method - to handle the results delivered to the result receiver, as shown in the + to handle the results that are delivered to the result receiver, as shown in the following code sample:

      diff --git a/docs/html/training/location/geofencing.jd b/docs/html/training/location/geofencing.jd
      index ce6ad55ad8891d8a79a1ab769a1577b596bd46a5..046e99e9bed103ed2f3db3ce39ba6961dbfa76a1 100644
      --- a/docs/html/training/location/geofencing.jd
      +++ b/docs/html/training/location/geofencing.jd
      @@ -332,22 +332,39 @@ LocationServices.GeofencingApi.removeGeofences(
       

      This section outlines recommendations for using geofencing with the location APIs for Android.

      -

      Reduce power consumption

      +

      + Reduce power consumption +

      -

      You can use the following techniques to optimize power consumption in your apps that use geofencing:

      +

      + You can use the following techniques to optimize power consumption in your + apps that use geofencing: +

        -
      • Set the -notification responsiveness to a higher value. Doing so improves power consumption by -increasing the latency of geofence alerts. For example, if you set a responsiveness value of five -minutes your app only checks for an entrance or exit alert once every five minutes. -Setting lower values does not necessarily mean that users will be notified within that time period -(for example, if you set a value of 5 seconds it may take a bit longer than that to receive the -alert).

      • -
      • Use a larger geofence radius for locations where a user spends a significant amount of time, -such as home or work. While a larger radius doesn't directly reduce power consumption, it reduces -the frequency at which the app checks for entrance or exit, effectively lowering overall power -consumption.

      • +
      • +

        + Set the + notification responsiveness to a higher value. Doing so improves + power consumption by increasing the latency of geofence alerts. For + example, if you set a responsiveness value of five minutes your app only + checks for an entrance or exit alert once every five minutes. Setting + lower values does not necessarily mean that users will be notified + within that time period (for example, if you set a value of 5 seconds it + may take a bit longer than that to receive the alert). +

        +
      • + +
      • +

        + Use a larger geofence radius for locations where a user spends a + significant amount of time, such as home or work. While a larger radius + doesn't directly reduce power consumption, it reduces the frequency at + which the app checks for entrance or exit, effectively lowering overall + power consumption. +

        +

      Choose the optimal radius for your geofence

      diff --git a/docs/html/training/material/images/palette-library-color-profiles_2-1_2x.png b/docs/html/training/material/images/palette-library-color-profiles_2-1_2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d14ec32c7500ca39065e3ecb9ff22228830def59 Binary files /dev/null and b/docs/html/training/material/images/palette-library-color-profiles_2-1_2x.png differ diff --git a/docs/html/training/material/images/palette-library-title-text-color_2-1_2x.png b/docs/html/training/material/images/palette-library-title-text-color_2-1_2x.png new file mode 100644 index 0000000000000000000000000000000000000000..883adba6a430996ad178b9bb968fa797198be83f Binary files /dev/null and b/docs/html/training/material/images/palette-library-title-text-color_2-1_2x.png differ diff --git a/docs/html/training/material/index.jd b/docs/html/training/material/index.jd index 4001e6b7442f8c84d4d42266fb0cb3864227efd0..8baa0659e95b59ac487020c3f135f69dc6778784 100644 --- a/docs/html/training/material/index.jd +++ b/docs/html/training/material/index.jd @@ -3,7 +3,6 @@ page.type=design page.image=images/cards/material_2x.png page.metaDescription=Learn how to apply material design to your apps. - @jd:body
      @@ -58,6 +57,9 @@ specification and use the new components and functionality available in Andr
      Maintaining Compatibility
      Learn how to maintain compatibility with platform versions earlier than Android 5.0.
      + +
      Selecting Colors with the Palette API
      +
      Learn how to select colors for your app using the v7 Palette library.

      Video Training

      diff --git a/docs/html/training/material/palette-colors.html b/docs/html/training/material/palette-colors.html new file mode 100644 index 0000000000000000000000000000000000000000..27485d2decd813e2c0fe653c2819302616dbf84d --- /dev/null +++ b/docs/html/training/material/palette-colors.html @@ -0,0 +1,310 @@ + + + Selecting Colors with the Palette API + + + + + + + + +

      Good visual design is essential for a successful app, and color schemes are a primary component of design. The palette library is a +support library +that extracts prominent colors from images to help you create visually engaging apps.

      + +

      You can use the palette library to design layout +themes and apply custom colors to visual elements in your app. +For example, you can use a palette to create a color-coordinated title +card for a song based on its album cover or to adjust an app’s toolbar color when its +background image changes. The Palette object gives +you access to the colors in a Bitmap +image while also providing six main color profiles from the bitmap to help +inform your design choices.

      + +

      Set up the library

      + +

      To use the palette library, install or update the Android +Support Library to version 24.0.0 or higher and follow the instructions for Adding +Support Libraries to add the palette library to your app development project.

      + +

      Make sure that the version specified in your dependency identifier matches your +app’s compileSdkVersion, set in the build.gradle +file:

      + +
      +android {
      +  compileSdkVersion 24
      +  ...
      +}
      +
      +dependencies {
      +  ...
      +  compile 'com.android.support:palette-v7:24.2.1'
      +}
      +
      + +

      For more information about adding the palette dependency, read about the palette +feature in the support +library documentation.

      + +

      Create a palette

      + +

      A Palette object gives you access to the primary colors in an +image, as well as the corresponding colors for overlaid text. Use palettes to design +your app’s style and to dynamically change your app’s color scheme based on a +given source image.

      + +

      To create a palette, first instantiate a Palette.Builder +from a Bitmap. You can then use the +Palette.Builder to customize the palette before generating it. This +section will describe palette generation and customization from a bitmap +image.

      + +

      Generate a Palette instance

      + +

      Generate a Palette instance using Palette’s +from(Bitmap +bitmap) method to first create a Palette.Builder +from a Bitmap. The builder can then generate the palette either +synchronously or asynchronously.

      + +

      Use synchronous palette generation if you want to create the palette on +the same thread as the method being called. If you generate the palette +asynchronously on a different thread, use the onGenerated() +method to access the palette immediately after it has been created.

      + +

      The following code snippet provides example methods for both types of palette generation:

      + +
      +// Generate palette synchronously and return it
      +public Palette createPaletteSync(Bitmap bitmap) {
      +  Palette p = Palette.from(bitmap).generate();
      +  return p;
      +}
      +
      +// Generate palette asynchronously and use it on a different
      +// thread using onGenerated()
      +public void createPaletteAsync(Bitmap bitmap) {
      +  Palette.from(bitmap).generate(new PaletteAsyncListener() {
      +    public void onGenerated(Palette p) {
      +      // Use generated instance
      +    }
      +  });
      +}
      +
      + +

      If you need to continuously generate palettes for a sorted list of images +or objects, consider caching +the Palette instances to prevent slow UI performance. You also +should not create the palettes on your main thread.

      + +

      Customize your palette

      + +

      The Palette.Builder allows you to customize your palette by +choosing how many colors are in the resulting palette, what area of your +image the builder uses to generate the palette, and what colors are allowed in the +palette. For example, you can filter out the color black or ensure that the +builder only uses the top half of an image to generate your palette.

      + +

      Fine-tune your palette’s size and colors with the following methods from +the Palette.Builder class:

      + +
      + +
      addFilter()
      +
      This method adds a filter that indicates what colors are allowed in the + resulting palette. Pass in your own Palette.Filter + and modify its isAllowed() method to determine which colors are + filtered from the palette.
      + +
      maximumColorCount()
      +
      This method sets the maximum number of colors in your palette. The + default value is 16, and the optimal value depends on the source image. + For landscapes, optimal values range from 8-16 while pictures with faces + usually have values that fall between 24-32. The + Palette.Builder takes longer to generate palettes with more + colors.
      + +
      setRegion()
      +
      This method indicates what area of the bitmap the builder uses when + creating the palette. You can only use this method when generating the palette from + a bitmap, and it does not affect the original image.
      + +
      addTarget()
      +
      This method allows you to perform your own color matching by adding a + Target + color profile to the builder. If the default Targets are not + sufficient, advanced developers can create their own Targets + using a Target.Builder.
      + +
      + +

      Extract color profiles

      + +

      Based on the standards +of material design, the palette library extracts commonly used color +profiles from an image. Each profile is defined by a Target, +and colors extracted from the bitmap image are scored against each profile +based on saturation, luminance, and population (number of pixels in the bitmap +represented by the color). For each profile, the color with the best score +defines that color profile for the given image.

      + +

      By default, a Palette object contains 16 primary colors from +a given image. When generating your palette, you can customize its number of colors using the +Palette.Builder. Extracting more colors provides more potential +matches for each color profile but also causes Palette.Builder to +take longer when generating the palette.

      + +

      The palette library attempts to extract the following six color +profiles:

      + +
        +
      • Light Vibrant
      • +
      • Vibrant
      • +
      • Dark Vibrant
      • +
      • Light Muted
      • +
      • Muted
      • +
      • Dark Muted
      • +
      + +

      Each of Palette’s get<Profile>Color() +methods returns the color in the palette associated with that particular profile, +where <Profile> is replaced by the name of one of the six +color profiles. For example, the method to get the Dark Vibrant color profile is getDarkVibrantColor(). +Since not all images will contain all color profiles, you must also provide +a default color to return.

      + +

      Figure 1 displays a photo and its corresponding color +profiles from the get<Profile>Color() methods.

      + + + +

      Figure 1. An example image and its +extracted color profiles given the default maximum color count (16) for the palette.

      + +

      Use swatches to create color schemes

      + +

      The Palette class also generates Palette.Swatch +objects for each color profile. Palette.Swatch +objects contain the associated color for that profile, as well as the +color’s population in pixels.

      + +

      Swatches have additional methods for accessing more information about the color +profile, such as HSL values and pixel population. You can use swatches to help +create more comprehensive color schemes and app themes using the getBodyTextColor() +and getTitleTextColor() +methods. These methods return colors appropriate for use over the swatch’s +color.

      + +

      Each of Palette’s get<Profile>Swatch() +methods returns the swatch associated with that particular profile, +where <Profile> is replaced by the name of one of the six +color profiles. Although the palette’s get<Profile>Swatch() methods +do not require default value parameters, they return null if that +particular profile does not exist in the image. Therefore, you should check that +a swatch is not null before using it. For example, the following method +returns the Vibrant swatch from a palette if the swatch is not null:

      + +
      +// Return a palette's vibrant swatch after checking that it exists
      +private Palette.Swatch checkVibrantSwatch(Palette p) {
      +  Palette.Swatch vibrant = p.getVibrantSwatch();
      +  if (vibrant != null) {
      +    return vibrant;
      +  }
      +  // Throw error
      +}
      +
      + +

      To access all colors in a palette, the getSwatches() +method returns a list of all swatches generated from an +image, including the standard six color profiles.

      + +

      The following snippet of code uses the methods from the above code snippets to +synchronously generate a palette, get its vibrant swatch, and change the colors of a +toolbar to match the bitmap image. Figure 2 displays the resulting image and toolbar.

      + +
      + +
      + +
      +// Set the background and text colors of a toolbar given a
      +// bitmap image to match
      +public void setToolbarColor(Bitmap bitmap) {
      +  // Generate the palette and get the vibrant swatch
      +  // See the createPaletteSync() and checkVibrantSwatch() methods
      +  // from the code snippets above
      +  Palette p = createPaletteSync(bitmap);
      +  Palette.Swatch vibrantSwatch = checkVibrantSwatch(p);
      +  
      +  // Set the toolbar background and text colors
      +  Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
      +  toolbar.setBackgroundColor(vibrantSwatch.getRgb());
      +  toolbar.setTitleTextColor(vibrantSwatch.getTitleTextColor());
      +}
      +
      + +
      + +
      + + + +

      Figure 2. An example image with its + vibrant-colored toolbar and corresponding title text color.

      + +
      + +
      + + + diff --git a/docs/html/training/monitoring-device-state/battery-monitoring.jd b/docs/html/training/monitoring-device-state/battery-monitoring.jd index db75aaf1f89986bb419b2c750c365026bb3726d4..bab9c9cf6baf80a0e8ad60e60029bae2c8420df2 100644 --- a/docs/html/training/monitoring-device-state/battery-monitoring.jd +++ b/docs/html/training/monitoring-device-state/battery-monitoring.jd @@ -141,10 +141,11 @@ receiver. The receiver is triggered whenever the device battery becomes low or e condition by listening for {@link android.content.Intent#ACTION_BATTERY_LOW} and {@link android.content.Intent#ACTION_BATTERY_OKAY}.

      -
      <receiver android:name=".BatteryLevelReceiver">
      -<intent-filter>
      -  <action android:name="android.intent.action.ACTION_BATTERY_LOW"/>
      -  <action android:name="android.intent.action.ACTION_BATTERY_OKAY"/>
      +
      +<receiver android:name=".BatteryLevelReceiver">
      +  <intent-filter>
      +    <action android:name="android.intent.action.BATTERY_LOW"/>
      +    <action android:name="android.intent.action.BATTERY_OKAY"/>
         </intent-filter>
       </receiver>
      diff --git a/docs/html/training/monitoring-device-state/connectivity-monitoring.jd b/docs/html/training/monitoring-device-state/connectivity-monitoring.jd index 2dd904f325f742465eaef78fd10b33d8a1b0adff..c63822bea116b4012650feadfbe839e125d2f788 100644 --- a/docs/html/training/monitoring-device-state/connectivity-monitoring.jd +++ b/docs/html/training/monitoring-device-state/connectivity-monitoring.jd @@ -33,7 +33,7 @@ next.link=manifest-receivers.html

      Some of the most common uses for repeating alarms and background services is to schedule regular updates of application data from Internet resources, cache data, or execute long running downloads. But if you aren't connected to the Internet, or the connection is too slow to complete your -download, why both waking the device to schedule the update at all?

      +download, why bother waking the device to schedule the update at all?

      You can use the {@link android.net.ConnectivityManager} to check that you're actually connected to the Internet, and if so, what type of connection is in place.

      diff --git a/docs/html/training/monitoring-device-state/manifest-receivers.jd b/docs/html/training/monitoring-device-state/manifest-receivers.jd index 3e36dba741a1788d6a52ead59bbd5b91bd41aeae..5efa2facf901911b498c25b251e31f5a0f9af978 100644 --- a/docs/html/training/monitoring-device-state/manifest-receivers.jd +++ b/docs/html/training/monitoring-device-state/manifest-receivers.jd @@ -21,7 +21,10 @@ Efficiency

      You should also read

      @@ -32,13 +35,22 @@ android.content.BroadcastReceiver} for each state you're monitoring and register your application manifest. Then within each of these receivers you simply reschedule your recurring alarms based on the current device state.

      -

      A side-effect of this approach is that your app will wake the device each time any of these -receivers is triggered—potentially much more frequently than required.

      -

      A better approach is to disable or enable the broadcast receivers at runtime. That way you can use the receivers you declared in the manifest as passive alarms that are triggered by system events only when necessary.

      +

      + Warning: Limit how many broadcast + receivers you set in your app. Instead of using broadcast receivers, + consider using other APIs for + performing background work. For example, in Android 5.0 (API level 21) and + higher, you can use the {@link android.app.job.JobScheduler} class for + assigning work to be completed in the background. + For more information about APIs you can use instead of the + {@link android.content.BroadcastReceiver} class for scheduling background + work, see + Background Optimizations. +

      Toggle and Cascade State Change Receivers to Improve Efficiency

      diff --git a/docs/html/training/notify-user/build-notification.jd b/docs/html/training/notify-user/build-notification.jd index 7df2787ea5184b03cd9696b044b374ff925c1fae..baa10748c4ec4c5c781bf1d75f07beeede865422 100644 --- a/docs/html/training/notify-user/build-notification.jd +++ b/docs/html/training/notify-user/build-notification.jd @@ -134,8 +134,8 @@ mBuilder.setContentIntent(resultPendingIntent);
      • Get an instance of {@link android.app.NotificationManager}.
      • -
      • Use the {@link android.app.NotificationManager#notify(String, int, Notification)} method to issue the -notification. When you call {@link android.app.NotificationManager#notify(String, int, Notification)}, specify a notification ID. +
      • Use the {@link android.app.NotificationManager#notify notify()} method to issue the +notification. When you call {@link android.app.NotificationManager#notify notify()}, specify a notification ID. You can use this ID to update the notification later on. This is described in more detail in Managing Notifications.
      • diff --git a/docs/html/training/run-background-service/index.jd b/docs/html/training/run-background-service/index.jd index 22f3fc875c3697212b29e11be30f4b07120993f1..c48c681c2471ad21d38454f7efb6f78d0c120f07 100644 --- a/docs/html/training/run-background-service/index.jd +++ b/docs/html/training/run-background-service/index.jd @@ -35,16 +35,22 @@ startpage=true

        Unless you specify otherwise, most of the operations you do in an app run in the foreground on - a special thread called the UI thread. This can cause problems, because long-running operations - will interfere with the responsiveness of your user interface. This annoys your users, and can + a special thread called the UI thread. Long-running foreground operations can cause problems + and interfere with the responsiveness of your user interface, which annoys your users and can even cause system errors. To avoid this, the Android framework offers several classes that - help you off-load operations onto a separate thread running in the background. The most useful - of these is {@link android.app.IntentService}. + help you off-load operations onto a separate thread that runs in the background. The most + useful of these is {@link android.app.IntentService}.

        This class describes how to implement an {@link android.app.IntentService}, send it work requests, and report its results to other components.

        + +

        Note: If your app targets Android 5.0 (API level 21), + you should use {@link android.app.job.JobScheduler} to execute background + services. For more information about this class, + see the {@link android.app.job.JobScheduler} reference documentation.

        +

        Lessons

        diff --git a/docs/html/training/testing/ui-testing/espresso-testing.jd b/docs/html/training/testing/ui-testing/espresso-testing.jd index d3d31debc35349fe1b1e127b68e328a9984c3be3..3d2bca7748eec289f8051860c803ebe1fa37df6e 100644 --- a/docs/html/training/testing/ui-testing/espresso-testing.jd +++ b/docs/html/training/testing/ui-testing/espresso-testing.jd @@ -24,17 +24,11 @@ trainingnavtop=true
          -
        1. - Set Up Espresso -
        2. +
        3. Set Up Espresso
        4. -
        5. - Create an Espresso Test Class -
        6. +
        7. Create an Espresso Test Class
        8. -
        9. - Run Espresso Tests on a Device or Emulator -
        10. +
        11. Run Espresso Tests on a Device or Emulator

        @@ -59,31 +53,40 @@ trainingnavtop=true class="external-link">Android Testing Codelab

      - +

      Testing user interactions within a single app helps to ensure that users do not - encounter unexpected results or have a poor experience when interacting with your app. - You should get into the habit of creating user interface (UI) tests if you need to verify + encounter unexpected results or have a poor + experience when interacting with your app. + You should get into the habit of creating + user interface (UI) tests if you need to verify that the UI of your app is functioning correctly.

      The Espresso testing framework, provided by the Android Testing Support Library, - provides APIs for writing UI tests to simulate user interactions within a - single target app. Espresso tests can run on devices running Android 2.2 (API level 8) and - higher. A key benefit of using Espresso is that it provides automatic synchronization of test - actions with the UI of the app you are testing. Espresso detects when the main thread is idle, - so it is able to run your test commands at the appropriate time, improving the reliability of - your tests. This capability also relieves you from having to adding any timing workarounds, - such as a sleep period, in your test code. + provides APIs for writing UI tests to simulate + user interactions within a + single target app. Espresso tests can run on + devices running Android 2.3.3 (API level 10) and + higher. A key benefit of using Espresso is + that it provides automatic synchronization of test + actions with the UI of the app you are testing. + Espresso detects when the main thread is idle, + so it is able to run your test commands + at the appropriate time, improving the reliability of + your tests. This capability also relieves you + from having to add any timing workarounds, + such as {@link java.lang.Thread#sleep(long) Thread.sleep()} + in your test code.

      - The Espresso testing framework is an instrumentation-based API and works - with the + The Espresso testing framework is + an instrumentation-based API and works with the {@code AndroidJUnitRunner} test runner.

      @@ -92,105 +95,139 @@ trainingnavtop=true Set Up Espresso -

      Before building your UI test with Espresso, make sure to configure your test source code -location and project dependencies, as described in - -Getting Started with Testing.

      +

      + Before building your UI test with Espresso, + make sure to configure your test source code + location and project dependencies, as described in + Getting Started with Testing. +

      -

      In the {@code build.gradle} file of your Android app module, you must set a dependency - reference to the Espresso library:

      +

      + In the {@code build.gradle} file of your Android app + module, you must set a dependency + reference to the Espresso library: +

       dependencies {
      -    ...
      -    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1'
      +    // Other dependencies ...
      +    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
       }
       
      -

      Turn off animations on your test device — leaving system animations turned on in the test -device might cause unexpected results or may lead your test to fail. Turn off animations from -Settings by opening Developing Options and turning all the following options off: +

      + Turn off animations on your test device — + leaving system animations turned on in the test + device might cause unexpected results or may + lead your test to fail. Turn off animations from + Settings by opening Developer options + and turning all the following options off:

      -
        -
      • - Window animation scale -
      • -
      • - Transition animation scale -
      • +

        +

          +
        • + Window animation scale +
        • + +
        • + Transition animation scale +
        • + +
        • + Animator duration scale +
        • +
        +

        -
      • - Animator duration scale -
      • -
      - - -

      If you want to set up your project to use Espresso features other than what the core API +

      + If you want to set up your project to use Espresso + features other than what the core API provides, see this resource.

      -

      - Create an Espresso Test Class -

      + -

      - To create an Espresso test, create a Java class that follows this programming model: -

      +

      + Create an Espresso Test Class +

      -
        -
      1. Find the UI component you want to test in an {@link android.app.Activity} (for example, a - sign-in button in the app) by calling the - - {@code onView()} method, or the - - {@code onData()} method for {@link android.widget.AdapterView} controls. -
      2. - -
      3. Simulate a specific user interaction to perform on that UI component, by calling the - {@code ViewInteraction.perform()} - or - {@code DataInteraction.perform()} - method and passing in the user action (for example, click on the sign-in button). To sequence - multiple actions on the same UI component, chain them using a comma-separated list in your - method argument. -
      4. - -
      5. Repeat the steps above as necessary, to simulate a user flow across multiple - activities in the target app. -
      6. - -
      7. Use the +

        + To create an Espresso test, create a Java + class that follows this programming model: +

        + +
          +
        1. + Find the UI component you want to test in + an {@link android.app.Activity} (for example, a + sign-in button in the app) by calling the + + {@code onView()} method, or the + + {@code onData()} method for {@link android.widget.AdapterView} controls. +
        2. + +
        3. + Simulate a specific user interaction to + perform on that UI component, by calling the + {@code ViewInteraction.perform()} + or + {@code DataInteraction.perform()} + method and passing in the user action + (for example, click on the sign-in button). To sequence + multiple actions on the same UI component, chain them using a comma-separated list in your + method argument. +
        4. + +
        5. + Repeat the steps above as necessary, to simulate a user flow across multiple + activities in the target app. +
        6. + +
        7. + Use the {@code ViewAssertions} - methods to check that the UI reflects the expected - state or behavior, after these user interactions are performed. -
        8. -
        + methods to check that the UI reflects the expected + state or behavior, after these user interactions are performed. +
      8. +
      -

      - These steps are covered in more detail in the sections below. -

      +

      + These steps are covered in more detail in the sections below. +

      -

      - The following code snippet shows how your test class might invoke this basic workflow: -

      +

      + The following code snippet shows how your test + class might invoke this basic workflow: +

       onView(withId(R.id.my_view))            // withId(R.id.my_view) is a ViewMatcher
               .perform(click())               // click() is a ViewAction
               .check(matches(isDisplayed())); // matches(isDisplayed()) is a ViewAssertion
       
      -

      Using Espresso with ActivityTestRule

      + + + +

      + Using Espresso with ActivityTestRule +

      +

      -The following section describes how to create a new Espresso test in the JUnit 4 style and use - -{@code ActivityTestRule} to reduce the amount of boilerplate code you need to write. By using - -{@code ActivityTestRule}, the testing framework launches the activity under test -before each test method annotated with @Test and before any method annotated with -@Before. The framework handles shutting down the activity after the test finishes -and all methods annotated with @After are run.

      + The following section describes how to create a + new Espresso test in the JUnit 4 style and use + {@code ActivityTestRule} + to reduce the amount of boilerplate code you need to write. By using + {@code ActivityTestRule}, + the testing framework launches the activity under test + before each test method annotated with + @Test and before any method annotated with + @Before. The framework handles + shutting down the activity after the test finishes + and all methods annotated with @After are run. +

       package com.example.android.testing.espresso.BasicSample;
      @@ -234,103 +271,57 @@ public class ChangeTextBehaviorTest {
       }
       
      -

      - Using Espresso with ActivityInstrumentationTestCase2 -

      -

      The following section describes how to migrate to Espresso if you have existing test classes -subclassed from {@link android.test.ActivityInstrumentationTestCase2} and you don't want to rewrite -them to use JUnit4.

      -

      Note: For new UI tests, we strongly recommend that you write your -test in the JUnit 4 style and use the - -{@code ActivityTestRule} class, instead of -{@link android.test.ActivityInstrumentationTestCase2}.

      -

      - If you are subclassing {@link android.test.ActivityInstrumentationTestCase2} - to create your Espresso test class, you must inject an - {@link android.app.Instrumentation} instance into your test class. This step is required in - order for your Espresso test to run with the - {@code AndroidJUnitRunner} - test runner. -

      + -

      - To do this, call the - {@link android.test.InstrumentationTestCase#injectInstrumentation(android.app.Instrumentation) injectInstrumentation()} - method and pass in the result of - - {@code InstrumentationRegistry.getInstrumentation()}, as shown in the following code - example: -

      - -
      -import android.support.test.InstrumentationRegistry;
      +

      + Accessing UI Components +

      -public class MyEspressoTest - extends ActivityInstrumentationTestCase2<MyActivity> { - - private MyActivity mActivity; - - public MyEspressoTest() { - super(MyActivity.class); - } - - @Before - public void setUp() throws Exception { - super.setUp(); - injectInstrumentation(InstrumentationRegistry.getInstrumentation()); - mActivity = getActivity(); - } - - ... -} -
      - -

      Note: Previously, {@link android.test.InstrumentationTestRunner} -would inject the {@link android.app.Instrumentation} instance, but this test runner is being -deprecated.

      - -

      - Accessing UI Components -

      - -

      - Before Espresso can interact with the app under test, you must first specify the UI component - or view. Espresso supports the use of -Hamcrest matchers - for specifying views and adapters in your app. -

      +

      + Before Espresso can interact with the app + under test, you must first specify the UI component + or view. Espresso supports the use of + Hamcrest matchers + for specifying views and adapters in your app. +

      -

      - To find the view, call the - {@code onView()} - method and pass in a view matcher that specifies the view that you are targeting. This is - described in more detail in Specifying a View Matcher. - The - {@code onView()} method returns a - - {@code ViewInteraction} - object that allows your test to interact with the view. - However, calling the - {@code onView()} method may not work if you want to locate a view in - an {@link android.widget.AdapterView} layout. In this case, follow the instructions in - Locating a view in an AdapterView instead. -

      +

      + To find the view, call the + {@code onView()} + method and pass in a view matcher that + specifies the view that you are targeting. This is + described in more detail in + Specifying a View Matcher. + The {@code onView()} + method returns a + {@code ViewInteraction} + object that allows your test to interact with the view. + However, calling the + + {@code onView()} + method may not work if you want to locate a view in + an {@link android.support.v7.widget.RecyclerView} layout. + In this case, follow the instructions in + Locating a view in an AdapterView + instead. +

      -

      - Note: The - {@code onView()} method does not check if the view you specified is - valid. Instead, Espresso searches only the current view hierarchy, using the matcher provided. - If no match is found, the method throws a - - {@code NoMatchingViewException}. -

      +

      + Note: + The {@code onView()} + method does not check if the view you specified is + valid. Instead, Espresso searches only the + current view hierarchy, using the matcher provided. + If no match is found, the method throws a + {@code NoMatchingViewException}. +

      -

      - The following code snippet shows how you might write a test that accesses an - {@link android.widget.EditText} field, enters a string of text, closes the virtual keyboard, - and then performs a button click. -

      +

      + The following code snippet shows how you might write a test that accesses an + {@link android.widget.EditText} field, + enters a string of text, closes the virtual keyboard, + and then performs a button click. +

       public void testChangeText_sameActivity() {
      @@ -344,231 +335,464 @@ public void testChangeText_sameActivity() {
       }
       
      -

      - Specifying a View Matcher -

      + +

      + Specifying a View Matcher +

      -

      - You can specify a view matcher by using these approaches: -

      +

      + You can specify a view matcher by using these approaches: +

      -
        -
      • Calling methods in the - - {@code ViewMatchers} class. For example, to find a view by looking for a text string it - displays, you can call a method like this: -
        +
          +
        • Calling methods in the + {@code ViewMatchers} + class. For example, to find a view by looking for a text string it + displays, you can call a method like this: +
           onView(withText("Sign-in"));
           
          -

          Similarly you can call - -{@code withId()} and providing the resource ID ({@code R.id}) of the view, as shown in the -following example:

          +

          + Similarly you can call + {@code withId()} + and providing the resource ID ({@code R.id}) of the view, + as shown in the + following example: +

           onView(withId(R.id.button_signin));
           

          - Android resource IDs are not guaranteed to be unique. If your test attempts to match to a + Android resource IDs are not guaranteed to be unique. + If your test attempts to match to a resource ID used by more than one view, Espresso throws an - - {@code AmbiguousViewMatcherException}. + {@code AmbiguousViewMatcherException}.

          -
        • -
        • Using the Hamcrest - {@code Matchers} class. You can use the - {@code allOf()} methods to combine multiple matchers, such as - {@code containsString()} and {@code instanceOf()}. This approach allows you to - filter the match results more narrowly, as shown in the following example: +
        • + +
        • + Using the Hamcrest + {@code Matchers} class. You can use the + {@code allOf()} methods to combine multiple matchers, such as + {@code containsString()} and {@code instanceOf()}. + This approach allows you to + filter the match results more narrowly, as shown in the following example: +
           onView(allOf(withId(R.id.button_signin), withText("Sign-in")));
           
          -

          You can use the {@code not} keyword to filter for views that don't correspond to the matcher, as -shown in the following example:

          + +

          + You can use the {@code not} keyword to filter + for views that don't correspond to the matcher, as + shown in the following example: +

          +
           onView(allOf(withId(R.id.button_signin), not(withText("Sign-out"))));
           
          -

          To use these methods in your test, import the {@code org.hamcrest.Matchers} package. To -learn more about Hamcrest matching, see the -Hamcrest site. -

          -
        • -

        - To improve the performance of your Espresso tests, specify the minimum matching information - needed to find your target view. For example, if a view is uniquely identifiable by its - descriptive text, you do not need to specify that it is also assignable from the - {@link android.widget.TextView} instance. + To use these methods in your test, + import the {@code org.hamcrest.Matchers} package. To + learn more about Hamcrest matching, see the + Hamcrest site.

        +
      • +
      -

      - Locating a view in an AdapterView -

      +

      + To improve the performance of your Espresso tests, + specify the minimum matching information + needed to find your target view. For example, + if a view is uniquely identifiable by its + descriptive text, you do not need to specify + that it is also assignable from the + {@link android.widget.TextView} instance. +

      -

      - In an {@link android.widget.AdapterView} widget, the view is dynamically populated with child - views at runtime. If the target view you want to test is inside an - {@link android.widget.AdapterView} - (such as a {@link android.widget.ListView}, {@link android.widget.GridView}, or - {@link android.widget.Spinner}), the - - {@code onView()} method might not work because only a - subset of the views may be loaded in the current view hierarchy. -

      + -

      - Instead, call the {@code onData()} - method to obtain a - - {@code DataInteraction} - object to access the target view element. Espresso handles loading the target view element - into the current view hierarchy. Espresso also takes care of scrolling to the target element, - and putting the element into focus. -

      +

      + Locating a view in an AdapterView +

      + +

      + In an {@link android.widget.AdapterView} widget, + the view is dynamically populated with child + views at runtime. If the target view you want to test is inside an + {@link android.widget.AdapterView} + (such as a {@link android.widget.ListView}, + {@link android.widget.GridView}, or + {@link android.widget.Spinner}), the + {@code onView()} + method might not work because only a + subset of the views may be loaded in the current view hierarchy. +

      -

      - Note: The +

      + Instead, call the {@code onData()} - method does not check if if the item you specified corresponds with a view. Espresso searches - only the current view hierarchy. If no match is found, the method throws a - - {@code NoMatchingViewException}. -

      + method to obtain a + {@code DataInteraction} + object to access the target view element. + Espresso handles loading the target view element + into the current view hierarchy. Espresso + also takes care of scrolling to the target element, + and putting the element into focus. +

      -

      - The following code snippet shows how you can use the - {@code onData()} - method together - with Hamcrest matching to search for a specific row in a list that contains a given string. - In this example, the {@code LongListActivity} class contains a list of strings exposed - through a {@link android.widget.SimpleAdapter}. -

      +

      + Note: The + {@code onData()} + method does not check if the item you + specified corresponds with a view. Espresso searches + only the current view hierarchy. If no match is found, the method throws a + {@code NoMatchingViewException}. +

      + +

      + The following code snippet shows how you can use the + {@code onData()} + method together + with Hamcrest matching to search for a specific + row in a list that contains a given string. + In this example, the {@code LongListActivity} class + contains a list of strings exposed + through a {@link android.widget.SimpleAdapter}. +

       onData(allOf(is(instanceOf(Map.class)),
      -        hasEntry(equalTo(LongListActivity.ROW_TEXT), is(str))));
      +        hasEntry(equalTo(LongListActivity.ROW_TEXT), is("test input")));
       
      -

      - Performing Actions -

      + -

      - Call the {@code ViewInteraction.perform()} - or - {@code DataInteraction.perform()} - methods to - simulate user interactions on the UI component. You must pass in one or more - {@code ViewAction} - objects as arguments. Espresso fires each action in sequence according to - the given order, and executes them in the main thread. -

      +

      Performing Actions

      -

      - The - {@code ViewActions} - class provides a list of helper methods for specifying common actions. - You can use these methods as convenient shortcuts instead of creating and configuring - individual {@code ViewAction} - objects. You can specify such actions as: -

      +

      + Call the + {@code ViewInteraction.perform()} + or + {@code DataInteraction.perform()} + methods to + simulate user interactions on the UI component. You must pass in one or more + {@code ViewAction} + objects as arguments. Espresso fires each action in sequence according to + the given order, and executes them in the main thread. +

      - +

      + The + {@code ViewActions} + class provides a list of helper methods for specifying common actions. + You can use these methods as convenient shortcuts + instead of creating and configuring individual + {@code ViewAction} + objects. You can specify such actions as: +

      -

      - If the target view is inside a {@link android.widget.ScrollView}, perform the - {@code ViewActions.scrollTo()} - action first to display the view in the screen before other proceeding - with other actions. The - {@code ViewActions.scrollTo()} - action will have no effect if the view is already displayed. -

      + -

      - Verifying Results -

      +

      + If the target view is inside a {@link android.widget.ScrollView}, + perform the + {@code ViewActions.scrollTo()} + action first to display the view in the screen before other proceeding + with other actions. The + {@code ViewActions.scrollTo()} + action will have no effect if the view is already displayed. +

      -

      - Call the - {@code ViewInteraction.check()} - or - {@code DataInteraction.check()} - method to assert - that the view in the UI matches some expected state. You must pass in a - - {@code ViewAssertion} object as the argument. If the assertion fails, Espresso throws - an {@link junit.framework.AssertionFailedError}. -

      + -

      - The +

      + Test your activities in isolation with Espresso Intents +

      + +

      + Espresso Intents + enables validation and stubbing of intents sent out by an app. + With Espresso Intents, you can test an app, activity, or service in isolation + by intercepting outgoing intents, stubbing the result, and sending it back to + the component under test. +

      + +

      + To begin testing with Espresso Intents, you need + to add the following line to your app's build.gradle file: +

      + +
      +dependencies {
      +  // Other dependencies ...
      +  androidTestCompile 'com.android.support.test.espresso:espresso-intents:2.2.2'
      +}
      +
      + +

      + To test an intent, you need to create an instance of the + IntentsTestRule + class, which is very similar to the + ActivityTestRule + class. + The + IntentsTestRule + class initializes Espresso Intents before each test, + terminates the host activity, + and releases Espresso Intents after each test. +

      + +

      + The test class shown in the following codes snippet provides a simple + test for an explicit intent. It tests the activities and intents created in the + Building Your First App + tutorial. +

      + +
      +@Large
      +@RunWith(AndroidJUnit4.class)
      +public class SimpleIntentTest {
      +
      +    private static final String MESSAGE = "This is a test";
      +    private static final String PACKAGE_NAME = "com.example.myfirstapp";
      +
      +    /* Instantiate an IntentsTestRule object. */
      +    @Rule
      +    public IntentsTestRule≶MainActivity> mIntentsRule =
      +      new IntentsTestRule≶>(MainActivity.class);
      +
      +    @Test
      +    public void verifyMessageSentToMessageActivity() {
      +
      +        // Types a message into a EditText element.
      +        onView(withId(R.id.edit_message))
      +                .perform(typeText(MESSAGE), closeSoftKeyboard());
      +
      +        // Clicks a button to send the message to another
      +        // activity through an explicit intent.
      +        onView(withId(R.id.send_message)).perform(click());
      +
      +        // Verifies that the DisplayMessageActivity received an intent
      +        // with the correct package name and message.
      +        intended(allOf(
      +                hasComponent(hasShortClassName(".DisplayMessageActivity")),
      +                toPackage(PACKAGE_NAME),
      +                hasExtra(MainActivity.EXTRA_MESSAGE, MESSAGE)));
      +
      +    }
      +}
      +
      + +

      + For more information about Espresso Intents, see the + Espresso Intents + documentation on the Android Testing Support Library site. + You can also download the + IntentsBasicSample and + IntentsAdvancedSample + code samples. +

      + + + +

      + Testing WebViews with Espresso Web +

      + +

      + Espresso Web allows you to test {@link android.webkit.WebView} components + contained within an activity. It uses the + WebDriver API to inspect and control the + behavior of a {@link android.webkit.WebView}. +

      + +

      + To begin testing with Espresso Web, you need + to add the following line to your app's build.gradle file: +

      + +
      +dependencies {
      +  // Other dependencies ...
      +  androidTestCompile 'com.android.support.test.espresso:espresso-web:2.2.2'
      +}
      +
      + +

      + When creating a test using Espresso Web, you need to enable + JavaScript on the {@link android.webkit.WebView} when you instantiate the + ActivityTestRule + object to test the activity. In the tests, you can select + HTML elements displayed in the + {@link android.webkit.WebView} and simulate user interactions, like + entering text into a text box and then clicking a button. After the actions + are completed, you can then verify that the results on the + Web page match the results that you expect. +

      + +

      + In the following code snippet, the class tests + a {@link android.webkit.WebView} component with the id value 'webview' + in the activity being tested. + The verifyValidInputYieldsSuccesfulSubmission() test selects an + <input> element on the + Web page, enters some text, and checks text that appears in + another element. +

      + +
      +@LargeTest
      +@RunWith(AndroidJUnit4.class)
      +public class WebViewActivityTest {
      +
      +    private static final String MACCHIATO = "Macchiato";
      +    private static final String DOPPIO = "Doppio";
      +
      +    @Rule
      +    public ActivityTestRule mActivityRule =
      +        new ActivityTestRule(WebViewActivity.class,
      +            false /* Initial touch mode */, false /*  launch activity */) {
      +
      +        @Override
      +        protected void afterActivityLaunched() {
      +            // Enable JavaScript.
      +            onWebView().forceJavascriptEnabled();
      +        }
      +    }
      +
      +    @Test
      +    public void typeTextInInput_clickButton_SubmitsForm() {
      +       // Lazily launch the Activity with a custom start Intent per test
      +       mActivityRule.launchActivity(withWebFormIntent());
      +
      +       // Selects the WebView in your layout.
      +       // If you have multiple WebViews you can also use a
      +       // matcher to select a given WebView, onWebView(withId(R.id.web_view)).
      +       onWebView()
      +           // Find the input element by ID
      +           .withElement(findElement(Locator.ID, "text_input"))
      +           // Clear previous input
      +           .perform(clearElement())
      +           // Enter text into the input element
      +           .perform(DriverAtoms.webKeys(MACCHIATO))
      +           // Find the submit button
      +           .withElement(findElement(Locator.ID, "submitBtn"))
      +           // Simulate a click via JavaScript
      +           .perform(webClick())
      +           // Find the response element by ID
      +           .withElement(findElement(Locator.ID, "response"))
      +           // Verify that the response page contains the entered text
      +           .check(webMatches(getText(), containsString(MACCHIATO)));
      +    }
      +}
      +
      + +

      + For more information about Espresso Web, see the + Espresso + Web documentation on the Android Testing Support Library site.. + You can also download this code snippet as part of the + Espresso Web code sample. +

      + + + +

      + Verifying Results +

      + +

      + Call the + {@code ViewInteraction.check()} + or + {@code DataInteraction.check()} + method to assert + that the view in the UI matches some expected state. You must pass in a + {@code ViewAssertion} + object as the argument. If the assertion fails, Espresso throws + an {@link junit.framework.AssertionFailedError}. +

      + +

      + The {@code ViewAssertions} - class provides a list of helper methods for specifying common - assertions. The assertions you can use include: -

      + class provides a list of helper methods for specifying common + assertions. The assertions you can use include: +

      -
        -
      • - {@code doesNotExist}: -Asserts that there is no view matching the specified criteria in the current view hierarchy. -
      • - -
      • - {@code matches}: - Asserts that the specified view exists in the current view hierarchy - and its state matches some given Hamcrest matcher. -
      • - -
      • - {@code selectedDescendentsMatch} - : Asserts that the specified children views for a - parent view exist, and their state matches some given Hamcrest matcher. -
      • -
      +
        +
      • + {@code doesNotExist}: + Asserts that there is no view matching the specified + criteria in the current view hierarchy. +
      • + +
      • + {@code matches}: + Asserts that the specified view exists in the current view hierarchy + and its state matches some given Hamcrest matcher. +
      • + +
      • + {@code selectedDescendentsMatch}: + Asserts that the specified children views for a + parent view exist, and their state matches some given Hamcrest matcher. +
      • +
      + +

      + The following code snippet shows how you might + check that the text displayed in the UI has + the same value as the text previously entered in the + {@link android.widget.EditText} field. +

      -

      - The following code snippet shows how you might check that the text displayed in the UI has - the same value as the text previously entered in the - {@link android.widget.EditText} field. -

       public void testChangeText_sameActivity() {
           // Type text and then press the button.
      @@ -580,14 +804,22 @@ public void testChangeText_sameActivity() {
       }
       
      -

      Run Espresso Tests on a Device or Emulator

      + + +

      + Run Espresso Tests on a Device or Emulator +

      +

      -You can run Espresso tests from Android Studio or -from the command-line. Make sure to specify - - {@code AndroidJUnitRunner} as the default instrumentation runner in your project. + You can run Espresso tests from + Android Studio or + from the command-line. Make sure to specify + {@code AndroidJUnitRunner} + as the default instrumentation runner in your project.

      +

      -To run your Espresso test, follow the steps for running instrumented tests -described in -Getting Started with Testing.

      + To run your Espresso test, follow the steps for running instrumented tests + described in + Getting Started with Testing. +

      diff --git a/docs/html/training/testing/unit-testing/instrumented-unit-tests.jd b/docs/html/training/testing/unit-testing/instrumented-unit-tests.jd index 8fc4dcac25d486cf999d4fd23ac0bedc7a139c1c..dc94bdf05502ccdb116bb9a0e3fbc3ef65eb7cfd 100644 --- a/docs/html/training/testing/unit-testing/instrumented-unit-tests.jd +++ b/docs/html/training/testing/unit-testing/instrumented-unit-tests.jd @@ -53,8 +53,9 @@ you choose, to simulate any dependency relationships.

      In your Android Studio project, you must store the source files for instrumented tests at -module-name/src/androidTests/java/. This directory -already exists when you create a new project.

      +module-name/src/androidTest/java/. This directory +already exists when you create a new project and contains an example +instrumented test.

      Before you begin, you should download @@ -292,23 +293,21 @@ from the command line. Test results provide test logs and include the details of any app failures.

      - Before you can start using Firebase Test Lab, you need to: + Before you can start using Firebase Test Lab, you need to do the following +unless you already have a Google account and a Firebase project with the Blaze +billing plan enabled:

        -
      1. - Create a - Google Cloud Platform account to use with active billing. -
      2. - -
      3. - Create a Google - Cloud project for your app. -
      4. - -
      5. - Set up an active - billing account and associate it with the project you just created. +
      6. Create a Google account, + if you don't have one already.
      7. +
      8. In the Firebase + console, click Create New Project.
      9. +
      10. In the Firebase console, click Upgrade, and then click Select +Plan in the Blaze plan column. +

        Note: To learn about billing, +see Test +Lab billing.

      @@ -318,10 +317,10 @@ Configure a test matrix and run a test

      - Android Studio provides integrated tools that allow you to configure how you - want to deploy your tests to Firebase Test Lab. After you have created a Google - Cloud project with active billing, you can create a test configuration and - run your tests: +Android Studio provides integrated tools that allow you to configure how you +want to deploy your tests to Firebase Test Lab. After you have created a +Firebase project with Blaze plan billing, you can create a test configuration +and run your tests:

        @@ -329,7 +328,8 @@ Configure a test matrix and run a test the main menu. -
      1. Click Add New Configuration (+) and select +
      2. Click Add New Configuration and select Android Tests.
      3. @@ -340,7 +340,7 @@ Configure a test matrix and run a test
      4. From the Target drop-down menu under Deployment Target - Options, select Cloud Test Lab Device Matrix. + Options, select Firebase Test Lab Device Matrix.
      5. If you are not logged in, click Connect to Google Cloud @@ -348,9 +348,9 @@ Configure a test matrix and run a test
      6. Next to Cloud Project, click the wrench and nut button and select your Google Cloud - Platform project from the list. + "{@docRoot}images/tools/as-wrench.png" alt="" class="inline-icon"/> + button and select your Firebase + project from the list.
      @@ -359,7 +359,7 @@ Configure a test matrix and run a test
      1. Next to the Matrix Configuration drop-down list, click Open Dialog ellipses button. + alt="" class="inline-icon">.
      2. Click Add New Configuration (+). @@ -385,8 +385,7 @@ Configure a test matrix and run a test
      3. Run your tests by clicking Run . + "{@docRoot}images/tools/as-run.png" alt="" class="inline-icon"/>.
      @@ -404,7 +403,7 @@ Configure a test matrix and run a test When Firebase Test Lab completes running your tests, the Run window will open to show the results, as shown in figure 2. You may need to click Show Passed - to see all your executed tests. + "" class="inline-icon"/> to see all your executed tests.

      @@ -416,15 +415,7 @@ Configure a test matrix and run a test

      You can also analyze your tests on the web by following the link displayed at - the beginning of the test execution log in the Run window, as shown - in figure 3. -

      - - - -

      - Figure 3. Click the link to view detailed test results on - the web. + the beginning of the test execution log in the Run window.

      diff --git a/docs/html/training/training_toc.cs b/docs/html/training/training_toc.cs index d0dccba64d3579931d0dec68168f6d4bea54afd1..d2bf881859d5de3471d5feeb119d5f244f470f4e 100644 --- a/docs/html/training/training_toc.cs +++ b/docs/html/training/training_toc.cs @@ -649,25 +649,7 @@ -

    12. Managing Your App's Memory
    13. +
    14. + Overview of Android Memory Management +
    15. image card view when selected.

      on demand. In the browse fragment where your app presents its content to the user, you create a {@link android.support.v17.leanback.widget.Presenter} for the content cards and pass it to the adapter that adds the content to the screen. In the following code, the CardPresenter is created -in the {@link android.support.v4.app.LoaderManager.LoaderCallbacks#onLoadFinished(android.support.v4.content.Loader, java.lang.Object) onLoadFinished()} +in the {@link android.support.v4.app.LoaderManager.LoaderCallbacks#onLoadFinished onLoadFinished()} callback of the {@link android.support.v4.app.LoaderManager}.

      diff --git a/docs/html/training/tv/playback/index.jd b/docs/html/training/tv/playback/index.jd
      index d5e4e6712b053ade7fc0cd15df898194f344f352..34c6287173caa89fdea7c558fe0141e5b4043d04 100644
      --- a/docs/html/training/tv/playback/index.jd
      +++ b/docs/html/training/tv/playback/index.jd
      @@ -69,6 +69,10 @@ startpage=true
           
      Learn how to use the Leanback support library to guide a user through a series of decisions.
      +
      Introducing First-time Users to Your App
      +
      Learn how to use the Leanback support library to show first-time users + how to get the most out of your app.
      +
      Enabling Background Playback
      Learn how to continue playback when the user clicks on Home.
      diff --git a/docs/html/training/tv/playback/onboarding.jd b/docs/html/training/tv/playback/onboarding.jd new file mode 100644 index 0000000000000000000000000000000000000000..bb41bece1d285296ac1e4fb0c60b184767255fe6 --- /dev/null +++ b/docs/html/training/tv/playback/onboarding.jd @@ -0,0 +1,377 @@ +page.title=Introducing First-time Users to Your App +page.tags=tv,onboarding,OnboardingFragment +page.keywords=tv,onboarding,OnboardingFragment +helpoutsWidget=true + +trainingnavtop=true + +@jd:body + + + +

      +To show a first-time user how to get the most from your app, present +onboarding information at app startup. Here are some examples of onboarding +information: +

      + +
        +
      • Present detailed information on which channels are available when a user +first accesses a channel app.
      • +
      • Call attention to noteworthy features in your app.
      • +
      • Illustrate any required or recommended steps that users should take when +using the app for the first time.
      • +
      + +

      The v17 Leanback +support library provides the +{@link android.support.v17.leanback.app.OnboardingFragment} class for +presenting first-time user information. This lesson describes how to use the +{@link android.support.v17.leanback.app.OnboardingFragment} class to present +introductory information that is shown when the app launches for the first +time. {@link android.support.v17.leanback.app.OnboardingFragment} uses TV UI +best practices to present the information in a way that matches TV UI styles, +and is easy to navigate on TV devices.

      + + +

      Figure 1. An example +OnboardingFragment.

      + +

      Your {@link android.support.v17.leanback.app.OnboardingFragment} should +not contain UI elements that require user input, such as buttons and fields. +Similarly, it should not be used as a UI element for a task the user will do +regularly. If you need to present a multi-page UI that requires +user input, consider using a +{@link android.support.v17.leanback.app.GuidedStepFragment}.

      + +

      Add an OnboardingFragment

      + +

      To add an {@link android.support.v17.leanback.app.OnboardingFragment} +to your app, implement a class that extends +the {@link android.support.v17.leanback.app.OnboardingFragment} class. Add +this fragment to an activity, either via the activity's layout XML, or +programmatically. Make sure the activity or +fragment is using a theme derived from +{@link android.support.v17.leanback.R.style#Theme_Leanback_Onboarding}, +as described in Customize Themes.

      + +

      In the {@link android.app.Activity#onCreate onCreate()} method of your +app's main activity, call +{@link android.app.Activity#startActivity startActivity()} +with an {@link android.content.Intent} that points to your +{@link android.support.v17.leanback.app.OnboardingFragment OnboardingFragment's} +parent activity. This ensures that your +{@link android.support.v17.leanback.app.OnboardingFragment} appears as +soon as your app starts.

      + +

      To ensure that the +{@link android.support.v17.leanback.app.OnboardingFragment} only appears the +first time that the user starts your app, use a +{@link android.content.SharedPreferences} object +to track whether the user has already viewed the +{@link android.support.v17.leanback.app.OnboardingFragment}. Define a boolean +value that changes to true when the user finishes viewing the +{@link android.support.v17.leanback.app.OnboardingFragment}. Check +this value in your main activity’s +{@link android.app.Activity#onCreate onCreate()}, and only start the +{@link android.support.v17.leanback.app.OnboardingFragment} parent activity if +the value is false. The following example shows an override of +{@link android.app.Activity#onCreate onCreate()} that checks for a +{@link android.content.SharedPreferences} value and, if not set to true, calls +{@link android.app.Activity#startActivity startActivity()} to +show the {@link android.support.v17.leanback.app.OnboardingFragment}:

      + +
      +@Override
      +protected void onCreate(Bundle savedInstanceState) {
      +    super.onCreate(savedInstanceState);
      +    setContentView(R.layout.activity_main);
      +    SharedPreferences sharedPreferences =
      +            PreferenceManager.getDefaultSharedPreferences(this);
      +    // Check if we need to display our OnboardingFragment
      +    if (!sharedPreferences.getBoolean(
      +            MyOnboardingFragment.COMPLETED_ONBOARDING_PREF_NAME, false)) {
      +        // The user hasn't seen the OnboardingFragment yet, so show it
      +        startActivity(new Intent(this, OnboardingActivity.class));
      +    }
      +}
      +
      + +

      After the user views the +{@link android.support.v17.leanback.app.OnboardingFragment}, mark it as viewed +using the {@link android.content.SharedPreferences} object. To do this, in your +{@link android.support.v17.leanback.app.OnboardingFragment}, override +{@link android.support.v17.leanback.app.OnboardingFragment#onFinishFragment +onFinishFragment()} and set your {@link android.content.SharedPreferences} value +to true, as shown in the following example: + +

      +@Override
      +protected void onFinishFragment() {
      +    super.onFinishFragment();
      +    // User has seen OnboardingFragment, so mark our SharedPreferences
      +    // flag as completed so that we don't show our OnboardingFragment
      +    // the next time the user launches the app.
      +    SharedPreferences.Editor sharedPreferencesEditor =
      +            PreferenceManager.getDefaultSharedPreferences(getContext()).edit();
      +    sharedPreferencesEditor.putBoolean(
      +            COMPLETED_ONBOARDING_PREF_NAME, true);
      +    sharedPreferencesEditor.apply();
      +}
      +
      + +

      Add OnboardingFragment Pages

      + +

      After you add your +{@link android.support.v17.leanback.app.OnboardingFragment}, you need to define +the onboarding pages. An +{@link android.support.v17.leanback.app.OnboardingFragment} displays content +in a series of ordered pages. Each page can have a title, description, and +several sub-views that can contain images or animations.

      + +

      Figure 2. OnboardingFragment +page elements. +

      + +

      Figure 2 shows an example page with callouts marking customizable page +elements that your {@link android.support.v17.leanback.app.OnboardingFragment} +can provide. The page elements are:

      + +
        +
      1. The page title.
      2. +
      3. The page description.
      4. +
      5. The page content view, in this case a simple green checkmark in a grey box. +This view is optional. Use this view to illustrate page details such as a +screenshot that highlights the app feature that the page describes.
      6. +
      7. The page background view, in this case a simple blue gradient. This view +always renders behind other views on the page. This view is optional.
      8. +
      9. The page foreground view, in this case a logo. This view always renders +in front of all other views on the page. This view is optional.
      10. +
      + +

      Initialize page information when your +{@link android.support.v17.leanback.app.OnboardingFragment} is first created +or attached to the parent activity, as the system requests page +information when it creates the fragment's view. You can initialize page +information in your class constructor or in an override of +{@link android.app.Fragment#onAttach onAttach()}.

      + +

      Override each of the following methods that provide page information +to the system:

      + +
        +
      • {@link android.support.v17.leanback.app.OnboardingFragment#getPageCount +getPageCount()} returns the number of pages in your +{@link android.support.v17.leanback.app.OnboardingFragment}.
      • +
      • {@link android.support.v17.leanback.app.OnboardingFragment#getPageTitle +getPageTitle()} returns the title for the requested page number.
      • +
      • {@link android.support.v17.leanback.app.OnboardingFragment#getPageDescription +getPagedescription()} returns the description for the requested page +number.
      • +
      + +

      Override each of the following methods to provide optional sub-views used +to display images or animations:

      + +
        +
      • {@link android.support.v17.leanback.app.OnboardingFragment#onCreateBackgroundView +onCreateBackgroundView()} returns a {@link android.view.View} that you +create to act as the background view, or null if no background view is needed. +
      • {@link android.support.v17.leanback.app.OnboardingFragment#onCreateContentView +onCreateContentView()} returns a {@link android.view.View} that you +create to act as the content view, or null if no content view is needed. +
      • {@link android.support.v17.leanback.app.OnboardingFragment#onCreateForegroundView +onCreateForegroundView()} returns a {@link android.view.View} that you +create to act as the foreground view, or null if no foreground view is needed. +
      + +

      The system adds the {@link android.view.View} that you create to the page +layout. The following example overrides +{@link android.support.v17.leanback.app.OnboardingFragment#onCreateContentView +onCreateContentView()} and returns an {@link android.widget.ImageView}:

      + +
      +private ImageView mContentView;
      +...
      +@Override
      +protected View onCreateContentView(LayoutInflater inflater, ViewGroup container) {
      +    mContentView = new ImageView(getContext());
      +    mContentView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
      +    mContentView.setImageResource(R.drawable.onboarding_content_view);
      +    mContentView.setPadding(0, 32, 0, 32);
      +    return mContentView;
      +}
      +
      + +

      Add an Initial Logo Screen

      + +

      Your {@link android.support.v17.leanback.app.OnboardingFragment} can start +with an optional logo screen that introduces your app. If you want to display +a {@link android.graphics.drawable.Drawable} as your logo screen, in your +{@link android.support.v17.leanback.app.OnboardingFragment OnboardingFragment's} +{@link android.app.Fragment#onCreate onCreate()} method, call +{@link android.support.v17.leanback.app.OnboardingFragment#setLogoResourceId +setLogoResourceId()} with the ID of your +{@link android.graphics.drawable.Drawable}. The +system will fade in and briefly display this +{@link android.graphics.drawable.Drawable}, and then fade out the +{@link android.graphics.drawable.Drawable} +before displaying the first page of your +{@link android.support.v17.leanback.app.OnboardingFragment}.

      + +

      If you want to provide a custom animation for your logo screen, instead of +calling +{@link android.support.v17.leanback.app.OnboardingFragment#setLogoResourceId +setLogoResourceId()}, override +{@link android.support.v17.leanback.app.OnboardingFragment#onCreateLogoAnimation +onCreateLogoAnimation()} and return an {@link android.animation.Animator} +object that renders your custom animation, as shown in the following example: +

      + +
      +@Override
      +public Animator onCreateLogoAnimation() {
      +    return AnimatorInflater.loadAnimator(mContext,
      +            R.animator.onboarding_logo_screen_animation);
      +}
      +
      + +

      Customize Page Animations

      + +

      The system uses default animations when displaying the first page of your +{@link android.support.v17.leanback.app.OnboardingFragment} and when the user +navigates to a different page. You can customize these animations by +overriding methods in your +{@link android.support.v17.leanback.app.OnboardingFragment}.

      + +

      To customize the animation that appears on your first page, +override +{@link android.support.v17.leanback.app.OnboardingFragment#onCreateEnterAnimation +onCreateEnterAnimation()} and return an {@link android.animation.Animator}. +The following example creates an +{@link android.animation.Animator} that scales the content view +horizontally:

      + +
      +@Override
      +protected Animator onCreateEnterAnimation() {
      +    Animator startAnimator = ObjectAnimator.ofFloat(mContentView,
      +            View.SCALE_X, 0.2f, 1.0f).setDuration(ANIMATION_DURATION);
      +    return startAnimator;
      +}
      +
      + +

      To customize the animation used when the user navigates to a different page, +override +{@link android.support.v17.leanback.app.OnboardingFragment#onPageChanged +onPageChanged()}. In your +{@link android.support.v17.leanback.app.OnboardingFragment#onPageChanged +onPageChanged()} method, create {@link android.animation.Animator Animators} +that remove the previous page and display the next page, add these to an +{@link android.animation.AnimatorSet}, and play the set. The following +example uses a fade-out animation to remove the previous page, updates the +content view image, and uses a fade-in animation to display the next page:

      + +
      +@Override
      +protected void onPageChanged(final int newPage, int previousPage) {
      +    // Create a fade-out animation used to fade out previousPage and, once
      +    // done, swaps the contentView image with the next page's image.
      +    Animator fadeOut = ObjectAnimator.ofFloat(mContentView,
      +            View.ALPHA, 1.0f, 0.0f).setDuration(ANIMATION_DURATION);
      +    fadeOut.addListener(new AnimatorListenerAdapter() {
      +        @Override
      +        public void onAnimationEnd(Animator animation) {
      +            mContentView.setImageResource(pageImages[newPage]);
      +        }
      +    });
      +    // Create a fade-in animation used to fade in nextPage
      +    Animator fadeIn = ObjectAnimator.ofFloat(mContentView,
      +            View.ALPHA, 0.0f, 1.0f).setDuration(ANIMATION_DURATION);
      +    // Create AnimatorSet with our fade-out and fade-in animators, and start it
      +    AnimatorSet set = new AnimatorSet();
      +    set.playSequentially(fadeOut, fadeIn);
      +    set.start();
      +}
      +
      + +

      For more details about how to create +{@link android.animation.Animator Animators} and +{@link android.animation.AnimatorSet AnimatorSets}, see + +Property Animations.

      + +

      Customize Themes

      + +

      Any {@link android.support.v17.leanback.app.OnboardingFragment} +implementation must use either the +{@link android.support.v17.leanback.R.style#Theme_Leanback_Onboarding} theme +or a theme that inherits from +{@link android.support.v17.leanback.R.style#Theme_Leanback_Onboarding}. Set the +theme for your {@link android.support.v17.leanback.app.OnboardingFragment} by +doing one of the following:

      + +
        +
      • Set the {@link android.support.v17.leanback.app.OnboardingFragment +OnboardingFragment's} parent activity to use the desired theme. The following +example shows how to set an activity to use +{@link android.support.v17.leanback.R.style#Theme_Leanback_Onboarding} in the +app manifest: +
        +<activity
        +   android:name=".OnboardingActivity"
        +   android:enabled="true"
        +   android:exported="true"
        +   android:theme="@style/Theme.Leanback.Onboarding">
        +</activity>
        +
        +
      • +
      • +Set the theme in the parent activity by using the +{@link android.support.v17.leanback.R.styleable#LeanbackOnboardingTheme_onboardingTheme} +attribute in a custom activity theme. Point this attribute to another +custom theme that only the +{@link android.support.v17.leanback.app.OnboardingFragment} +objects in your activity use. Use this approach if your activity already uses +a custom theme and you don't want to apply +{@link android.support.v17.leanback.app.OnboardingFragment} styles to other +views in the activity. +
      • +
      • Override +{@link android.support.v17.leanback.app.OnboardingFragment#onProvideTheme +onProvideTheme()} and return the desired theme. Use this approach if +multiple activities use your +{@link android.support.v17.leanback.app.OnboardingFragment} +or if the parent activity can't use the desired theme. +The following example overrides +{@link android.support.v17.leanback.app.OnboardingFragment#onProvideTheme +onProvideTheme()} and returns +{@link android.support.v17.leanback.R.style#Theme_Leanback_Onboarding}: +
        +@Override
        +public int onProvideTheme() {
        +   return R.style.Theme_Leanback_Onboarding;
        +}
        +
        +
      • +
      \ No newline at end of file diff --git a/docs/html/training/tv/start/hardware.jd b/docs/html/training/tv/start/hardware.jd index 97cf7ff6626d09652d0803c9017078e87a50c87f..063987159b7978e5a1156f41dbabbb5f95311aba 100644 --- a/docs/html/training/tv/start/hardware.jd +++ b/docs/html/training/tv/start/hardware.jd @@ -227,13 +227,19 @@ if (uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION) {@link android.Manifest.permission#ACCESS_COARSE_LOCATION} - {@code android.hardware.location} and
      - {@code android.hardware.location.network} + +

      {@code android.hardware.location}

      +

      {@code android.hardware.location.network} (Target API level 20 or lower + only.)

      + {@link android.Manifest.permission#ACCESS_FINE_LOCATION} - {@code android.hardware.location} and
      - {@code android.hardware.location.gps} + +

      {@code android.hardware.location}

      +

      {@code android.hardware.location.gps} (Target API level 20 or lower + only.)

      + @@ -246,6 +252,13 @@ if (uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION) required ({@code android:required="false"}).

      +

      + Note: If your app targets Android 5.0 (API level 21) or + higher and uses the ACCESS_COARSE_LOCATION or + ACCESS_FINE_LOCATION permission, users can still install your + app on a TV device, even if the TV device doesn't have a network card or a GPS + receiver. +

      Checking for hardware features

      diff --git a/docs/html/training/tv/tif/tvinput.jd b/docs/html/training/tv/tif/tvinput.jd index 1a53398e6e4c8646aac6d2c4ec68cb1e5c39d121..2153ef866860e1b2b20682e7798b004d27d7ce1c 100644 --- a/docs/html/training/tv/tif/tvinput.jd +++ b/docs/html/training/tv/tif/tvinput.jd @@ -10,9 +10,8 @@ trainingnavtop=true

      A TV input service represents a media stream source, and lets you present your media content in a -linear, broadcast TV fashion as channels and programs. With the TV input service, you can provide +linear, broadcast TV fashion as channels and programs. With a TV input service, you can provide parental controls, program guide information, and content ratings. The TV input service works -with the Android system TV app, developed for the device and immutable by third-party apps, which -ultimately controls and presents content on the TV. See +with the Android system TV app. This app ultimately controls and presents channel content +on the TV. The system TV app is developed specifically for the device and immutable +by third-party apps. For more information about the TV Input Framework (TIF) +architecture and its components, see -TV Input Framework for more information about the framework architecture and its components.

      +TV Input Framework.

      -

      To develop a TV input service, you implement the following components:

      +

      Create a TV Input Service Using the TIF Companion Library

      + +

      +The TIF Companion Library is a framework that provides extensible +implementations of common TV input service features. Use the TIF Companion +Library to quickly and easily create your own TV input service that follows +best practices for Android TV. +

      + +

      Update your build.gradle file

      + +

      +To get started using the TIF Companion Library, add the following line to your +app's build.gradle file: +

      + +
      +compile 'com.google.android.media.tv.companionlibrary:1.0.0'
      +
      + +

      The TIF Companion Library is not currently part of the Android +framework. It is distributed as part of the +TV Input Service sample app, and not with the Android SDK. +

      + +

      Declare your TV input service in the manifest

      + +

      Your app must provide a {@link android.media.tv.TvInputService}-compatible +service that the system uses to access your app. The TIF +Companion Library provides the BaseTvInputService class, which +provides a default implementation of {@link android.media.tv.TvInputService} +that you can customize. Create a subclass of BaseTvInputService, +and declare the subclass in your manifest as a service.

      + +

      Within the manifest declaration, specify the +{@link android.Manifest.permission#BIND_TV_INPUT} permission to allow the +service to connect the TV input to the system. A system service +performs the binding and has the +{@link android.Manifest.permission#BIND_TV_INPUT} permission. +The system TV app sends requests to TV input services +via the {@link android.media.tv.TvInputManager} interface.

      + +

      In your service declaration, include an intent filter that specifies +{@link android.media.tv.TvInputService} as the action to perform with the +intent. Also declare the service metadata as a separate XML resource. The +service declaration, intent filter, and service metadata declaration are shown +in the following example:

      + +
      +<service android:name=".rich.RichTvInputService"
      +    android:label="@string/rich_input_label"
      +    android:permission="android.permission.BIND_TV_INPUT">
      +    <!-- Required filter used by the system to launch our account service. -->
      +    <intent-filter>
      +        <action android:name="android.media.tv.TvInputService" />
      +    </intent-filter>
      +    <!-- An XML file which describes this input. This provides pointers to
      +    the RichTvInputSetupActivity to the system/TV app. -->
      +    <meta-data
      +        android:name="android.media.tv.input"
      +        android:resource="@xml/richtvinputservice" />
      +</service>
      +
      + +

      Define the service metadata in a separate XML file. The service +metadata XML file must include a setup interface that describes the TV input's +initial configuration and channel scan. The metadata file should also contain a +flag stating whether or not users are able to record content. For more +information on how to support recording content in your app, see +TV Recording. +

      + +

      The service metadata file is located in the XML resources directory +for your app and must match the name of the resource you declared in the +manifest. Using the manifest entries from the previous example, you would +create the XML file at res/xml/richtvinputservice.xml, with the +following contents:

      + +
      +<?xml version="1.0" encoding="utf-8"?>
      +<tv-input xmlns:android="http://schemas.android.com/apk/res/android"
      +  android:canRecord="true"
      +  android:setupActivity="com.example.android.sampletvinput.rich.RichTvInputSetupActivity" />
      +
      + +

      Define channels and create your setup activity

      + +

      Your TV input service must define at least one channel that users +access via the system TV app. You should register your channels +in the system database, and provide a setup activity that the system +invokes when it cannot find a channel for your app.

      + +

      First, enable your app to read from and write to the system Electronic +Programming Guide (EPG), whose data includes channels and programs available +to the user. To enable your app to perform these actions, and sync with the +EPG after device restart, add the following elements to your app manifest:

      + +
      +<uses-permission android:name="com.android.providers.tv.permission.READ_EPG_DATA" />
      +<uses-permission android:name="com.android.providers.tv.permission.WRITE_EPG_DATA" />
      +<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED "/>
      +
      + +

      Add the following element to ensure that your app shows up in the +Google Play Store as an app that provides content channels in Android TV:

      + +
      +<uses-feature
      +    android:name="android.software.live_tv"
      +    android:required="true" />
      +
      + +

      Next, create a class which extends the EpgSyncJobService +class. This abstract class makes it easy to create a job service that +creates and updates channels in the system database.

      + +

      In your subclass, create and return your full list of channels in +getChannels(). If your channels come from an XMLTV file, +use the XmlTvParser class. Otherwise generate +channels programmatically using the Channel.Builder class. +

      + +

      For each channel, the system calls getProgramsForChannel() +when it needs a list of programs that can be viewed within a given time window +on the channel. Return a list of Program objects for the +channel. Use the XmlTvParser class to obtain programs from an +XMLTV file, or generate them programmatically using the +Program.Builder class.

      + +

      For each Program object, use an +InternalProviderData object to set program information such as the +program's video type. If you only have a limited number of programs that you +want the channel to repeat in a loop, use the +InternalProviderData.setRepeatable() method with a value of +true when setting information about your program.

      + +

      After you've implemented the job service, add it to your app manifest:

      + +
      +<service
      +    android:name=".sync.SampleJobService"
      +    android:permission="android.permission.BIND_JOB_SERVICE"
      +    android:exported="true" />
      +
      + +

      Finally, create a setup activity. Your setup activity should provide a way +to sync channel and program data. One way to do this is for the user to do it +via the UI in the activity. You might also have the app do it automatically +when the activity starts. When the setup activity needs to sync channel and +program info, the app should start the job service:

      + +
      +String inputId = getActivity().getIntent().getStringExtra(TvInputInfo.EXTRA_INPUT_ID);
      +EpgSyncJobService.cancelAllSyncRequests(getActivity());
      +EpgSyncJobService.requestImmediateSync(getActivity(), inputId,
      +        new ComponentName(getActivity(), SampleJobService.class));
      +
      + +

      Use the requestImmediateSync() method to sync +the job service. The user must wait for the sync to finish, so you should +keep your request period relatively short.

      + +

      Use the setUpPeriodicSync() method to have the job service +periodically sync channel and program data in the background:

      + +
      +EpgSyncJobService.setUpPeriodicSync(context, inputId,
      +        new ComponentName(context, SampleJobService.class));
      +
      + +

      The TIF Companion Library provides an additional overloaded method of +requestImmediateSync() that lets you specify the duration of +channel data to sync in milliseconds. The default method syncs one hour's +worth of channel data. +

      + +

      The TIF Companion Library also provides an additional overloaded method of +setUpPeriodicSync() that lets you specify the duration of +channel data to sync, and how often the periodic sync should occur. The +default method syncs 48 hours of channel data every 12 hours. +

      + +

      For more details about channel data and the EPG, see + Working with Channel Data. +

      + +

      Handle tuning requests and media playback

      + +

      When a user selects a specific channel, the system TV app uses a +Session, created by your app, to tune to the requested channel +and play content. The TIF Companion Library provides several +classes you can extend to handle channel and session calls from the system.

      + +

      Your BaseTvInputService subclass creates sessions which handle +tuning requests. Override the +onCreateSession() method, create a session extended from +the BaseTvInputService.Session class, and call +super.sessionCreated() with your new session. In the following +example, onCreateSession() returns a +RichTvInputSessionImpl object that extends +BaseTvInputService.Session:

      + +
      +@Override
      +public final Session onCreateSession(String inputId) {
      +    RichTvInputSessionImpl session = new RichTvInputSessionImpl(this, inputId);
      +    session.setOverlayViewEnabled(true);
      +    return super.sessionCreated(session);
      +}
      +
      + +

      When the user uses the system TV app to start viewing one of your channels, +the system calls your session's onPlayChannel() method. Override +this method if you need to do any special channel initialization before the +program starts playing.

      + +

      The system then obtains the currently scheduled program and calls your +session's onPlayProgram() method, specifying the program +information and start time in milliseconds. Use the +TvPlayer interface to start playing the program.

      + +

      Your media player code should implement TvPlayer to handle +specific playback events. The TvPlayer class handles features +like time-shifting controls without adding complexity to your +BaseTvInputService implementation.

      + +

      In your session's getTvPlayer() method, return +your media player that implements TvPlayer. The + +TV Input Service sample app implements a media player that uses +ExoPlayer.

      + +

      Create a TV Input Service Using the TIF Framework

      + +

      If your TV input service can't use the TIF Companion Library, you need +to implement the following components:

      • {@link android.media.tv.TvInputService} provides long-running and background availability for @@ -56,43 +294,18 @@ TV Input Framework for more information about the framework architecture and the interaction with TV inputs and apps
      -

      Declare Your TV Input Service in the Manifest

      - -

      Your app manifest must declare your {@link android.media.tv.TvInputService}. Within that -declaration, specify the {@link android.Manifest.permission#BIND_TV_INPUT} permission to allow the -service to connect the TV input to the system. A system service (TvInputManagerService) -performs the binding and has that permission. The system TV app sends requests to TV input services -via the {@link android.media.tv.TvInputManager} interface. The service declaration must also -include an intent filter that specifies the {@link android.media.tv.TvInputService} -as the action to perform with the intent. Also within the service declaration, declare the service -meta data in a separate XML resource. The service declaration, the intent filter and the service -meta data are described in the following example.

      - -
      -<service android:name="com.example.sampletvinput.SampleTvInput"
      -    android:label="@string/sample_tv_input_label"
      -    android:permission="android.permission.BIND_TV_INPUT">
      -    <intent-filter>
      -        <action android:name="android.media.tv.TvInputService" />
      -    </intent-filter>
      -    <meta-data android:name="android.media.tv.input"
      -      android:resource="@xml/sample_tv_input" />
      -</service>
      -
      - -

      Define the service meta data in separate XML file, as shown in the following example. The service -meta data must include a setup interface that describes the TV input's initial configuration and -channel scan. The service meta data file is located in the XML resources directory -for your application and must match the name of the resource in the manifest. Using the example -manifest entries above, you would create an XML file in the location -res/xml/sample_tv_input.xml, with the following contents:

      +

      You also need to do the following:

      -
      -<tv-input xmlns:android="http://schemas.android.com/apk/res/android"
      -  android:setupActivity="com.example.sampletvinput.SampleTvInputSetupActivity" />
      -
      +
        +
      1. Declare your TV input service in the manifest, as +described in Declare your TV input service in the +manifest.
      2. +
      3. Create the service metadata file.
      4. +
      5. Create and register your channel and program information.
      6. +
      7. Create your setup activity.
      8. +
      -

      Define Your TV Input Service

      +

      Define your TV input service

      @@ -102,7 +315,7 @@ manifest entries above, you would create an XML file in the location

      For your service, you extend the {@link android.media.tv.TvInputService} class. A {@link android.media.tv.TvInputService} implementation is a bound service where the system service -(TvInputManagerService) is the client that binds to it. The service life cycle methods +is the client that binds to it. The service life cycle methods you need to implement are illustrated in figure 1.

      The {@link android.app.Service#onCreate()} method initializes and starts the @@ -145,7 +358,8 @@ you may want to handle in your TV input service.

      The {@link android.media.tv.TvInputService} creates a {@link android.media.tv.TvInputService.Session} that implements {@link android.os.Handler.Callback} -to handle player state changes. With {@link android.media.tv.TvInputService.Session#onSetSurface(android.view.Surface) onSetSurface()}, +to handle player state changes. With +{@link android.media.tv.TvInputService.Session#onSetSurface(android.view.Surface) onSetSurface()}, the {@link android.media.tv.TvInputService.Session} sets the {@link android.view.Surface} with the video content. See Integrate Player with Surface for more information about working with {@link android.view.Surface} to render video.

      @@ -153,16 +367,16 @@ for more information about working with {@link android.view.Surface} to render v

      The {@link android.media.tv.TvInputService.Session} handles the {@link android.media.tv.TvInputService.Session#onTune(android.net.Uri) onTune()} event when the user selects a channel, and notifies the system TV app for changes in the content and -content meta data. These notify() methods are described in +content metadata. These notify() methods are described in Control Content and Handle Track Selection further in this training.

      -

      Define Your Setup Activity

      +

      Define your setup activity

      The system TV app works with the setup activity you define for your TV input. The setup activity is required and must provide at least one channel record for the system database. The -system TV app will invoke the setup activity when it cannot find a channel for the TV input. +system TV app invokes the setup activity when it cannot find a channel for the TV input.

      The setup activity describes to the system TV app the channels made available through the TV input, as demonstrated in the next lesson, Creating -and Updating Channel Data.

      +and Updating Channel Data.

      \ No newline at end of file diff --git a/docs/html/training/volley/index.jd b/docs/html/training/volley/index.jd index a8c4b84c7c478f3b7710f0c79db56c4b5cfd235a..d3645d9c89922f1eeaa4a2299a2206fd7fa07c5b 100755 --- a/docs/html/training/volley/index.jd +++ b/docs/html/training/volley/index.jd @@ -42,7 +42,7 @@ faster. Volley is available through the open
    16. Automatic scheduling of network requests.
    17. Multiple concurrent network connections.
    18. Transparent disk and memory response caching with standard HTTP -cache coherence.
    19. +cache coherence.
    20. Support for request prioritization.
    21. Cancellation request API. You can cancel a single request, or you can set blocks or scopes of requests to cancel.
    22. @@ -66,13 +66,22 @@ alternative like {@link android.app.DownloadManager}.

      AOSP repository at {@code frameworks/volley} and contains the main request dispatch pipeline as well as a set of commonly applicable utilities, available in the Volley "toolbox." The -easiest way to add Volley to your project is to clone the Volley repository and set it as -a library project:

      +easiest way to add Volley to your project is to add the following dependency to your app's +build.gradle file: + +
      +dependencies {
      +    ...
      +    compile 'com.android.volley:volley:1.0.0'
      +}
      +
      + +You can also clone the Volley repository and set it as a library project:

      1. Git clone the repository by typing the following at the command line: -
        +
         git clone https://android.googlesource.com/platform/frameworks/volley
         
      2. diff --git a/docs/html/training/wearables/data-layer/messages.jd b/docs/html/training/wearables/data-layer/messages.jd index ef9bfb176a5bcc381dad4c22a83b7ff5a535cf89..8c4b730c97cddaacbe132be50d8de6482dda3afa 100644 --- a/docs/html/training/wearables/data-layer/messages.jd +++ b/docs/html/training/wearables/data-layer/messages.jd @@ -10,12 +10,6 @@ page.title=Sending and Receiving Messages
      3. Send a Message
      4. Receive a Message
      -

      Try it out

      - @@ -27,6 +21,7 @@ and attach the following items to the message:

    23. An arbitrary payload (optional)
    24. A path that uniquely identifies the message's action
    25. +

      Unlike with data items, there is no syncing between the handheld and wearable apps. Messages are a one-way communication mechanism that's good for remote procedure calls (RPC), @@ -149,11 +144,9 @@ If you create a service that extends WearableListenerService to detect capability changes, you may want to override the onConnectedNodes() -method to listen to finer-grained connectivity details, such as when a wearable device switches -from Wi-Fi to a Bluetooth connection to the handset. For an example implementation, see the -DisconnectListenerService class in the -FindMyPhone -sample. For more information on how to listen for important events, see +method to listen to finer-grained connectivity details, such as when a wearable +device switches from Wi-Fi to a Bluetooth connection to the handset. +For more information on how to listen for important events, see Listen for Data Layer Events.

      diff --git a/docs/html/training/wearables/notifications/creating.jd b/docs/html/training/wearables/notifications/creating.jd index 35bb2bda2479ff7dd4e39cb813c25dc9115d7c17..5663b585b94e7deb6e6e6b75f383e87cf22a29da 100644 --- a/docs/html/training/wearables/notifications/creating.jd +++ b/docs/html/training/wearables/notifications/creating.jd @@ -58,7 +58,7 @@ such as action buttons and large icons, while remaining compatible with Android

      To create a notification with the support library, you create an instance of {@link android.support.v4.app.NotificationCompat.Builder} and issue the notification by -passing it to {@link android.support.v4.app.NotificationManagerCompat#notify(int, android.app.Notification) notify()}. For example: +passing it to {@link android.support.v4.app.NotificationManagerCompat#notify notify()}. For example:

      diff --git a/docs/html/training/wearables/notifications/stacks.jd b/docs/html/training/wearables/notifications/stacks.jd
      index c3f43a7f6eb075ee47060a7160929d14c4762947..8056fc8ad53debc2b22ccffb811568d2e201306e 100644
      --- a/docs/html/training/wearables/notifications/stacks.jd
      +++ b/docs/html/training/wearables/notifications/stacks.jd
      @@ -37,7 +37,7 @@ possible while allowing you to still provide only one summary notification on th
       
       

      To create a stack, call {@link android.support.v4.app.NotificationCompat.Builder#setGroup setGroup()} for each notification you want in the stack and specify a -group key. Then call {@link android.support.v4.app.NotificationManagerCompat#notify(int, android.app.Notification) notify()} +group key. Then call {@link android.support.v4.app.NotificationManagerCompat#notify notify()} to send it to the wearable.

      @@ -59,7 +59,7 @@ notificationManager.notify(notificationId1, notif);
       
       

      Later on, when you create another notification, specify the same group key. When you call -{@link android.support.v4.app.NotificationManagerCompat#notify(int, android.app.Notification) notify()}, +{@link android.support.v4.app.NotificationManagerCompat#notify notify()}, this notification appears in the same stack as the previous notification, instead of as a new card:

      diff --git a/docs/html/tv/_project.yaml b/docs/html/tv/_project.yaml new file mode 100644 index 0000000000000000000000000000000000000000..d2d41e1ce267a68f0eb4c46b4a745a946f7aacad --- /dev/null +++ b/docs/html/tv/_project.yaml @@ -0,0 +1,6 @@ +name: "TV" +home_url: /tv/ +description: "Bring your apps, games, and content to the biggest screen in the house." +content_license: cc3-apache2 +buganizer_id: 30209417 +parent_project_metadata_path: /about/_project.yaml diff --git a/docs/html/tv/index.jd b/docs/html/tv/index.jd index 7c958c006b54a582598c685ffac7bf9e85166d25..6ecc1ea7f6579b9a08463b16764b45877737e5d9 100644 --- a/docs/html/tv/index.jd +++ b/docs/html/tv/index.jd @@ -13,7 +13,7 @@ nonavpage=true diff --git a/docs/html/wear/_project.yaml b/docs/html/wear/_project.yaml index 2a9427432791ad0bdbcf54de4a73ccbcc133d490..114cc5b74d762a3f53208b8c24a462509ca8243d 100644 --- a/docs/html/wear/_project.yaml +++ b/docs/html/wear/_project.yaml @@ -3,3 +3,4 @@ home_url: /wear/ description: "Small, powerful devices, worn on the body. Useful information when you need it most." content_license: cc3-apache2 buganizer_id: 30209417 +parent_project_metadata_path: /about/_project.yaml diff --git a/docs/html/wear/images/partners/mkors.png b/docs/html/wear/images/partners/mkors.png new file mode 100644 index 0000000000000000000000000000000000000000..2f1e8ec3aad4f4c159f1b7ff660bb597e1e9d877 Binary files /dev/null and b/docs/html/wear/images/partners/mkors.png differ diff --git a/docs/html/wear/images/partners/nixon.png b/docs/html/wear/images/partners/nixon.png new file mode 100644 index 0000000000000000000000000000000000000000..8674da27974d12015acf38ddd589103e5a8a7812 Binary files /dev/null and b/docs/html/wear/images/partners/nixon.png differ diff --git a/docs/html/wear/images/partners/polar.png b/docs/html/wear/images/partners/polar.png new file mode 100644 index 0000000000000000000000000000000000000000..2faeb063e1ff5ed9a8decfa30caa708eaa465dd7 Binary files /dev/null and b/docs/html/wear/images/partners/polar.png differ diff --git a/docs/html/wear/index.jd b/docs/html/wear/index.jd index f5e9e87748b93513d72194eb85d21b1b50f0dc1a..1eb08bec612c31f3b0c9b688d4110d4e6c768534 100644 --- a/docs/html/wear/index.jd +++ b/docs/html/wear/index.jd @@ -9,7 +9,7 @@ nonavpage=true @@ -266,6 +266,9 @@ nonavpage=true
      MIPS +
      +
      + Michael
      Mobvoi @@ -276,6 +279,12 @@ nonavpage=true
      New Balance
      +
      + Nixon +
      +
      + Polar +
      Qualcomm
      diff --git a/docs/html/wear/preview/_book.yaml b/docs/html/wear/preview/_book.yaml index a231fb5daa246369a23aac5c3d8de02d0adf13e2..54d5442ec6314929a0990d28e5b3daa9ce1b7d07 100644 --- a/docs/html/wear/preview/_book.yaml +++ b/docs/html/wear/preview/_book.yaml @@ -8,18 +8,24 @@ toc: - title: API Overview path: /wear/preview/api-overview.html section: - - title: Notification Improvements - path: /wear/preview/features/notifications.html - - title: Input Method Framework - path: /wear/preview/features/ime.html - title: Complications path: /wear/preview/features/complications.html - title: Navigation and Actions path: /wear/preview/features/ui-nav-actions.html + - title: Curved Layout + path: /wear/preview/features/wearable-recycler-view.html + - title: Notification Improvements + path: /wear/preview/features/notifications.html - title: Bridging for Notifications path: /wear/preview/features/bridger.html + - title: Input Method Framework + path: /wear/preview/features/ime.html - title: Wrist Gestures path: /wear/preview/features/gestures.html + - title: Standalone apps + path: /wear/preview/features/standalone-apps.html + - title: App Distribution + path: /wear/preview/features/app-distribution.html - title: Get Started path: /wear/preview/start.html diff --git a/docs/html/wear/preview/_project.yaml b/docs/html/wear/preview/_project.yaml new file mode 100644 index 0000000000000000000000000000000000000000..4f7083ef32df557120be8b7f27a63c694bf13268 --- /dev/null +++ b/docs/html/wear/preview/_project.yaml @@ -0,0 +1,6 @@ +name: "Wear Preview" +home_url: /wear/preview/ +description: "Small, powerful devices, worn on the body. Useful information when you need it most." +content_license: cc3-apache2 +buganizer_id: 30209417 +parent_project_metadata_path: /wear/_project.yaml diff --git a/docs/html/wear/preview/api-overview.jd b/docs/html/wear/preview/api-overview.jd index 0b3ac6bf4b2ddad88ea5f4b4fb86b8acee146e4a..f4612a2599580b802298f9fc0c53ccad1f93d34b 100644 --- a/docs/html/wear/preview/api-overview.jd +++ b/docs/html/wear/preview/api-overview.jd @@ -13,15 +13,16 @@ page.image=images/cards/card-n-apis_2x.png
      1. Complications
      2. Navigation and Action Drawers
      3. +
      4. Curved Layout
    26. Notifications and Input
        -
      1. Expanded Notification
      2. -
      3. Messaging Style Notification
      4. +
      5. Expanded Notifications
      6. +
      7. Messaging Style Notifications
      8. +
      9. Inline Action
      10. Smart Reply
      11. -
      12. Notification Content Action
      13. Remote Input
      14. Bridging Mode
      15. Input Method Framework
      16. @@ -40,308 +41,447 @@ page.image=images/cards/card-n-apis_2x.png
    27. - - -

      - The Android Wear Preview API is still in active development, but you can try - it now as part of the Wear 2.0 Developer Preview. The sections below - highlight some of the new features for Android Wear developers. -

      - - -

      User Interface Improvements

      - -

      - The preview introduces powerful additions to the user interface, opening up - exciting possibilities to developers. A complication - is any feature in a watch face that displays more than hours and - minutes. With the Complications API, watch faces can display extra information - and separate apps can expose complication data. The navigation and action - drawers provide users with new ways to interact with apps. -

      - - -

      Complications

      - - -

      - A complication is a - feature of a watch face that displays more than hours and minutes, such as a - battery indicator or a step counter. The Complications API thus helps watch face - developers create visual features and the data connections they - require. -

      - -

      - Watch faces that use this API can display extra information without needing - code for getting the underlying data. Data providers can supply data to any - watch face using the API. -

      - -

      For information about this API, -see - Watch Face Complications. -

      - -

      Navigation and Action drawers

      - -

      Wear 2.0 introduces two new widgets, navigation drawer and action drawer. These - widgets give your users new ways to interact with your app. The navigation drawer - appears at the top of the screen and allows users to navigate between app views. - The action drawer appears at the bottom of the screen and allows users to choose - from a list of actions associated with the current usage context. These drawers - are accessible to users when they edge swipe from the top or bottom of the - screen; they peek when users scroll in an opposite direction. -

      - -
      -
      - -
      -
      - -
      -
      - -

      - To learn how to add these widgets to your app, see - - Wear Navigation and Actions. -

      - - -

      Notifications and Input

      - -

      In Wear 2.0, we’ve redesigned the key experiences on the watch to be even more - intuitive and provide users new ways to respond to messages. Some of the highlights - are below; for a complete list of changes, see - Notification Changes in Wear 2.0. - - - -

      Expanded notifications

      - -

      - When a user taps on a notification that is bridged from the phone to the - watch or that lacks a - - {@code contentIntent}, the user will be taken to the expanded view of - that notification. When you specify additional - content pages and actions for a notification, those are available to the - user within the expanded notification. Each expanded notification follows - Material Design for Android - Wear, so the user gets an app-like experience. -

      - - -

      Messaging Style notification

      -

      If you have a chat messaging app, your notifications should use -{@code Notification.MessagingStyle}, which is new in Android 6.0. Wear 2.0 uses -the chat messages included in a -{@code MessagingStyle} - notification -(see {@code addMessage()}) to provide a rich chat app-like experience in the -expanded notification. -

      - - -

      Smart Reply

      - -

      Android Wear 2.0 introduces support for Smart Reply in -{@code MessagingStyle} - notifications. Smart Reply provides the user with contextually relevant, - touchable choices in the expanded notification and in - {@code RemoteInput}. -

      - -

      By enabling Smart Reply for your {@code MessagingStyle} notifications, you provide -users a fast (single tap), discreet (no speaking aloud), and reliable way to respond - to chat messages they receive. -

      - - - - -

      Remote Input

      - -

      Wear 2.0 users can choose between various input options from -Remote Input. - These options include: -

      -
        -
      • Dictation
      • -
      • Emoji
      • -
      • Canned responses
      • -
      • Smart Reply -
      • Default IME -
      - -

      -For messaging notifications with Smart Reply, the system-generated Smart Reply - appears within {@code RemoteInput} - above the developer-provided list of canned responses. - You can also use the - setChoices() - method in the {@code RemoteInput} API to enable users to select from a list - of canned responses. -

      - -

      Bridging Mode

      -

      By default, notifications are - -bridged (shared) from an app on a companion phone -to the watch. Since a phone app and a standalone watch app may be sources of the - same notifications, the Android Wear 2.0 Preview includes a Bridging mode feature. - Developers can begin planning to change the behavior of notifications with the - following: -

      - -
        -
      • Specifying in the standalone app's Android manifest file that notifications from - the corresponding phone app should not be bridged to the watch.
      • -
      • Setting a dismissal ID so notification dismissals (by users) are synced across -devices.
      • -
      - -

      For an example of how to use this feature, see -Bridging Mode for Notifications.

      - -

      Input Method Framework

      - -

      Wear 2.0 extends the Android input method framework (IMF) to Android Wear. -This allows users to enter text on Wear using the system default IME or third party - IMEs. The Wear IME lets the user enter text via gesture typing as well as tapping - individual keys. The IMF APIs used for Wear devices are the same as other form - factors, though usage is slightly different due to limited screen real estate. -

      - -

      Wear provides user settings on the watch that let the user:

      -
        -
      • Enable multiple IMEs from the list of installed IMEs.
      • -
      • Set a single default IME from the list of enabled IMEs.
      • -
      • Change languages for various IMEs.
      • -
      - -

      To learn how to create an IME for Wear, see -Input Method Framework. -

      - -

      Wrist Gestures

      - -

      - Wrist gestures can enable quick, one-handed interactions with your app - when use of a touch screen is inconvenient. The following - wrist gestures - are available for use by apps: -

      - -
        -
      • Flick wrist out
      • -
      • Flick wrist in
      • -
      - -

      For more information, see - - Wrist Gestures. -

      - -

      Standalone Devices

      - -

      Standalone watches will enable Android Wear apps to work independently of phone - apps. This means your app can continue to offer full functionality even if the - paired phone is far away or turned off.

      - -

      Wear-Specific APKs

      - -

      For delivery to a watch, an Android Wear app is currently embedded in its corresponding -phone app. This delivery method can result in an increased download size for users, - regardless of whether they have an Android Wear device. -

      - -

      With standalone devices, the -Multi-APK - delivery method will be used. Developers will have the ability to release Android - Wear apps independently of the corresponding phone apps. Please stay tuned for - more information about this change. -

      - -

      Network Access

      - -

      Since Android Wear apps will work independently of phone apps, Android Wear's - network access will no longer require the - - Wearable Data Layer API. Android Wear apps will have the ability to make - their own network requests. Additionally, they will be able to directly use - Google Cloud Messaging. -

      - -

      No APIs for network access or GCM are specific to Android Wear; refer to the -existing documentation about - -Connecting to the Network and -Cloud Messaging. -

      - -

      We recommend using the following libraries:

      - - -

      You will still be able to use the - - Wearable Data Layer API to communicate with a phone app. - However, use of this API to connect to a network will be discouraged. -

      - - -

      Authentication

      - -

      Since Android Wear apps will work independently of phone apps, Android Wear's - authentication capabilities will be more powerful; apps will have new ways to - authenticate.

      - -

      Users can enter a username and password on a watch

      - -

      Google Keyboard will be standard on Android Wear, allowing for direct text -entry. This feature will work as expected with standard -EditText widgets. -For passwords, the {@code textPassword} attribute will be used.

      - -

      Utilizing Account Manager

      - -

      Android Wear will include the - -AccountManager, which will be accessible for syncing and storing account -data, as it is on an Android phone.

      - -

      Authentication tokens can be passed over the Wearable Data Layer

      - -

      For Android-paired watches (only), a phone securely -transfers authentication credentials to a watch app via the - -Wearable Data Layer API. The credentials can be transferred as -messages or data items.

      - -

      If your watch app needs to determine if your phone app is installed, you can -advertise a capability on the phone app and retrieve the capability on the -watch. For more information, see the following sections of - -Sending and Receiving Messages:

      - -
        -
      • Advertise Capabilities
      • -
      • Retrieve the Nodes with the Required Capabilities
      • -
      +

      + Wear 2.0 is still in active development, but you can try it as part of + the Wear 2.0 Developer Preview. The sections below highlight some of the + new features for developers. +

      + +

      + User Interface Improvements +

      + +

      + The preview introduces powerful additions to the user interface, opening + up exciting possibilities to developers. +

      + +

      + Complications +

      + + +

      + A complication + is a feature of a watch face that displays more than hours and minutes, + such as a battery indicator or a step counter. The Complications API thus + helps watch face developers create visual features and the data + connections they require. +

      + +

      + Watch faces that use this API can display extra information without + needing code for getting the underlying data. Data providers can supply + data to any watch face using the API. +

      + +

      + For information about this API, see Watch Face + Complications. +

      + +

      + Navigation and Action Drawers +

      + +

      + Wear 2.0 introduces two new widgets, navigation drawer and action drawer. + These widgets give your users new ways to interact with your app. The + navigation drawer appears at the top of the screen and allows users to + navigate between app views. The action drawer appears at the bottom of + the screen and allows users to choose from a list of actions associated + with the current usage context. These drawers are accessible to users + when they edge swipe from the top or bottom of the screen; they peek when + users scroll in an opposite direction. +

      + +
      +
      + +
      + +
      + +
      +
      + +

      + To learn how to add these widgets to your app, see Wear Navigation and + Actions. +

      + +

      + Curved Layout +

      + +

      + Wear 2.0 introduces the WearableRecyclerView class for + displaying and manipulating a vertical list of items, + optimized for round displays. +

      + +

      + The key features include the following: +

      + +
        +
      • A curved layout on round devices +
      • + +
      • A circular scrolling gesture, which can be toggled on and off +
      • +
      + +

      + To learn how to create a curved layout optimized for round devices, see + + Curved Layout. +

      + +

      + Notifications and Input +

      + +

      + In Wear 2.0, we’ve redesigned the key experiences on the watch to be even + more intuitive and provide users new ways to respond to messages. Some of + the highlights are below; for a complete list of changes, see Notification Changes + in Wear 2.0. +

      + +

      + Expanded Notifications +

      + +

      + When a user taps on a notification that is bridged from the phone to the + watch or that lacks a + {@code contentIntent}, the user will be taken to the expanded view of + that notification. When you specify + additional content pages and actions for a notification, those are + available to the user within the expanded notification. Each expanded + notification follows Material Design for Android + Wear, so the user gets an app-like experience. +

      + +

      + Messaging Style Notifications +

      + +

      + If you have a chat messaging app, your notifications should use {@code + Notification.MessagingStyle}, which is new in Android 6.0. Wear 2.0 uses + the chat messages included in a {@code + MessagingStyle} notification (see {@code addMessage()}) to provide a + rich chat, app-like experience in the expanded notification. +

      + +

      + Inline Action +

      + +

      + Wear 2.0 enables you to add an inline action within the notification + stream so that users can quickly take an action on a notification. + Examples of good use cases for an inline action within a notification stream + include replying to a text message, stopping a fitness activity, or + archiving an email message. +

      + +

      + To learn how to add an inline action to your notification stream, see + + Inline Action. +

      + +

      + Smart Reply +

      + +

      + Android Wear 2.0 introduces support for Smart Reply in {@code + MessagingStyle} notifications. Smart Reply provides the user with + contextually relevant, touchable choices in the expanded notification and + in {@code + RemoteInput}. +

      + +

      + By enabling Smart Reply for your {@code MessagingStyle} notifications, + you provide users a fast (single tap), discreet (no speaking aloud), and + reliable way to respond to chat messages they receive. +

      + + + +

      + Remote Input +

      + +

      + Wear 2.0 users can choose between various input options from Remote Input. + These options include: +

      + +
        +
      • Dictation +
      • + +
      • Emoji +
      • + +
      • Canned responses +
      • + +
      • Smart Reply +
      • + +
      • Default IME +
      • +
      + +

      + For messaging notifications with Smart Reply, the system-generated Smart + Reply appears within {@code + RemoteInput} above the developer-provided list of canned responses. + You can also use the + setChoices() method in the {@code RemoteInput} API to enable users to + select from a list of canned responses. +

      + +

      + Bridging Mode +

      + +

      + By default, notifications are bridged + (shared) from an app on a companion phone to the watch. Since a phone app + and a standalone watch app may be sources of the same notifications, the + Android Wear 2.0 Preview includes a Bridging mode feature. +

      + +

      + For information about this feature, see Bridging Mode for + Notifications. +

      + +

      + Input Method Framework +

      + +

      + Wear 2.0 extends the Android input method framework (IMF) to Android + Wear. This allows users to enter text on Wear using the system default + IME or third party IMEs. The Wear IME lets the user enter text via + gesture typing as well as tapping individual keys. The IMF APIs used for + Wear devices are the same as other form factors, though usage is slightly + different due to limited screen real estate. +

      + +

      + Wear provides user settings on the watch that let the user: +

      + +
        +
      • Enable multiple IMEs from the list of installed IMEs. +
      • + +
      • Set a single default IME from the list of enabled IMEs. +
      • + +
      • Change languages for various IMEs. +
      • +
      + +

      + To learn how to create an IME for Wear, see Input Method Framework. +

      + +

      + Wrist Gestures +

      + +

      + Wrist gestures can enable quick, one-handed interactions with your app + when use of a touch screen is inconvenient. The following wrist + gestures are available for use by apps: +

      + +
        +
      • Flick wrist out +
      • + +
      • Flick wrist in +
      • +
      + +

      + For more information, see Wrist Gestures. +

      + +

      + Standalone Devices +

      + +

      + Standalone watches enable Android Wear apps to work independently of + phone apps. This means your app can continue to offer full functionality + even if the paired phone is far away or turned off. +

      + +

      + Wear-Specific APKs +

      + +

      + For delivery to a watch, an Android Wear app is currently embedded in its + corresponding phone app. This delivery method can result in an increased + download size for users, regardless of whether they have an Android Wear + device. +

      + +

      + For information about planning and building your standalone app + for Wear 2.0, see + Standalone Apps. +

      + +

      + For information about distributing your app, see + App Distribution. +

      + +

      + Network Access +

      + +

      + Since Android Wear apps will work independently of phone apps, Android + Wear's network access will no longer require the Wearable Data Layer + API. Android Wear apps will have the ability to make their own + network requests. Additionally, they will be able to directly use Google + Cloud Messaging. For more information, see + + Network Access and Cloud Messaging. +

      + +

      + No APIs for network access or GCM are specific to Android Wear; refer to + the existing documentation about Connecting to the + Network and Cloud Messaging. +

      + +

      + We recommend using the following libraries: +

      + + + +

      + The Wearable Data Layer + API is available to communicate with a phone app. + However, use of this API to connect to a network will be discouraged. +

      + +

      + Authentication +

      + +

      + Since Android Wear apps will work independently of phone apps, Android + Wear's authentication capabilities will be more powerful; apps will have + new ways to authenticate. +

      + +

      + Users can enter a username and password on a watch +

      + +

      + Google Keyboard will be standard on Android Wear, allowing for direct + text entry. This feature will work as expected with standard EditText widgets. + For passwords, the {@code textPassword} attribute will be used. +

      + +

      + Utilizing Account Manager +

      + +

      + Android Wear will include the AccountManager, + which will be accessible for syncing and storing account data, as it is + on an Android phone. +

      + +

      + Authentication tokens can be passed over the Wearable Data Layer +

      + +

      + For Android-paired watches (only), a phone securely transfers + authentication credentials to a watch app via the Wearable Data Layer + API. The credentials can be transferred as messages or data items. +

      + +

      + If your watch app needs to determine if your phone app is installed, you + can advertise a capability on the phone app and retrieve the capability + on the watch. For more information, see the following sections of + Sending + and Receiving Messages: +

      + +
        +
      • Advertise Capabilities +
      • + +
      • Retrieve the Nodes with the Required Capabilities +
      • +
      diff --git a/docs/html/wear/preview/behavior-changes.jd b/docs/html/wear/preview/behavior-changes.jd index 02146220dbddf12e775e5581f501fa0512a98115..c93d337a0a8c0cd4941e7a534ec3313aeebb50bd 100644 --- a/docs/html/wear/preview/behavior-changes.jd +++ b/docs/html/wear/preview/behavior-changes.jd @@ -22,6 +22,8 @@ page.tags="preview", "developer preview" @@ -61,3 +63,44 @@ page.tags="preview", "developer preview" navigation drawers.

      + +

      Invalid Fields for a Complication Type

      + +

      + When a watch face uses the + Complications API, the watch face requests data from a chosen provider. + A ComplicationData object, which contains + complication types, is returned. +

      + +

      + A complication type determines the + kinds of data that a watch face can render. This section describes + a behavior change related to the ComplicationData object. +

      + +

      + Starting with + + Developer Preview 3, when a watch face requests a field that is invalid + for a complication type, a default value for the field is returned. + For example, if a watch face tries to access a Long text + field in a SHORT_TEXT type, the default value for the + Long text field is returned. + In previous releases, such a request for an invalid field + (for a type) resulted in an exception. +

      + +

      Complication Types for Empty Data

      + +

      + Starting with + + Developer Preview 3, the complication types used for "empty" data are + changed. Apps that use the Complications API + may need to be updated to use + TYPE_NO_DATA. See the information + about TYPE_NO_DATA in the + + Types and fields section. +

      diff --git a/docs/html/wear/preview/downloads.jd b/docs/html/wear/preview/downloads.jd index 4bc401bae0728756cd8c87556ca168283273b394..bfa384bf2f104079901d22314cb22a1775321809 100644 --- a/docs/html/wear/preview/downloads.jd +++ b/docs/html/wear/preview/downloads.jd @@ -171,7 +171,9 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement
    28. Set Up a Watch
    29. - +
    30. + Set Up a Phone +
    31. Set Up an Emulator
    32. @@ -180,7 +182,7 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement

      - You can run and test your app with the Android Wear 2.0 Developer Preview + You can run and test your app with the Android Wear 2.0 Preview in either of these ways:

      @@ -237,6 +239,13 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement following tables and flash it to the corresponding device.

      +

      Caution: + After you flash an image to a watch, follow the steps for + setting up a phone with the beta version of + the Android Wear companion app. To use a Wear 2.0 image on a watch, + you must have the beta companion app on a paired phone. +

      +

      To restore your device to its original state during the preview, you can flash the appropriate retail system image, below, to the device. @@ -266,9 +275,9 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement Preview image for testing - nemo-nvd83h-factory-48ac950c.tgz
      - MD5: dd351884cce9fb5bf1bdec0a8e5f56e3
      - SHA-1: 48ac950c48faef96a7770e3c1acb56d23a28d859 + nemo-nve68j-factory-302a33ea.tgz
      + MD5: ddfccc3e050c7e2db8d657c82f7d6291
      + SHA-1: 302a33eac348c401fcb165bad4b9aaa40c7beb2b @@ -276,9 +285,9 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement Non-preview image (for after testing) - nemo-mnc40x-factory-fa528bec.tgz
      - MD5: 0b8ba3653d5a93cb854f4d7409d7b6c9
      - SHA-1: fa528bec8aba3bf6c7d901ba63cd6ea0a08dbeb0 + nemo-mfd18l-factory-3faf6f2d.tgz
      + MD5: f3a0090c0e99da82ad095b5d2a9acc6d
      + SHA-1: 3faf6f2d7f422a17a5f6c54cf5e1d2c5622689b0 @@ -307,18 +316,18 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement Preview image for testing - sturgeon-nvd83h-factory-cb5a11ab.tgz
      - MD5: 38c1047992b1d28f6833d9f6c8470cdc
      - SHA-1: cb5a11ab0260ea3ca7da5894e73e41f70357da6b + sturgeon-nve68j-factory-6607cd31.tgz
      + MD5: f78ac6ba8bb84038d163cc2d7ca85040
      + SHA-1: 6607cd31858af1bfd50b905c68f7cf1f0b6e570e Non-preview image (for after testing) - sturgeon-mec23l-factory-48003078.tgz
      - MD5: 417b5cbddb29a2262bce133e283d2732
      - SHA-1: 4800307843580f818557dd7c43d8ba2161e289b2 + sturgeon-m6e69f-factory-e659286a.tgz
      + MD5: 12ce6cb0b0e43b67ea46a886eae052ae
      + SHA-1: e659286aa9004f4555a476ede4e8b690f56cfefd @@ -337,7 +346,8 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement

      - Warning: Installing a system image on a watch removes all data from the + Warning: Installing a system image on a watch + removes all data from the watch, so you should back up your data first.

      @@ -346,8 +356,7 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement

      - From the phone, unpair ("Forget") the watch. - Then on the watch, enable the Developer Options menu and ADB debugging as + On the watch, enable the Developer Options menu and ADB debugging as follows:

      @@ -356,14 +365,14 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement
    33. Scroll to the bottom of the menu. If no Developer - Options item is provided, tap About. + Options item is provided, tap System + and then About.
    34. Tap the build number 7 times.
    35. -
    36. From the Settings menu, tap the Developer Options - item. +
    37. From the Settings menu, tap Developer Options.
    38. Enable ADB debugging. @@ -409,7 +418,9 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement
    39. Use the following adb - command to confirm that the watch is available for flashing: + command to confirm that the watch is recognized. + You may need to turn ADB debugging off and then on for the watch to + be recognized: adb devices
    40. @@ -423,11 +434,11 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement devices, fastboot oem unlock -
    41. On the watch, select the Unlock option. +
    42. On the watch, select the option to unlock the bootloader.
    43. -
    44. Navigate to the directory where you unzipped the system image in Step - 1. At the top level of that directory, +
    45. On your computer, navigate to the directory where you unzipped the + system image in Step 1. At the top level of that directory, execute the flash-all script by typing flash-all.sh or, in the case of Windows, flash-all.bat. The following may need to @@ -437,18 +448,19 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement

      - Set up the watch and begin testing + Set up the watch

      -

      - After the flash-all script finishes, your watch reboots. - Pair the watch with a phone or tablet. The preview now is available - for testing on the watch. Before installing an app, perform the - following steps on the watch to re-secure the watch's bootloader: +

      + After the flash-all script finishes, the watch reboots. + Only pair the watch with a phone (so you can begin testing the preview) + by using the instructions in Set Up a Phone. + Additionally, before installing an app, perform the + following steps on the watch to re-secure the watch's bootloader:

        -
      1. Open the Settings menu (on the watch). +
      2. Open the Settings menu by long-pressing the physical button.
      3. Scroll to the bottom of the menu and tap About. @@ -457,15 +469,16 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement
      4. Tap the build number 7 times.
      5. -
      6. From the Settings menu, tap the Developer Options - item. +
      7. From the Settings menu, tap Developer Options.
      8. Enable ADB debugging.
      9. Connect the watch to your computer and tap Always allow from - this computer. + this computer. (You may need to turn ADB debugging off + and then on, to be prompted to always allow ADB debugging from + the connected computer.)
      10. Use the following adb command to start the device in fastboot mode: @@ -477,13 +490,18 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement devices, fastboot oem lock
      11. -
      12. On the watch, continue the boot by choosing - Start and touching '0'. +
      13. On the watch, continue the boot as follows: + On an LGE Watch Urbane 2nd Edition, choose + Start and touch '0'. + On a Huawei Watch, confirm that Reboot is chosen and + long-press the physical button.

      - Your watch is ready for you to Set Up a Phone, + your watch will be ready for you to install and run your app:

      @@ -539,13 +557,116 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement device reset and removes all user data on the device.

      +

      + Set Up a Phone +

      + +

      + On a phone, follow the instructions in this section to install the beta + version of the Android Wear companion app. The beta version cannot be run + on a phone at the same time as the non-beta version. Additionally, the + beta version is English-only. +

      + +

      +

      Caution: If you have an existing + pairing of the phone to a Wear 1.x + watch, installation of the beta companion app will cause a loss of that + pairing. +

      + +

      + Join the Wear 2.0 preview group +

      + +

      + To access the beta companion app, you must join + the preview group in Google Groups. +

      + +

      + Opt in for beta testing +

      + +

      + On the Testing + Opt-in page, select Become a Tester. +

      + +

      + Download and install the beta version of the companion app +

      + +

      + On the Play Store on your phone, go to the + Android Wear app listing. Tap Update to download and + install the beta version of the app. After installation, confirm that + Auto-update is selected for the app (see + the "Set up automatic updates for specific apps" section of Update downloaded + apps). Tap Open to start the app. +

      + +

      + Pair the phone to the watch +

      + +

      + After you install the beta version of the companion app on a phone, + unpair ("Forget") any obsolete watch pairings, if necessary. + Then you can pair the phone to a newly-imaged watch: +

      + +
        +
      1. On the phone, select your device name from the list of devices. + A pairing code is displayed on the phone and on the watch. + Ensure that the codes match. +
      2. + +
      3. Tap Pair to + continue the pairing process. When the watch is connected to + the phone, a confirmation message is displayed. + On the phone, a screen is displayed that lists + the accounts on the phone. +
      4. + +
      5. Choose a Google Account to add and sync to your watch. +
      6. + +
      7. Confirm the screen lock and enter the password to start the copying of + the account from the phone to the watch. +
      8. + +
      9. Follow the instructions in the wizard to finish the + pairing process. +
      10. +
      + +

      + You can begin testing your app with the preview. +

      +

      Set Up an Emulator

      - To test with the Android Emulator, create a virtual device in Android - Studio as follows: + To test with the Android Emulator, + confirm that you have the latest version of the Android SDK + Platform-tools from the SDK Manager. +

      + +

      + After you create a virtual device as described below, follow the steps for + setting up a phone with the beta version of + the Android Wear companion app. +

      + +

      Create a new virtual device in Android Studio as follows:

        @@ -556,19 +677,19 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement
      1. Click Create Virtual Device.
      2. -
      3. In the Category pane, select Wear and - choose a hardware profile. +
      4. In the Category pane, select Wear + and choose a hardware profile. The Android Wear 2.0 Developer Preview is only optimized for round devices currently, so we recommend not using the square or chin profiles for now. Click Next.
      5. -
      6. Select an N image to download. The images may be on +
      7. Select a Nougat image to download. The images may be on the x86 tab instead of the Recommended tab, until installed. For example, select the image with the - Release Name of N, the API Level of N, - and the Target of "Android 6.X (with Android Wear)". + Release Name of Nougat, the API Level of 24, + and the Target of "Android 7.0 (with Android Wear)". When the download and installation are complete, click Finish and then click Next.
      8. @@ -576,16 +697,68 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement
      9. Verify the configuration of the Android Virtual Device (AVD) and click Finish.
      10. + +
      11. Start the emulator by selecting the new virtual device, clicking the + Play button, and waiting until + the emulator initializes and shows the Android Wear home screen. +

      - You can now test an application with a virtual preview device + Pair the phone with the emulator, and sync a Google Account, as follows: +

      + +
        +
      1. Follow the steps for + setting up a phone with the beta version of + the Android Wear companion app. +
      2. + +
      3. On the phone, enable Developer Options and USB Debugging. +
      4. + +
      5. Connect the phone to your computer through USB. +
      6. + +
      7. Forward the AVD's communication port to the connected handheld device + (each time the phone is connected):
        + adb -d forward tcp:5601 tcp:5601 +
      8. + +
      9. On the phone, in the Android Wear app, begin the standard pairing + process. For example, on the Welcome screen, tap the + Set It Up button. + Alternatively, if an existing watch already is paired, in the upper-left + drop-down, tap Add a New Watch. +
      10. + +
      11. On the phone, in the Android Wear app, tap the + Overflow button, and then tap + Pair with Emulator. +
      12. + +
      13. Tap the Settings icon. +
      14. + +
      15. Under Device Settings, tap Emulator. +
      16. + +
      17. Tap Accounts and select a Google Account, + and follow the steps in the wizard to + sync the account with the emulator. If necessary, type the screen-lock + device password, and Google Account password, to start the account sync. +
      18. +
      + +

      + You can now test an app with a virtual preview device in the Android Emulator. For more information about using virtual devices, see Managing AVDs with the AVD - Manager. + "{@docRoot}studio/run/managing-avds.html"> + Create and Manage Virtual Devices.

      + diff --git a/docs/html/wear/preview/features/app-distribution.jd b/docs/html/wear/preview/features/app-distribution.jd new file mode 100644 index 0000000000000000000000000000000000000000..afc95165e49b7c1ffb38cbe0a418840ae41fc1f1 --- /dev/null +++ b/docs/html/wear/preview/features/app-distribution.jd @@ -0,0 +1,329 @@ +page.title=App Distribution +meta.keywords="wear-preview" +page.tags="wear-preview" +page.image=images/cards/card-n-sdk_2x.png +@jd:body + + + +

      + With Android Wear 2.0, a user can visit the Play Store on a watch and + download a Wear app directly to the watch. +

      + +

      + Generally, a Wear 2.0 app in the Play Store needs + a minimum and target API level of 24 or higher in + the Android manifest file. The minimum SDK level can be 23 + only if you are using the same APK + for Wear 1.0 and 2.0 (and thus have an embedded Wear 1.0 APK). +

      + +

      + Publish Your APKs +

      + +

      + To make your app appear in the on-watch Play Store, upload + the watch APK in the Play Developer Console just as you would any other + APK. If you only have a watch APK and no phone APK, no other steps + are required. +

      + +

      + If you have a phone APK in addition to a watch APK, you must use the + Multi-APK delivery method. +

      + +

      + Run-time + permissions are required. +

      + +

      + Also see + + Standalone Apps. +

      + +

      + Distribution to Wear 2.0 watches +

      + +

      + If you only want your app to be distributed to Wear 2.0 watches, + it is unnecessary to embed the watch APK inside the the phone APK. +

      + +

      + If you want your app to + be distributed to Wear 1.0 watches, you need to embed the + watch APK inside the phone APK, as described directly below. +

      + +

      + Distribution to Wear 1.0 and 2.0 watches +

      + +

      + If you are already distributing your app to Wear 1.0 watches, + follow these steps: +

      + +
        +
      1. Provide a Wear 2.0 (standalone) version of your watch APK that can be made + available in the Play Store on Wear. +
      2. + +
      3. Continue embedding a Wear 1.0 APK in your phone APK, + for use by watches that do not have Wear 2.0. +
      4. +
      + +

      + Specifying a version code +

      + +

      + To ensure that a standalone APK acts as an upgrade to an embedded Wear APK, the + standalone Wear APK's + version code generally should be higher than the embedded Wear APK's version code. + (A phone APK's version code scheme can be independent from that of a watch + APK, although they must be unique.) However, the version codes + of the standalone APK and the embedded Wear APK can be the same if + the APKs are equivalent. If the APKs are not equivalent, + but the version code is the same, then when a watch updates from Wear 1.0 + to 2.0, the watch may get the new APK only after waiting for a + longer-than-expected period of time. +

      + +

      + Note that it currently is not possible to create a single APK that works + on a phone and watch. +

      + +

      + Support in the Gradle file +

      + +

      + If you have a Wear app that is intended for both Wear 1.0 and Wear 2.0, + consider using + product flavors. For example, + if you want to target both SDK version 23 and version 24, + update your Wear module's build.gradle file to include + the following if an existing embedded app has a minimum SDK version of 23: +

      + +
      +android {
      +    // Allows you to reference product flavors in your
      +    // phone module's build.gradle file
      +    publishNonDefault true
      +    ...
      +    defaultConfig
      +    {
      +       // This is the minSdkVersion of the Wear 1.0 embedded app
      +       minSdkVersion 23
      +       ...
      +    }
      +    buildTypes {...}
      +    productFlavors {
      +        wear1 {
      +          // Use the defaultConfig value
      +        }
      +        wear2 {
      +            minSdkVersion 24
      +        }
      +    }
      +}
      +
      + +

      + Then update your phone module’s build.gradle file, replacing + wearApp as follows: +

      + +
      +dependencies {
      +    ...
      +    wearApp project(path: ':wear', configuration: 'wear1Release')
      +}
      +
      + +

      + A + build variant is a combination of the product flavor and build type. + In Android Studio, select the appropriate build variant when + debugging or publishing your app. For example, if wear2 is a + product flavor, select wear2Release as the + release build variant. +

      + +

      + For purposes of code that is Wear 2.0-specific or Wear 1.0-specific, + consider + source sets for build variants. +

      + + +

      + Setting Up Targeting for a Watch +

      + +

      + In your Android Manifest file, you must specify the following feature + restriction: the uses-feature element is set to + android.hardware.type.watch. Do not set + the required attribute to false. + A single APK for Wear and non-Wear devices presently is not supported. +

      + +

      + Thus, if an APK has the following setting, Google Play provides the APK + to watches only: +

      + +
      +<manifest package="com.example.standalone"
      +    xmlns:android="http://schemas.android.com/apk/res/android">
      +    <uses-feature
      +        android:name="android.hardware.type.watch"
      +    ...
      +</manifest>
      +
      + +

      + The android.hardware.type.watch setting above can be + combined with other criteria such as SDK version, screen resolution, and + CPU architecture. Thus, different Wear APKs can target different hardware + configurations. +

      + +

      + Using the Play Developer Console +

      + +

      + Below is an introduction to uploading + a standalone Wear APK to an application listing using the Play Developer + Console. +

      + +

      + If your app supports both Wear 1.0 and Wear 2.0, continue embedding the + Wear 1.0 APK (minimum SDK version of 20, 21, or 22, or 23) in the phone + APK and upload the phone APK. In addition, upload your standalone Wear + 2.0 APK (which has a minimum SDK version of 24). +

      + +

      + Also see + Multiple APK Support and + Manage Your App. + Before uploading an APK as described below, the APK + must be + signed. +

      + +

      + Uploading your APK +

      + +

      + Go to the Play Developer + Console, navigate to your application listing, and select + APK in the left-navigation panel. An APK screen similar to + the following is displayed: +

      + alt_text + +

      + You may need to use advanced mode for uploads, as follows: +

      + +
        +
      • Advanced mode is unnecessary if you only have a Wear 2.0 app and no + phone app. Instead of advanced mode, use simple mode.
      • + +
      • Use advanced mode if you support Wear 1.0 or have a phone app.
      • +
      + +

      + Therefore, on the above APK screen, to determine whether to click + the Switch to advanced mode + button, consider the following: +

      + +
        +
      • If your app does not support Wear 1.0, and only has a watch APK, + upload it using simple mode. +
      • + +
      • If your app does not support Wear 1.0 and has both a watch APK and a + phone APK, click Switch to advanced mode + to upload the watch and phone APKs. +
      • +
      + +

      + See + Simple mode and advanced mode for more information about toggling + between modes. +

      + +

      + Select the appropriate tab (Production, Beta + Testing, or Alpha Testing) for your upload. + Then click + the Upload New APK button and select your standalone + Wear APK for upload. +

      + +

      + Reviewing and publishing +

      + +

      + After you upload your standalone Wear APK and scroll down the resulting + page, the APK is shown in the Current APK table, with a + version number, in a similar way to the following: +

      + alt_text + +

      + Finally, in the Current APK table above, click the line + with the Version to review the APK. The APK + Details panel is displayed. You can verify, for example, that + the number in the Supported Android Devices line is far + fewer than the number would be for a typical phone APK: +

      + alt_text + +

      + When you are ready, publish + your app. +

      diff --git a/docs/html/wear/preview/features/bridger.jd b/docs/html/wear/preview/features/bridger.jd index b7be093ed2987b3c5970d58593110c3dc4dd8542..2d879caeccc2e1e862dc66784c8032f05d64cd46 100644 --- a/docs/html/wear/preview/features/bridger.jd +++ b/docs/html/wear/preview/features/bridger.jd @@ -6,19 +6,26 @@ page.tags="wear-preview"
      -
        +
      +
    46. + Existing Method of Preventing Bridging +
    47. + +
    48. + Using a Dismissal ID to Sync Notification Dismissals +
    49. + @@ -27,19 +34,20 @@ page.tags="wear-preview" "{@docRoot}training/wearables/notifications/index.html">are bridged (shared) from an app on a companion phone to the watch. If you build a standalone watch app and have a companion phone app, they may duplicate - notifications. The Android Wear 2.0 Preview includes a Bridging mode - feature to handle this problem of repeated notifications. + notifications. The Android Wear 2.0 Preview includes + features to handle this problem of repeated notifications.

      - With the Android Wear 2.0 Preview, developers can change the - behavior of notifications with the following: + With the Android Wear 2.0 Preview, developers can change the behavior of + notifications with one or more of the following:

        -
      • Specifying in the standalone app's Android manifest file that - notifications from the corresponding phone app should not be - bridged to the watch +
      • Specifying a bridging configuration in the manifest file +
      • + +
      • Specifying a bridging configuration at runtime
      • Setting a dismissal ID so notification dismissals are synced across @@ -47,43 +55,201 @@ page.tags="wear-preview"
      -

      - Preventing Bridging with the Bridging Mode Feature +

      + Specifying a Bridging Configuration in the Manifest File

      - To prevent bridging of notifications from a phone app, you can use an + An app's Android manifest file can indicate that notifications from the + corresponding phone app should not be bridged to the watch. Specifically, + to prevent bridging of notifications from a phone app, you can use a + <meta-data> entry in the manifest file of the watch app (e.g. the standalone watch app), as follows:

      -
      +
       com.google.android.wearable.notificationBridgeMode
      -    
      +

      Setting that entry to NO_BRIDGING will prevent bridging:

      -
      -<meta-data android:name="com.google.android.wearable.notificationBridgeMode"
      -                   android:value="NO_BRIDGING" />
      +
      +<meta-data android:name="com.google.android.wearable.notificationBridgeMode"
      +                   android:value="NO_BRIDGING" />
       
      +

      - The default bridging behavior occurs if you do not include the entry or + The default bridging behavior occurs if you do not + include the <meta-data> entry or if you specify a value of BRIDGING instead of NO_BRIDGING.

      -

      - Existing method of preventing bridging +

      + For an existing app, if you are using + Google Cloud Messaging (GCM) or Firebase Cloud + Messaging (FCM) to send notification alerts to devices, + you may already have disabled bridging in case a phone is not + connected at the time of receiving an alert. + In this case, you may still want to dismiss the notification + across other devices when it is dismissed in a watch app. +

      + +

      + The bridging configuration that is set in the manifest takes effect as + soon as a watch app is installed. +

      + +

      + Specifying a Bridging Configuration at Runtime +

      + +

      + This section describes how to specify a bridging configuration at runtime + using the BridgingManager class + (android.support.wearable.notifications.BridgingManager). +

      + +

      + You can set a bridging mode, and optionally set tags for notifications + that are exempt from the bridging mode, using a + BridgingManager object. Specifically, create a + BridgingConfig object and set it as shown in this section, + optionally using the setBridgingEnabled method. If you + specify a bridging configuration at runtime, then if the + setBridgingEnabled method is not set, bridging is enabled by + default. +

      + +

      + Specifying a bridging configuration at runtime overrides a + bridging-related setting in the Android manifest file. +

      + +

      + Disable bridging for all notifications +

      + +

      + You can use the setBridgingEnabled method, as follows: +

      + +
      +BridgingManager.setConfig(context,
      +  new BridgingConfig.Builder(context)
      +    .setBridgingEnabled(false)
      +    .build());
      +
      +

      + If the above setter is not called, the bridging mode defaults to true. + Here is an example of setting tags without using the + setBridgingEnabled method, excluding notifications with a + tag of foo or bar: +

      + +
      +BridgingManager.setConfig(context,
      +  new BridgingConfig.Builder(context)
      +    .addExcludedTag("foo")
      +    .addExcludedTag("bar")
      +    .build());
      +
      +

      + Exempt notifications that are tagged

      +

      + You can disable bridging for all notifications except those with certain + tags. +

      + +

      + For example, you can disable bridging, except for notifications tagged as + foo or bar, with the following: +

      + +
      +BridgingManager.setConfig(context,
      +  new BridgingConfig.Builder(context)
      +    .setBridgingEnabled(false)
      +    .addExcludedTag("foo")
      +    .addExcludedTag("bar")
      +    .build());
      +
      + +

      + As another example, you can disable bridging for all notifications except + for notifications tagged as foo, bar or + baz. +

      + +
      +BridgingManager.setConfig(context,
      +  new BridgingConfig.Builder(context)
      +    .setBridgingEnabled(false)
      +    .addExcludedTags(Arrays.asList("foo", "bar", "baz"))
      +    .build());
      +
      +

      + Enable bridging except for notifications with certain tags +

      + +

      + You can enable bridging for all notifications except those with certain + tags. +

      + +

      + For example, you can enable bridging for all notifications, except for + notifications tagged as foo or bar, with the + following: +

      + +
      +BridgingManager.setConfig(context,
      +  new BridgingConfig.Builder(context)
      +    .setBridgingEnabled(true)
      +    .addExcludedTag("foo")
      +    .addExcludedTag("bar")
      +    .build());
      +
      + +

      + Setting a bridge tag +

      + +

      + A bridge tag can be set on a notification by calling the + setNotificationBridgeTag method as follows: +

      + +
      +BridgingManager.setNotificationBridgeTag(<NotificationCompat.Builder>, <String>);
      +
      + +

      + For example: +

      + +
      +NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
      +<set other fields>;
      +BridgingManager.setNotificationBridgeTag(builder, "foo");
      +Notification notification =  builder.build();
      +
      + +

      + Existing Method of Preventing Bridging +

      +

      An existing way to prevent bridging is with the Notification.Builder class; specify true in the + "http://developer.android.com/reference/android/app/Notification.Builder.html#setLocalOnly(boolean)"> setLocalOnly method.

      @@ -95,12 +261,6 @@ com.google.android.wearable.notificationBridgeMode the watch app may not be installed on all of them.

      -

      - Thus, if bridging should be prevented when the watch app - is installed, use the Bridging mode - feature. -

      Using a Dismissal ID to Sync Notification Dismissals @@ -110,7 +270,7 @@ com.google.android.wearable.notificationBridgeMode If you prevent bridging with the Bridging mode feature, dismissals (cancellations) of notifications are not synced across a user's devices. However, the following methods of the + "http://developer.android.com/reference/android/support/v4/app/NotificationCompat.WearableExtender.html"> NotificationCompat.WearableExtender class enable you to use dismissal IDs:

      @@ -118,7 +278,7 @@ com.google.android.wearable.notificationBridgeMode
       public WearableExtender setDismissalId(String dismissalId)
       public String getDismissalId()
      -    
      +

      To enable a dismissal to be synced, use the setDismissalId() method. For each notification, pass a globally unique ID, as a string, @@ -135,12 +295,12 @@ public String getDismissalId()

       NotificationCompat.WearableExtender wearableExtender =
      -new NotificationCompat.WearableExtender().setDismissalId(“abc123”);
      +new NotificationCompat.WearableExtender().setDismissalId("abc123");
       Notification notification = new NotificationCompat.Builder(context)
       <set other fields>
       .extend(wearableExtender)
       .build();
      -    
      +

      Dismissal IDs work if a watch is paired to an Android phone, but not if a watch is paired to an iPhone. diff --git a/docs/html/wear/preview/features/complications.jd b/docs/html/wear/preview/features/complications.jd index 3334cb79b1430a6a602fe3b9155d5e58c8d117d7..c8661188eb0a13de59320feaf5a5de358ae9e7e9 100644 --- a/docs/html/wear/preview/features/complications.jd +++ b/docs/html/wear/preview/features/complications.jd @@ -12,6 +12,13 @@ page.image=/wear/preview/images/complications-main-image.png Adding Complications to a Watch Face +

    50. + Permissions + for Complication Data +
    51. +
    52. + Default Providers for Watch Faces +
    53. Exposing Data to Complications @@ -27,12 +34,14 @@ page.image=/wear/preview/images/complications-main-image.png API Additions
    +

    See Also

    1. Watch Face sample app with complications
    + @@ -56,9 +65,12 @@ page.image=/wear/preview/images/complications-main-image.png

    - Along with reviewing this page, download the Android Wear 2.0 Preview - Reference (see the Complications API additions) and review the Javadoc for complications. + You can review the Javadoc for complications by downloading + the Android Wear 2.0 Preview + Reference. Also see the API additions for + complications and the + + behavior changes for Wear 2.0.

    @@ -117,8 +129,8 @@ page.image=/wear/preview/images/complications-main-image.png WatchFaceService.Engine class, with a list of watch face complication IDs. A watch face creates these IDs to uniquely identify slots on the watch face where complications can appear, and passes them - to the createProviderChooserIntent method (of the - ProviderChooserIntent class) to allow the user to decide + to the createProviderChooserIntent method + to allow the user to decide which complication should go in which slot.

    @@ -186,6 +198,406 @@ page.image=/wear/preview/images/complications-main-image.png where possible.

    +

    + Permissions for Complication Data +

    + +

    + A watch face must have the following permission + to receive complication data and open the provider chooser: +

    + +
    +com.google.android.wearable.permission.RECEIVE_COMPLICATION_DATA
    +
    + +

    + Opening the provider chooser +

    + +

    + A watch face that was not granted the above permission will be unable to + start the provider chooser. +

    + +

    + To make it easier to request the permission and start the chooser, the + ComplicationHelperActivity class is available in the + wearable support library. This class should be used instead of + ProviderChooserIntent to start the chooser in almost all + cases. +

    + +

    + Requesting the necessary permission +

    + +

    + To use ComplicationHelperActivity, add it to the watch face + in the + manifest file: +

    + +
    +<activity android:name="android.support.wearable.complications.ComplicationHelperActivity"/>
    +
    + +

    + To start the provider chooser, call the + ComplicationHelperActivity.createProviderChooserHelperIntent + method, to obtain an intent. +

    + +

    + The new intent can be used with either startActivity or + startActivityForResult to launch the chooser. +

    + +

    + Here is an example of using the new intent with + startActivityForResult: +

    + +
    +startActivityForResult(
    +  ComplicationHelperActivity.createProviderChooserHelperIntent(
    +     getActivity(),
    +     watchFace,
    +     complicationId,
    +     ComplicationData.TYPE_LARGE_IMAGE),
    +  PROVIDER_CHOOSER_REQUEST_CODE);
    +
    +

    + When the helper activity is started, the helper activity checks if the + permission was granted. If the permission was not granted, the helper + activity makes a runtime permission request. If the permission request is + accepted (or is unneeded), the provider chooser is shown. +

    + +

    + If startActivityForResult was used with the intent, the + result delivered back to the calling Activity will have a result code of + RESULT_OK if a provider was successfully set, or a result + code of RESULT_CANCELLED if no provider was set. +

    + +

    + In the case where a provider was set, + ComplicationProviderInfo for the chosen provider will be + included in the data intent of the result, as an extra with the key + ProviderChooserIntent#EXTRA_PROVIDER_INFO. +

    + +

    + Receiving complication data +

    + +

    + In general, watch faces need the above permission in order to receive + complication data, but there are some exceptions. Specifically, a watch + face can only receive data from a provider if one of the following is + true: +

    + +
      +
    • The provider is a "safe" system provider, +
    • + +
    • The provider and watch face are from the same app, +
    • + +
    • The provider whitelists the watch face as a "safe" watch face, or +
    • + +
    • The watch face has the permission +
    • +
    + +

    + Lack of appropriate permission +

    + +

    + If none of the above is true, then when ComplicationData + normally would be sent by a provider to a watch face, the system instead + sends data of the type TYPE_NO_PERMISSION. This type + includes an icon (an exclamation mark) and short text ("--") to allow it + to be rendered as if it were of the short text type or icon type, for + convenience. +

    + +

    + When a watch face receives data of TYPE_NO_PERMISSION, the + watch face should render this appropriately, so the user can see that + action is needed for the complication to work. If possible, a tap on a + complication in this state should launch a permission request. This can + be done using + ComplicationHelperActivity.createPermissionRequestHelperIntent, + if the helper activity was added to the watch face app. +

    + +

    + If a user accepts the permission request created by the helper activity, + updates are requested for all the active complications on the watch face + automatically, allowing the TYPE_NO_PERMISSION data to be + replaced by real data. +

    + +

    + Safe providers +

    + +

    + Some system providers are considered "safe", because they only supply + information that the watch face already could obtain itself. +

    + +

    + These providers are listed in the new SystemProviders class + in the wearable support library. Whether a system provider is safe is + stated in the Javadoc (in the Android Wear 2.0 Preview Reference). Also + see System providers for a list. +

    + +

    + Provider-specified safe watch faces +

    + +

    + Providers can specify certain watch faces as "safe" to receive their + data. This is intended to be used only when the watch face will attempt + to use the provider as a default (see below), + and the provider trusts the watch face app. +

    + +

    + To declare watch faces as safe, the provider adds metadata with a key of + android.support.wearable.complications.SAFE_WATCH_FACES. The + metadata value should be a comma-separated list (whitespace is ignored). + Entries in the list can be component names (of + WatchFaceServices, given as if + ComponentName.flattenToString() had been called), or they + can be package names (of apps, in which case every watch face within a + specified app is considered safe). +

    + +

    + For example: +

    + +
    +<meta-data
    +       android:name="android.support.wearable.complications.SAFE_WATCH_FACES"
    +        android:value="
    +          com.app.watchface/com.app.watchface.MyWatchFaceService,
    +          com.anotherapp.anotherwatchface/com.something.WatchFaceService,
    +          com.something.text
    +        "/>
    +
    + +

    + Default Providers for Watch Faces +

    + +

    + Watch faces can specify default providers that are used until a user + selects a provider. +

    + +

    + Setting default providers +

    + +

    + Set default providers using the + setDefaultComplicationProvider method in + WatchFaceService.Engine. This method may be called at any + time, but it does nothing if the user already chose a provider for the + given complication. +

    + +

    + Safe providers +

    + +

    + For most providers, the RECEIVE_COMPLICATION_DATA permission + must be granted to a watch face before data can flow to it. However, some + system providers are considered "safe", and do not require the watch face + to have the permission for data to be sent (see Safe Providers and System providers). These providers may be + preferable to use as defaults, as they can supply data immediately. +

    + +

    + Alternatively, if a watch face has a partnership with a certain provider + and wishes to use it as a default, it can request that the provider list + it as a safe watch face (see Provider-specified safe watch + faces). +

    + +

    + System providers +

    + +

    + The system includes providers that can be used as defaults. These are + listed in the SystemProviders class in the wearable support + library. +

    + +

    + The following table has details about providers that are considered safe: +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Method name in the SystemProviders class + + Safety + + Can be the default + + Notes +
    + dateProvider() + + Yes + + Yes + + The standard system date provider. Tapping opens the standard Agenda + app. +
    + currentTimeProvider() + + Yes + + Yes + + The standard system "time and date" provider. No tap action. +
    + batteryProvider() + + Yes + + Yes + + The standard system battery provider. No tap action. +
    + stepCountProvider() + + Yes + + Yes + + Shows a daily total of steps, as reported by + readDailyTotal. +
    + unreadCountProvider() + + Yes + + Yes + + Shows the number of unread notifications in the stream. +
    + worldClockProvider() + + Yes + + Yes + + Will default to London or New York. Can be tapped to change the time + zone. +
    + appsProvider() + + Yes + + Yes + + Will show an "apps" icon at first, which can be tapped to choose an + app. +
    + nextEventProvider() + + No + + Yes (but not a safe provider) + + The standard system "next event" provider. Tapping opens + the standard Agenda app. +

    +
    + +

    Exposing Data to Complications

    @@ -203,6 +615,11 @@ page.image=/wear/preview/images/complications-main-image.png be used to send data back to the system.

    +

    Note: When you provide data as a + complication data provider, the watch face receives the raw values + you send so it can draw them on the watch face. +

    +

    In your app's manifest, declare the service and add an intent filter for the following: @@ -210,7 +627,8 @@ page.image=/wear/preview/images/complications-main-image.png

     android.support.wearable.complications.ACTION_COMPLICATION_UPDATE_REQUEST
    -
    + +

    The service's manifest entry should also include an android:icon attribute. The provided icon should be a @@ -227,6 +645,21 @@ android.support.wearable.complications.ACTION_COMPLICATION_UPDATE_REQUEST API Additions).

    +

    + Additionally, a permission for provider services ensures that only the Android Wear system + can bind to provider services. Only the Android Wear system can have this + permission. +

    + +

    + Provider services should add the following to their service declarations + in the manifest: +

    + +
    +android:permission="com.google.android.wearable.permission.BIND_COMPLICATION_PROVIDER"
    +
    +

    Update period

    @@ -371,6 +804,11 @@ METADATA_KEY_PROVIDER_CONFIG_ACTION

    The following table describes the types and fields of the ComplicationData object. + If a watch face requests a field that is invalid for a complication type, + a default value for the field is returned. + For example, if a watch face tries to access a Long text + field in a SHORT_TEXT type, the default value for the + Long text field is returned.

    @@ -489,56 +927,80 @@ METADATA_KEY_PROVIDER_CONFIG_ACTION

    - In addition, the following two types have no fields. These two types may - be sent for any complication slot and do not need to be included in a - list of supported types: + In addition, the types in the table below are for empty data and + may be sent for any complication slot. These types have no fields + and do not need to be included in a + list of supported types. These types enable watch + faces to differentiate among the following three cases: +

    + +
      +
    • No provider was chosen +
    • + +
    • The user has selected "empty" for a slot +
    • + +
    • A provider has no data to send +
    • +
    + +

    + Providers should not send TYPE_EMPTY in response to + update requests. Providers should send TYPE_NO_DATA instead. +

    + +

    + Details on the complication types for "empty" data are in the + following table:

    - - - - - - + + +
    - Type - - Required fields + Complication type - Optional fields - - Notes + Description
    - NOT_CONFIGURED - - None - - None + TYPE_NOT_CONFIGURED - Sent when a provider has not yet been chosen for a complication. + Sent by the system when a complication is activated but the user has + not selected a provider, and no default was set. +

    + Cannot be sent by providers. +

    - EMPTY + TYPE_EMPTY - None + Sent by the system when a complication is activated and the user has + chosen "empty" instead of a provider, or when the watch face has + chosen no provider, and this type, as the default. +

    + Cannot be sent by providers. +

    - None + TYPE_NO_DATA - Sent by a provider when there is no data to display in a - complication, or sent by the system when nothing should be shown in a - complication. + Sent by the system when a complication (that has a provider) is + activated, to clear the complication before actual data is received + from the provider. +

    + Should be sent by providers if they have no actual data to send. +

    @@ -700,8 +1162,8 @@ METADATA_KEY_PROVIDER_CONFIG_ACTION

    - The Complications API includes new classes in the Wearable Support - Library. For more information, download the Android Wear 2.0 Preview Reference.

    @@ -722,14 +1184,26 @@ METADATA_KEY_PROVIDER_CONFIG_ACTION
  • - ComplicationText + ComplicationHelperActivity
      -
    • Used to supply text-based values in a - ComplicationData object +
    • Used to request the following permission:
      +com.google.android.wearable.permission.RECEIVE_COMPLICATION_DATA
    • -
    • Includes options for time-dependent values, whose text value - depends on the current time +
    • Used instead of ProviderChooserIntent + to start the chooser in almost all cases +
    • +
    +
  • + +
  • + ComplicationManager +
      +
    • A wrapper for the complication manager service, for use by + providers +
    • + +
    • Allows providers to send complication data to the system
  • @@ -747,13 +1221,14 @@ METADATA_KEY_PROVIDER_CONFIG_ACTION
  • - ComplicationManager + ComplicationText
      -
    • A wrapper for the complication manager service, for use by - providers +
    • Used to supply text-based values in a + ComplicationData object
    • -
    • Allows providers to send complication data to the system +
    • Includes options for time-dependent values, whose text value + depends on the current time
  • @@ -761,11 +1236,8 @@ METADATA_KEY_PROVIDER_CONFIG_ACTION
  • ProviderChooserIntent
      -
    • Non-instantiable utility class -
    • - -
    • Includes a method that a watch face can call for starting a - provider chooser (to allow a user to configure complications) +
    • Non-instantiable utility class that is not commonly used; use + ComplicationHelperActivity instead
  • @@ -789,6 +1261,16 @@ METADATA_KEY_PROVIDER_CONFIG_ACTION + +
  • + SystemProviders +
      +
    • Lists system providers that are considered "safe", + because they only supply information that the watch face + already could obtain itself +
    • +
    +
  • diff --git a/docs/html/wear/preview/features/notifications.jd b/docs/html/wear/preview/features/notifications.jd index dcc09709deb3f4b610d5c1cee201a0f48a1c00ea..b546978a8b9cc480e4c86b42d2feb75afc176c52 100644 --- a/docs/html/wear/preview/features/notifications.jd +++ b/docs/html/wear/preview/features/notifications.jd @@ -1,6 +1,5 @@ page.title=Notification Changes in Android Wear 2.0 -meta.tags="wear", "wear-preview", "notifications" -page.tags="wear" +meta.tags="wear", "wear-preview", "notifications" page.tags="wear" page.image=/wear/preview/images/expanded_diagram.png @@ -12,6 +11,7 @@ page.image=/wear/preview/images/expanded_diagram.png

    This document includes

    1. Visual Updates
    2. +
    3. Inline Action
    4. Expanded Notifications
    5. MessagingStyle
    @@ -67,7 +67,8 @@ material design visual changes. We recommended that you don't set color for bridged notifications. When Wear apps post local notifications, you can work around this by checking - the API level of the device they're running on and using an appropriate color + the API level of the device + they're running on and using an appropriate color for Wear 1.x and a different color for Wear 2.0. @@ -77,6 +78,85 @@ material design visual changes. you must update the text of your notification. + +

    Inline Action

    + + +

    + Wear 2.0 now supports inline action, which allows users to take actions on a + notification from within the notification stream card. On Wear, the inline + action appears as an additional button displayed at the bottom of the notification. +

    +

    + Inline actions are optional but recommended for cases in which users are likely + to take an action on a notification after viewing the contents in the + notification stream card (without going to the + expanded notification). + Examples of good use cases for inline action on a notification include: replying to a + text message, stopping a fitness activity, and archiving an email message. +

    + +

    + A notification can provide only one inline action. + To display the inline action as an additional button in the notification, set + the {@code setHintDisplayActionInline()} + method to true. When a user taps the inline action, the system invokes + the intent that you specified in the notification action. +

    + +

    Adding an inline action

    +

    + The following code example shows how to create a notification with an inline + reply action: +

    + +
      +
    1. Create an instance of + {@code RemoteInput.Builder} + that you can add to your notification action. This class's constructor accepts a + string that the system uses as the key for the text input. Later, your app + uses that key to retrieve the text of the input. + +
      +String[] choices = context.getResources().getStringArray(R.array.notification_reply_choices);
      +    choices = WearUtil.addEmojisToCannedResponse(choices);
      +  RemoteInput remoteInput = new RemoteInput.Builder(Intent.EXTRA_TEXT)
      +        .setLabel(context.getString(R.string.notification_prompt_reply))
      +        .setChoices(choices)
      +        .build();
      +
      + +
    2. + +
    3. + Use the {@code addRemoteInput()} + method to attach the {@code RemoteInput} + object to an action. + +
      +NotificationCompat.Action.Builder actionBuilder = new NotificationCompat.Action.Builder(
      +        R.drawable.ic_full_reply, R.string.notification_reply, replyPendingIntent);
      +    actionBuilder.addRemoteInput(remoteInput);
      +    actionBuilder.setAllowGeneratedReplies(true);
      +
      +
    4. + +
    5. + Add a hint to display the reply action inline, and use the + {@code addAction} + method to add this action to the notification. + +
      +// Android Wear 2.0 requires a hint to display the reply action inline.
      +    Action.WearableExtender actionExtender =
      +        new Action.WearableExtender()
      +            .setHintLaunchesActivity(true)
      +            .setHintDisplayActionInline(true);
      +    wearableExtender.addAction(actionBuilder.extend(actionExtender).build());
      +
      +
    6. +
    +

    Expanded Notifications

    Android Wear 2.0 introduces expanded notifications, which provide substantial additional content and actions for each notification. @@ -152,51 +232,52 @@ action in the notification unless a different action is specified using

    MessagingStyle

    -

    If you have a chat messaging app, your notifications should use -{@code Notification.MessagingStyle}, - which is new in Android N. Wear 2.0 uses the chat messages included - in a {@code MessagingStyle} notification - - (see {@code addMessage()}) to provide - a rich chat app-like experience in the expanded notification. +

    + If you have a chat messaging app, your notifications should use + {@code NotificationCompat.MessagingStyle}, + which is new in Android 7.0. Wear 2.0 uses the chat messages included in a + {@code MessagingStyle} notification + (see {@code addMessage()}) + to provide a rich chat app-like experience in the expanded notification.

    -

    Note: {@code MessagingStyle} +

    Note: {@code MessagingStyle} expanded notifications require that you have at least version 1.5.0.2861804 of the Android Wear app - on your paired Android phone. That version will be available within the next - few weeks in the Play Store. + on your paired Android phone.

    Smart Reply

    -

    Wear 2.0 also introduces Smart Reply -for {@code MessagingStyle} notifications. +

    Wear 2.0 also introduces Smart Reply for + {@code MessagingStyle} notifications. Smart Reply provides the user with contextually relevant, touchable choices in the expanded notification and in {@code RemoteInput}. These augment the fixed list of choices that the developer provides in - {@code RemoteInput} - using the - {@code setChoices()} method. + {@code RemoteInput} + using the + {@code setChoices()} method.

    -

    By enabling Smart Reply for your MessagingStyle notifications, - you provide users with a fast (single tap), discreet (no speaking aloud), and - reliable way to respond to chat messages. +

    Smart Reply provides users with a fast (single tap), discreet (no speaking aloud), + private (messages received by a user never leave the watch), and reliable (no + internet connection needed) way to respond to chat messages.

    -

    Responses generated by Smart Reply are shown in addition to those set using the - {@code setChoices()} method. +

    + Smart Reply responses are generated by an entirely on-watch machine learning + model using the context provided by the MessagingStyle notification. No user + notification data is sent to Google servers to generate Smart Reply responses.

    +

    To enable Smart Reply for your notification action, you need to do the following:

      -
    1. Use {@code Notification.MessagingStyle}. +
    2. Use {@code NotificationCompat.MessagingStyle}.
    3. -
    4. Call the method {@code setAllowGeneratedReplies()} for the notification action. - For more information, see the downloadable - API reference. +
    5. Call the method {@code setAllowGeneratedReplies(true)} + for the notification action.
    6. Ensure that the notification action has a {@code RemoteInput} @@ -236,3 +317,29 @@ Notification noti = new NotificationCompat.Builder() // 3) add an action with RemoteInput .extend(new WearableExtender().addAction(action)).build(); + +

      Adding images to a MessagingStyle notification

      +

      + You can add images to a notification message by setting the appropriate MIME + type and placing the URI to the image in {@code NotificationCompat.MessagingStyle.Message.} + {@code setData()} method. +

      +

      + Here is the code snippet to set data of type image in a notification: +

      +
      +NotificationCompat.MessagingStyle.Message message = new Message("sticker", 1, "Jeff")
      +                      .setData("image/png", stickerUri);
      +
      +  NotificationCompat notification = new NotificationCompat.Builder()
      +             .setStyle(new NotificationComapt.MessagingStyle("Me")
      +             .addMessage(message)
      +             .build());
      +
      +
      +

      + In the above code snippet the variable stickerUri is a Uri that + points to a publicly-accessible location, as described here + . +

      \ No newline at end of file diff --git a/docs/html/wear/preview/features/standalone-apps.jd b/docs/html/wear/preview/features/standalone-apps.jd new file mode 100644 index 0000000000000000000000000000000000000000..5c1930dedf86685b6da5c376aa0b7dd8fdac92b1 --- /dev/null +++ b/docs/html/wear/preview/features/standalone-apps.jd @@ -0,0 +1,499 @@ +page.title=Standalone Apps +meta.keywords="wear-preview" +page.tags="wear-preview" +page.image=images/cards/card-n-sdk_2x.png + +@jd:body + + + +

      + In Android Wear 2.0, apps can work independently of a phone. Users can + complete more tasks on a watch, without access to an Android or iOS + phone. +

      + +

      + Planning Your Phone and Watch Apps +

      + +

      + A watch APK targeting Wear 2.0 should not be embedded in a phone APK. + For more information, see + + App Distribution. +

      + +

      + Generally, the minimum and target API level for a standalone app, and + for Wear 2.0, is level 24. The minimum SDK level can be 23 + only if you are using the same APK + for Wear 1.0 and 2.0 (and thus have an embedded Wear 1.0 APK). +

      + +

      + If you build a standalone Wear 2.0 APK and will continue to have a + Wear 1.0 APK, please do both of the following: +

      + +
        +
      • Provide a standalone version of the Wear APK, and +
      • + +
      • Continue embedding a version of the Wear APK in your phone APK +
      • +
      + +

      + Caution: For the Wear 2.0 Developer Preview, if you + publish an update to your production phone APK that has removed an embedded + Wear APK, production users who update the phone APK before installing + your standalone Wear APK will lose their existing Wear app and its data. + Therefore, it's important that you continue to embed + your watch APK into your phone APK. +

      + +

      + + Run-time permissions are required for standalone apps. +

      + +

      + Shared code and data storage +

      + +

      + Code can be shared between a Wear app and a phone app. Optionally, code + that is specific to a form factor can be in a separate module. +

      + +

      + For example, common code for networking can be in a shared library. +

      + +

      + You can use standard Android storage APIs to store data locally. + For example, you can use + the + SharedPreferences APIs, SQLite, or internal storage (as you would in + the case of a phone). +

      + +

      + Detecting your phone app or watch app +

      + +

      + If a user of your watch app needs your phone app, your watch app can + detect if the phone app is available. Using the + CapabilityApi, your phone app or watch app can advertise its presence + to a paired device. It can do so statically and dynamically. When an app + is on a node in a user's Wear network (i.e., on a phone, paired watch, or + in the cloud), the CapabilityApi enables another + app to detect if it is installed. For more information, see + Advertise capabilities. +

      + +

      + If your phone app is unavailable, your can check if the Play Store is + available on the phone, as described below, before directing the user to + go to the Play Store (to install your phone app). +

      + +

      + Checking for Play Store availability on a phone +

      + +

      + iPhones and some Android phones lack the Play Store. A standalone Wear + app can check if the paired phone has the Play Store, before directing a + user to go there to install your phone app. The + PlayStoreAvailability class contains a + getPlayStoreAvailabilityOnPhone() method that enables your + Wear app to check if a companion phone has the Play Store. +

      + +

      + More information about the PlayStoreAvailability class is + available when you + download the Android Wear 2.0 Preview Reference. Here is a snippet + that uses the getPlayStoreAvailabilityOnPhone() method to + determine if the paired phone has the Play Store: +

      + +
      +int playStoreAvailabilityOnPhone =
      +PlayStoreAvailability.getPlayStoreAvailabilityOnPhone(context);
      +
      + +

      + The value returned by the getPlayStoreAvailabilityOnPhone() + method is one of the following: +

      + + + + + + + + + + + + + + + + + + + + + +
      + Return value + + Description +
      + PLAY_STORE_ON_PHONE_AVAILABLE + + The Play Store is available on the companion phone. +
      + PLAY_STORE_ON_PHONE_UNAVAILABLE + + The Play Store is not available on the companion phone. +
      + PLAY_STORE_ON_PHONE_ERROR_UNKNOWN + + An error occurred in the check for the Play Store; another check + should be made later. +
      + +

      + Network Access and Cloud Messaging +

      + +

      + Android Wear apps can make their own network requests. When a watch has a + Bluetooth connection to a phone, the watch's network traffic is proxied + through the phone. When a phone is unavailable, Wi-Fi and cellular + networks are used, depending on the hardware. The Wear platform handles + transitions between networks. A watch's network access thus does not + require the + Wearable Data Layer API. +

      + +

      + For sending notifications, apps can directly use Firebase Cloud Messaging + (FCM), which replaces Google Cloud Messaging, or continue to use GCM. +

      + +

      + No APIs for network access or FCM are specific to Android Wear. + Refer to the existing documentation about + connecting to a network and cloud messaging. +

      + +

      + You can use protocols such as HTTP, TCP, and UDP. However, + the + android.webkit APIs are not available. Therefore, + use of cookies is available by reading and writing headers on + requests and responses, but the + CookieManager class is not available. +

      + +

      + FCM works well with + + Doze. +

      + +

      + Additionally, we recommend using the following: +

      + + + +

      + For foreground use cases, we currently recommend that you make a + request for an unmetered network. Here is an example of using + the multi-networking APIs to request an unmetered network: +

      + +
      +ConnectivityManager.NetworkCallback networkCallback =
      +  new ConnectivityManager.NetworkCallback() {
      +    @Override
      +    public void onAvailable(Network network) {
      +      // access network
      +      }
      +    };
      +ConnectivityManager connectivityManager =
      +  (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
      +
      +connectivityManager.requestNetwork(new NetworkRequest.Builder()
      +  .addCapability(NET_CAPABILITY_NOT_METERED)
      +  .build(), networkCallback);
      +
      + +

      + We also recommend setting a timer for frontend scenarios + to prevent a user from potentially waiting for a long time. + When the network is no longer needed, or if the timer fires, + the network callback needs to be unregistered: +

      + +
      +connectivityManager.unregisterNetworkCallback(networkCallback):
      +
      + +

      + A Wear app can communicate with a phone app using the Wearable + Data Layer API, but connecting to a network using that API is + discouraged. +

      + +

      + Obtaining only the necessary data +

      + +

      + When obtaining data from the cloud, get only the necessary data. + Otherwise, you may introduce unnecessary latency, memory use, and battery + use. +

      + +

      + When a watch is connected over a Bluetooth LE connection, your app may + have access to a bandwidth of only 10 kilobytes per second. Therefore, + the following steps are recommended: +

      + +
        +
      • Audit your network requests and responses for extra data that only is + for a phone app +
      • + +
      • Shrink large images before sending them over a network to a watch +
      • +
      + +

      + Using Background Services +

      + +

      + To ensure that background tasks are correctly executed, they must account + for + Doze. In Android 6.0, Doze and App Standby resulted in significant + improvements to battery life by allowing devices to enter deep sleep when + idle and stationary. +

      + +

      + Doze is enhanced + in Android Nougat and Android Wear 2.0. When a screen turns off or enters + ambient mode for a long enough time, a subset of Doze can occur and + background tasks may be deferred for certain periods. Later, when a + device is stationary for an extended time, regular Doze occurs. +

      + +

      + You should schedule jobs with the + JobScheduler API, which enables your app to register for Doze-safe + code execution. When scheduling jobs, you can select constraints such as + periodic execution and the need for connectivity or device charging. + It is important to configure jobs in a way that does not adversely + impact battery life. Jobs should use a + + JobInfo.Builder object to provide constraints and metadata, e.g. with + one or more of the following methods for a task: +

      + +
        +
      • To schedule a task that requires networking, use + setRequiredNetworkType(int networkType), specifying + NETWORK_TYPE_ANY or NETWORK_TYPE_UNMETERED; + note that NETWORK_TYPE_UNMETERED is for large data transfers + while NETWORK_TYPE_ANY is for small transfers +
      • + +
      • To schedule a task while charging, use + setRequiresCharging(boolean requiresCharging) +
      • + +
      • For specifying that a device is idle for a task, use + setRequiresDeviceIdle(boolean requiresDeviceIdle); this + method can be useful for lower-priority background work or + synchronization, especially when used with + setRequiresCharging +
      • +
      + +

      + Note that some low-bandwidth networks, such as Bluetooth LE, are + considered metered. +

      + +

      + Scheduling with constraints +

      + +

      + You can schedule a task that requires constraints. In the example below, + a JobScheduler object activates MyJobService + when the following constraints are met: +

      + +
        +
      • Unmetered networking +
      • + +
      • Device charging +
      • +
      + +

      + You can use the builder method setExtras to attach a bundle + of app-specific metadata to the job request. When your job executes, this + bundle is provided to your job service. Note the MY_JOB_ID + value passed to the JobInfo.Builder constructor. This + MY_JOB_ID value is an app-provided identifier. Subsequent + calls to cancel, and subsequent jobs created with that same value, will + update the existing job: +

      + +
      +JobInfo jobInfo = new JobInfo.Builder(MY_JOB_ID,
      +        new ComponentName(this, MyJobService.class))
      +        .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
      +        .setRequiresCharging(true)
      +        .setExtras(extras)
      +        .build();
      +((JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE))
      +        .schedule(jobInfo);
      +
      + +

      + Below is an implementation of + JobService to handle the job above. When the job executes, a + JobParameters object is passed into the + onStartJob method. The JobParameters object + enables you to get the job ID value along with any extras bundle provided + when scheduling the job. The onStartJob method is called on + the main application thread, and therefore any expensive logic should be + run from a separate thread. In the example, an AsyncTask is + used to run code in the background. When work is complete, you would call + the jobFinished method to notify JobScheduler + that the task is done: +

      + +
      +public class MyJobService extends JobService {
      +    @Override public boolean onStartJob(JobParameters params) {
      +        new JobAsyncTask().execute(params);
      +        return true;
      +    }
      +
      +    private class JobAsyncTask extends AsyncTask
      +
      + +

      + Cloud Notifications Using FCM +

      + +

      + FCM is the recommended way to send notifications to a watch. +

      + +

      + Provide for messages from FCM by collecting a registration token for a + device when your Wear app runs. Then include the token as part of the + destination when your server sends messages to the FCM REST endpoint. FCM + sends messages to the device identified by the token. +

      + +

      + An FCM message is in JSON format and can include one or both of the + following payloads: +

      + +
        +
      • + Notification payload. When a notification payload is + received by a watch, the data is displayed to a user directly in the + notification stream. When the user taps the notification, your app is + launched. +
      • + +
      • + Data payload. The payload has a set of custom + key/value pairs. The payload and is delivered as data to your Wear app. +
      • +
      + +

      + For more information and examples of payloads, see About + FCM Messages. +

      + +

      + Notifications from a Companion Phone +

      + +

      + By default, notifications are bridged (shared) from a phone app to a + watch. If you have a standalone Wear app and a corresponding phone app, + duplicate notifications can occur. For example, the same notification + from FCM, received by both a phone and a watch, could be + displayed by both devices independently. +

      + +

      + For information about preventing duplicate notifications, see Bridging + Mode for Notifications. +

      diff --git a/docs/html/wear/preview/features/wearable-recycler-view.jd b/docs/html/wear/preview/features/wearable-recycler-view.jd new file mode 100644 index 0000000000000000000000000000000000000000..f28a4722377e7bab3b9612bafd9d9975557635f2 --- /dev/null +++ b/docs/html/wear/preview/features/wearable-recycler-view.jd @@ -0,0 +1,223 @@ + +page.title=Curved Layout +meta.tags="wear", "wear-preview", "RecyclerView" +page.tags="wear" + +@jd:body + + + + + +

      + Wear 2.0 introduces the {@code WearableRecyclerView} class for displaying + and manipulating a vertical list of items optimized for round displays. + {@code WearableRecyclerView} extends the existing + {@code RecyclerView} + class to provide a curved layout and a circular scrolling gesture in wearable apps. +

      + + +

      + You can adapt to this interface in your wearable app by creating a new + {@code WearableRecyclerView} container. +

      + +

      + You should decide whether to use a {@code WearableRecyclerView}, based on + the kind of user experience you want to provide. We recommend using the + {@code WearableRecyclerView} for a simple, long list of items, such as an + application launcher, or a list contacts. Each item might have a short string + and an associated icon. Alternatively, each item might have only a string or + an icon. We do not recommend using a {@code WearableRecyclerView} for short + or complex lists. +

      + +

      + This document describes how to create a curved layout for your scrollable items + and properly align them along the curve. +

      + + +

      Creating a Curved Layout

      +

      To create a curved layout for scrollable items in your wearable app: +

      +
        +
      • Use {@code WearableRecyclerView} as your main container in the relevant + xml layout. +
      • + +
      • By default, {@code WearableRecyclerView} uses the {@code + DefaultOffsettingHelper} class to offset items in a curved layout on round + devices. If you wish to implement your own offsetting logic, you can extend the + abstract {@code WearableRecyclerView.OffsettingHelper} class and attach it to + the {@code WearableRecyclerView} using {@code + WearableRecyclerView.setOffsettingHelper} method. + +
        +      CircularOffsettingHelper circularHelper = new CircularOffsettingHelper();
        +      mRecyclerView.setOffsettingHelper(circularHelper);
        +    
        + +
        +      public class CircularOffsettingHelper extends OffsettingHelper {
        +
        +        @Override
        +        public void updateChild(View child, WearableRecyclerView parent) {
        +          int progress = child.getTop() / parent.getHeight();
        +          child.setTranslationX(-child.getHeight() * progress);
        +         }
        +      }
        +    
        + +
      • + +
      + +

      + Note: {@code DefaultOffsettingHelper} class + offsets the child items + along a predefined UX curve, but the operation can cut off part of the child + view if it is not scaled down accordingly. This is because the default curve + attempts to fit 5 items on the screen, regardless of their size. + If you do not wish to scale your items, you should consider additional padding. +

      + +

      Examples

      +

      + The following code example demonstrates how to add {@code WearableRecyclerView} + to a layout: +

      +
      +<android.support.wearable.view.WearableRecyclerView
      +   xmlns:android="http://schemas.android.com/apk/res/android"
      +   xmlns:tools="http://schemas.android.com/tools"
      +   android:id="@+id/recycler_launcher_view"
      +   android:layout_width="match_parent"
      +   android:layout_height="match_parent"
      +   android:scrollbars="vertical" />
      + 
      + + +

      + To customize the appearance of the children while scrolling (for example, + scale the icons and text while the items scroll away from the center), extend + the {@code DefaultOffsettingHelper} and override the {@code updateChild } + method. It is important to call the {@code super.updateChild(child, parent)} to + offset the children along the curve. However, if for any particular child you do + not wish them to follow a curve, you can chose not to call the super method for + that particular child. +

      + +
      +
      +public class MyOffsettingHelper extends DefaultOffsettingHelper {
      +
      +   /** How much should we scale the icon at most. */
      +   private static final float MAX_ICON_PROGRESS = 0.65f;
      +
      +   private float mProgressToCenter;
      +
      +   public OffsettingHelper() {}
      +
      +   @Override
      +
      +   public void updateChild(View child,  WearableRecyclerView parent) {
      +       super.updateChild(child, parent);
      +
      +
      +       // Figure out % progress from top to bottom
      +       float centerOffset = ((float) child.getHeight() / 2.0f) /  (float) mParentView.getHeight();
      +       float yRelativeToCenterOffset = (child.getY() / mParentView.getHeight()) + centerOffset;
      +
      +       // Normalize for center
      +       mProgressToCenter = Math.abs(0.5f - yRelativeToCenterOffset);
      +       // Adjust to the maximum scale
      +       mProgressToCenter = Math.min(mProgressToCenter, MAX_ICON_PROGRESS);
      +
      +       child.setScaleX(1 - mProgressToCenter);
      +       child.setScaleY(1 - mProgressToCenter);
      +   }
      +}
      +
      +
      +
      + + +

      Adding a Circular Scrolling Gesture

      + +

      + By default, circular scrolling is disabled in the {@code + WearableRecyclerView}. If you want to enable circular scrolling gesture + in your child view, use the {@code WearavleRecyclerView}’s {@code + setCircularScrollingGestureEnabled()} method. You can also customize the + circular scrolling gesture by defining one or both of the following: +

      + +
        +
      • How many degrees the user has to rotate by to scroll through one screen height. + This effectively influences the speed of the scolling - + {@code setScrollDegreesPerScreen} - the default value is set at 180 degrees. +
      • + +
      • + The width of a virtual ‘bezel’ near the the edge of the screen in which the + gesture will be recognized - {@code setBezelWidth} - the default value is set + at 1. This is expressed as a fraction of the radius of the view. +
      + + +

      The following code snippet shows how to set these methods:

      + +
      +  setCircularScrollingGestureEnabled(true);
      +  setBezelWidth(0.5f);
      +  setScrollDegreesPerScreen(90);
      +
      + +

      Anchoring Children to the Curve

      + +

      + To ensure that the layout for WearableRecyclerView is adaptable to different + types of child views, the WearableRecyclerView class, by default, chooses the + middle left edge (X=0, Y=Half the child height) as the anchor coordinates for + the child item. Using the default anchor coordinates can result in offsetting + the child items from the left edge of the watch face. To customize the anchor + coordinates of your child view along the curve, you can overwrite the + {@code adjustAnchorOffsetXY()} method. You can calculate the X (horizontal) + and Y (vertical) offset of the child item, and set it using the + {@code adjustAnchorOffsetXY()} method to properly align items + along the curve. The coordinates should be with relation to the child view. +

      + +

      +

      Figure 1. Imaginary UX curve and anchor points on the curve.

      + +

      + The code snippet below, calculates the X offset for a child item in which the + width of the icon is same as the height of the child item. In this case, the + anchor coordinates for the child item are at the center of the icon. + +

      + + +
      + @Override
      +  protected void adjustAnchorOffsetXY(View child, float[] anchorOffsetXY) {
      +    anchorOffsetXY[0] = child.getHeight() / 2.0f;
      +  }
      +
      + + diff --git a/docs/html/wear/preview/images/alignment.png b/docs/html/wear/preview/images/alignment.png new file mode 100644 index 0000000000000000000000000000000000000000..525b3341789a86aaf9d2e6380efcb72739c2e838 Binary files /dev/null and b/docs/html/wear/preview/images/alignment.png differ diff --git a/docs/html/wear/preview/images/apk-details.png b/docs/html/wear/preview/images/apk-details.png new file mode 100644 index 0000000000000000000000000000000000000000..eb3b8591f53fa919c95fa3acdac602b45587ac15 Binary files /dev/null and b/docs/html/wear/preview/images/apk-details.png differ diff --git a/docs/html/wear/preview/images/apk-tabs.png b/docs/html/wear/preview/images/apk-tabs.png new file mode 100644 index 0000000000000000000000000000000000000000..949b98f75b7d35ad78a87b51da9046073625e580 Binary files /dev/null and b/docs/html/wear/preview/images/apk-tabs.png differ diff --git a/docs/html/wear/preview/images/center_align.png b/docs/html/wear/preview/images/center_align.png new file mode 100644 index 0000000000000000000000000000000000000000..ca88ad77bac4c6fc9c98214c2823c3c77a90e5d5 Binary files /dev/null and b/docs/html/wear/preview/images/center_align.png differ diff --git a/docs/html/wear/preview/images/current-apk.png b/docs/html/wear/preview/images/current-apk.png new file mode 100644 index 0000000000000000000000000000000000000000..2545f925f60812cdb52b87a303fd73af94f68655 Binary files /dev/null and b/docs/html/wear/preview/images/current-apk.png differ diff --git a/docs/html/wear/preview/images/inline_action.png b/docs/html/wear/preview/images/inline_action.png new file mode 100644 index 0000000000000000000000000000000000000000..7ecaafeb25441ff8fd4c3b2b26725901774d444c Binary files /dev/null and b/docs/html/wear/preview/images/inline_action.png differ diff --git a/docs/html/wear/preview/images/wrv_new.png b/docs/html/wear/preview/images/wrv_new.png new file mode 100644 index 0000000000000000000000000000000000000000..c413c59a77c35d2cc6d0ed9ffd14b9a4d7be2a73 Binary files /dev/null and b/docs/html/wear/preview/images/wrv_new.png differ diff --git a/docs/html/wear/preview/index.jd b/docs/html/wear/preview/index.jd index 4b3c1f2ed86a2b759334d4633f8d435704e1e328..629257736e148e5d41779a7825ecc21c77b39346 100644 --- a/docs/html/wear/preview/index.jd +++ b/docs/html/wear/preview/index.jd @@ -7,16 +7,6 @@ header.hide=1 footer.hide=1 @jd:body - -
      @@ -55,7 +45,7 @@ footer.hide=1
      -
    7. @@ -190,12 +188,12 @@ page.image=images/cards/card-n-sdk_2x.png
    8. Optionally, select the Phone and Tablet option. If - you plan to use N Preview APIs in a phone app, then the Minimum SDK - option list, select API N: Android 6.x (N Preview). + you plan to use Android 7.0 APIs in a phone app, then the Minimum SDK + option list, select API 24: Android 7.0 (Nougat).
    9. Select the Wear option, and in the Minimum SDK - option list, select the latest available (N Preview) + option list, select the latest available (API Nougat) option. Click Next until you exit the Create New Project wizard.
    10. @@ -215,7 +213,7 @@ page.image=images/cards/card-n-sdk_2x.png following, which requires that your the Google Repository is the latest version: - compile 'com.google.android.support:wearable:2.0.0-alpha2' + compile 'com.google.android.support:wearable:2.0.0-alpha3' diff --git a/docs/html/wear/preview/support.jd b/docs/html/wear/preview/support.jd index 78b4e4b854ac9fd09b8777e5a3c05748c1da4bc4..6006627a4e1615a323a77839917b06f70ceb2367 100644 --- a/docs/html/wear/preview/support.jd +++ b/docs/html/wear/preview/support.jd @@ -23,7 +23,9 @@ page.tags="preview", "developer preview" @@ -46,10 +48,25 @@ page.tags="preview", "developer preview" panics and crashes.
    11. Some apps may not function as expected on the new - platform version. This includes Google’s apps and other apps. + platform version. This includes Google's apps and other apps.
    12. +

      + Platform API Version +

      + +

      + The Android Platform API version is incremented to 24 to match Android 7.0. + You can update the following in your Android Wear 2.0 Preview project + to 24: +

      + +
        +
      • compileSdkVersion
      • +
      • targetSdkVersion
      • +
      +

      Deprecations

      The following fields are deprecated in the preview:

      @@ -64,6 +81,291 @@ page.tags="preview", "developer preview" +

      Developer Preview 3

      + +
      +
      +
      +

      Date: September 2016
      + Builds: Wearable Support 2.0.0-alpha3, NVE68J
      + Emulator support: x86 & ARM (32-bit)
      +

      +
      +
      +
      + +

      + New in Preview 3 +

      + +

      + For access to system images and the companion app for Preview 3, see + + Download and Test with a Device. +

      + +

      + Additions for standalone apps and the Play Store on Wear +

      + +

      + For information about planning your Wear 2.0 app, see + Standalone Apps. +

      + +

      + Generally, the minimum and target SDK level for Wear 2.0, and for a + standalone APK, is level 24. The minimum SDK level can be 23 + only if you are using the same APK + for Wear 1.0 and 2.0 (and thus have an embedded Wear 1.0 APK). +

      + +

      + Run-time permissions are required. +

      + +

      + For information about distributing your Wear 2.0 app, see + App Distribution. +

      + +

      + Complications API additions +

      + +

      + For Preview 3, additions and changes have been made to the Complications + API. The documentation + includes information about the following additions and changes: +

      + +
        +
      • To receive complication data and open the provider chooser, a watch + face must have the RECEIVE_COMPLICATION_DATA permission. +
      • + +
      • To ease a request for the new permission and the starting of the + chooser, the ComplicationHelperActivity class is available + in the wearable support library. This class should be used instead of + ProviderChooserIntent to start the chooser in almost all + cases. +
      • + +
      • Watch faces can specify default providers that are used until a user + selects a provider. +
      • + +
      • The complication types used for "empty" data are changed. +
      • + +
      • A new permission was added to ensure that only the Android Wear + system can bind to provider services. +
      • +
      + +

      + For changes related to the ComplicationData object, see + Behavior + Changes. +

      + +

      + Curved Layout +

      + +

      + For information about creating a curved layout using + the WearableRecyclerView API in your Wear 2.0 app, see + + Curved Layout. +

      + +

      + Notifications features +

      + +

      + To learn about adding an inline action to a notification, + see Inline + Action. +

      + +

      + To learn about adding images to a notification, see + Adding + images to a notification. +

      + +

      + For additions related to the bridging of notifications from a companion + app to a watch, see Bridging + Mode for Notifications. +

      + +

      + Smart Reply additions +

      + +

      + Smart Reply responses are generated by an entirely on-watch, + machine-learning model using the context provided by + MessagingStyle notifications. Use the + setAllowGeneratedReplies(boolean) method to enable Smart Reply for + your MessagingStyle notification. +

      + +

      + Known Issues +

      + +

      + Notifications +

      + +
        +
      • The MessagingStyle + notifications with images posted by standalone apps don't show + images in the notification (i.e., bridged notifications show images, + but standalone notifications don't). +
      • + +
      • This preview release does not include support for notification + groups. +
      • + +
      • With Wear 2.0, a watch can receive notifications directly from + Firebase Cloud Messaging (FCM), which replaces Google Cloud Messaging + (GCM). However, in Preview 3 of Wear 2.0, FCM does not function with + iOS-paired watches. +
      • + +
      • Smart Reply responses are only shown in RemoteInput when + RemoteInput is called from a MessagingStyle + expanded notification. Smart Reply responses are not shown in + RemoteInput when RemoteInput is called from an + + inline action within the stream—an action set with the + setHintDisplayActionInline(true) method. +
      • +
      + +

      + Companion app +

      + +
        +
      • The preview companion app is not compatible with Android 4.3 + (Jelly Bean MR2), which has an SDK build version code of: + JELLY_BEAN_MR2
      • +
      + +
        +
      • In permission screens in the preview companion app: + If you deny a permission, you cannot + proceed. Instead of denying a permission, tap Skip. +
      • +
      + + +

      + Developer Console +

      + +
        +
      • If you set a minimum SDK version of 24, the Play Developer Console + states that there are few supported devices. +
      • +
      + +

      + System user interface and apps +

      + +
        +
      • Dismissing multiple notifications can cause an app to forcibly close. +
      • + +
      • The "Ok Google" detection and voice transcription may not work + reliably. +
      • + +
      • Google Fit is not available with Preview 3. +
      • + +
      • Syncing for embedded apps is not enabled for the preview. Therefore, + to test an app on a device, add it to the Play Store or side-load it + onto a watch. Some existing Wear apps, e.g. Google Maps, are only + using the embedded apps mechanism currently, and are therefore not + installable on the preview (and therefore do not appear on the watch). +
      • + +
      • In Play Store search results on the watch, + results other than apps sometimes appear. +
      • + +
      • Media controls/notifications are not bridged + to the watch from an Android KitKat phone. +
      • +
      + +

      + Account sync +

      + +
        +
      • Account sync initiated from watch settings may not work reliably. + Instead, add accounts from the setup flow of the Android Wear app, or using + the Accounts settings for a device from the Android Wear app. +
      • + +
      • The list of accounts that can be synced is the same as the list of accounts + on the phone. So to add a new account, use the Android settings on the phone, + and then proceed to Android Wear app to sync that account. +
      • +
      + +

      + Devices +

      + +
        +
      • In Android Wear emulators, the Play Store app requires that an + account is synced to the device before the app can be opened. +
      • + +
      • On the Huawei Watch, selecting the language, followed by multiple + acknowledgement dialogues, results in a black screen. +
      • + +
      • On the LG Watch Urbane 2nd Edition, when answering a call from the + watch, the watch does not provide audio from the caller. +
      • +
      + +

      + Smart Reply +

      + +
        +
      • Smart Reply is only available if your watch's system language is + English. +
      • + +
      • Smart Reply responses are not generated for all messages. +
      • +
      +

      Developer Preview 2

      @@ -78,24 +380,9 @@ page.tags="preview", "developer preview"

      - New in Preview 2 + New in Preview 2

      -

      - Platform API Version -

      - -

      - The Android Platform API version is incremented to 24 to match Android Nougat. - You can update the following in your Android Wear 2.0 Preview project - to 24: -

      - -
        -
      • compileSdkVersion
      • -
      • targetSdkVersion
      • -
      -

      Wearable drawers

      @@ -174,7 +461,7 @@ page.tags="preview", "developer preview"

      - Known Issues + Known Issues

      @@ -239,6 +526,10 @@ page.tags="preview", "developer preview"
    13. Unable to turn off the Wi-Fi on a wearable.
    14. + +
    15. After music is played on a companion phone, + music card notifications are not mirrored to the watch. +
    16. diff --git a/docs/html/work/managed-configurations.jd b/docs/html/work/managed-configurations.jd index 76ca82fca4ffa44663e4233befd9cc522ddb2d70..6de4d8ba758941ff0231ba46bf14c51a7eec630a 100644 --- a/docs/html/work/managed-configurations.jd +++ b/docs/html/work/managed-configurations.jd @@ -349,7 +349,7 @@ enterprise administrator to:

      To get a {@link android.content.RestrictionsManager} object, get the current activity with {@link android.app.Fragment#getActivity getActivity()}, then - call that activity's {@link android.app.Activity#getSystemService(java.lang.String) + call that activity's {@link android.app.Activity#getSystemService Activity.getSystemService()} method:

      @@ -399,9 +399,9 @@ enterprise administrator to:

      String, and String[]. Once you have the managed configurations {@link android.os.Bundle}, you can check the current configuration settings with the standard {@link android.os.Bundle} methods for - those data types, such as {@link android.os.BaseBundle#getBoolean getBoolean()} + those data types, such as {@link android.os.Bundle#getBoolean getBoolean()} or - {@link android.os.BaseBundle#getString getString()}. + {@link android.os.Bundle#getString getString()}.

      diff --git a/docs/image_sources/brand/android_logo_no.graffle/data.plist b/docs/image_sources/brand/android_logo_no.graffle/data.plist new file mode 100644 index 0000000000000000000000000000000000000000..1132a59772410f7c08ba798190982c6812fd2eef Binary files /dev/null and b/docs/image_sources/brand/android_logo_no.graffle/data.plist differ diff --git a/docs/image_sources/brand/android_logo_no.graffle/image1.jpg b/docs/image_sources/brand/android_logo_no.graffle/image1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ff2959958de4f0d8353640da38f2a2ec0f45468a Binary files /dev/null and b/docs/image_sources/brand/android_logo_no.graffle/image1.jpg differ diff --git a/docs/image_sources/training/tv/playback/onboarding-fragment-diagram.graffle.zip b/docs/image_sources/training/tv/playback/onboarding-fragment-diagram.graffle.zip new file mode 100644 index 0000000000000000000000000000000000000000..89a799bb57c3bae498dc4093ee46392fadfdc3bd Binary files /dev/null and b/docs/image_sources/training/tv/playback/onboarding-fragment-diagram.graffle.zip differ diff --git a/docs/source.properties b/docs/source.properties new file mode 100644 index 0000000000000000000000000000000000000000..77a760bce900e089d933488471cb1fc574505fd9 --- /dev/null +++ b/docs/source.properties @@ -0,0 +1,3 @@ +Pkg.Revision=24.0 +Pkg.Desc=Android offline API reference +Pkg.Path=docs \ No newline at end of file diff --git a/graphics/java/android/graphics/SurfaceTexture.java b/graphics/java/android/graphics/SurfaceTexture.java index 5c54324d81070c77a44fee9c736446b1c2f159c6..c3861083e2fda53a462809889c20e421e6b317ae 100644 --- a/graphics/java/android/graphics/SurfaceTexture.java +++ b/graphics/java/android/graphics/SurfaceTexture.java @@ -77,6 +77,8 @@ public class SurfaceTexture { private long mProducer; private long mFrameAvailableListener; + private boolean mIsSingleBuffered; + /** * Callback interface for being notified that a new stream frame is available. */ @@ -130,6 +132,7 @@ public class SurfaceTexture { */ public SurfaceTexture(int texName, boolean singleBufferMode) { mCreatorLooper = Looper.myLooper(); + mIsSingleBuffered = singleBufferMode; nativeInit(false, texName, singleBufferMode, new WeakReference(this)); } @@ -157,6 +160,7 @@ public class SurfaceTexture { */ public SurfaceTexture(boolean singleBufferMode) { mCreatorLooper = Looper.myLooper(); + mIsSingleBuffered = singleBufferMode; nativeInit(true, 0, singleBufferMode, new WeakReference(this)); } @@ -378,6 +382,14 @@ public class SurfaceTexture { } } + /** + * Returns true if the SurfaceTexture is single-buffered + * @hide + */ + public boolean isSingleBuffered() { + return mIsSingleBuffered; + } + private native void nativeInit(boolean isDetached, int texName, boolean singleBufferMode, WeakReference weakSelf) throws Surface.OutOfResourcesException; diff --git a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java index c836204486b05d7e13ced135f4e09105886c418d..c24d31334be003b6f8fd8aaa38a2eb53185636a6 100644 --- a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java +++ b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java @@ -65,19 +65,36 @@ import java.lang.ref.WeakReference; import java.util.ArrayList; /** - * This class uses {@link android.animation.ObjectAnimator} and - * {@link android.animation.AnimatorSet} to animate the properties of a - * {@link android.graphics.drawable.VectorDrawable} to create an animated drawable. + * This class animates properties of a {@link android.graphics.drawable.VectorDrawable} with + * animations defined using {@link android.animation.ObjectAnimator} or + * {@link android.animation.AnimatorSet}. *

      - * AnimatedVectorDrawable are normally defined as 3 separate XML files. + * Starting from API 25, AnimatedVectorDrawable runs on RenderThread (as opposed to on UI thread for + * earlier APIs). This means animations in AnimatedVectorDrawable can remain smooth even when there + * is heavy workload on the UI thread. Note: If the UI thread is unresponsive, RenderThread may + * continue animating until the UI thread is capable of pushing another frame. Therefore, it is not + * possible to precisely coordinate a RenderThread-enabled AnimatedVectorDrawable with UI thread + * animations. Additionally, + * {@link android.graphics.drawable.Animatable2.AnimationCallback#onAnimationEnd(Drawable)} will be + * called the frame after the AnimatedVectorDrawable finishes on the RenderThread. *

      *

      - * First is the XML file for {@link android.graphics.drawable.VectorDrawable}. - * Note that we allow the animation to happen on the group's attributes and path's - * attributes, which requires they are uniquely named in this XML file. Groups - * and paths without animations do not need names. + * AnimatedVectorDrawable can be defined in either three separate XML files, + * or one XML. *

      - *
    17. Here is a simple VectorDrawable in this vectordrawable.xml file. + * + *

      Define an AnimatedVectorDrawable in three separate XML files

      + *
        + * + *
      • XML for the VectorDrawable containing properties to be animated

        + *

        + * Animations can be performed on both group and path attributes, which requires groups and paths to + * have unique names in the same VectorDrawable. Groups and paths without animations do not need to + * be named. + *

        + * Below is an example of a VectorDrawable defined in vectordrawable.xml. This VectorDrawable is + * referred to by its file name (not including file suffix) in the + * AnimatedVectorDrawable XML example. *
          * <vector xmlns:android="http://schemas.android.com/apk/res/android"
          *     android:height="64dp"
        @@ -96,17 +113,20 @@ import java.util.ArrayList;
          *     </group>
          * </vector>
          * 
      • + * + * + *
      • XML for AnimatedVectorDrawable

        *

        - * Second is the AnimatedVectorDrawable's XML file, which defines the target - * VectorDrawable, the target paths and groups to animate, the properties of the - * path and group to animate and the animations defined as the ObjectAnimators - * or AnimatorSets. + * An AnimatedVectorDrawable element has a VectorDrawable attribute, and one or more target + * element(s). The target elements can be the path or group to be animated. Each target element + * contains a name attribute that references a property (of a path or a group) to animate, and an + * animation attribute that points to an ObjectAnimator or an AnimatorSet. *

        - *
      • Here is a simple AnimatedVectorDrawable defined in this avd.xml file. - * Note how we use the names to refer to the groups and paths in the vectordrawable.xml. + * The following code sample defines an AnimatedVectorDrawable. Note that the names refer to the + * groups and paths in the VectorDrawable XML above. *
          * <animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
        - *   android:drawable="@drawable/vectordrawable" >
        + *     android:drawable="@drawable/vectordrawable" >
          *     <target
          *         android:name="rotationGroup"
          *         android:animation="@anim/rotation" />
        @@ -114,36 +134,89 @@ import java.util.ArrayList;
          *         android:name="v"
          *         android:animation="@anim/path_morph" />
          * </animated-vector>
        - * 
      • + * + * + * + *
      • XML for Animations defined using ObjectAnimator or AnimatorSet

        *

        - * Last is the Animator XML file, which is the same as a normal ObjectAnimator - * or AnimatorSet. - * To complete this example, here are the 2 animator files used in avd.xml: - * rotation.xml and path_morph.xml. + * From the previous example of AnimatedVectorDrawable, two animations + * were used: rotation.xml and path_morph.xml. *

        - *
      • Here is the rotation.xml, which will rotate the target group for 360 degrees. + * rotation.xml rotates the target group from 0 degree to 360 degrees over 6000ms: *
          * <objectAnimator
          *     android:duration="6000"
          *     android:propertyName="rotation"
          *     android:valueFrom="0"
          *     android:valueTo="360" />
        - * 
      • - *
      • Here is the path_morph.xml, which will morph the path from one shape to - * the other. Note that the paths must be compatible for morphing. - * In more details, the paths should have exact same length of commands , and - * exact same length of parameters for each commands. - * Note that the path strings are better stored in strings.xml for reusing. + * + * + * path_morph.xml morphs the path from one shape into the other. Note that the paths must be + * compatible for morphing. Specifically, the paths must have the same commands, in the same order, + * and must have the same number of parameters for each command. It is recommended to store path + * strings as string resources for reuse. *
          * <set xmlns:android="http://schemas.android.com/apk/res/android">
          *     <objectAnimator
          *         android:duration="3000"
          *         android:propertyName="pathData"
        - *         android:valueFrom="M300,70 l 0,-70 70,70 0,0   -70,70z"
        + *         android:valueFrom="M300,70 l 0,-70 70,70 0,0 -70,70z"
          *         android:valueTo="M300,70 l 0,-70 70,0  0,140 -70,0 z"
          *         android:valueType="pathType"/>
          * </set>
        - * 
      • + * + *
      + * + *

      Define an AnimatedVectorDrawable all in one XML file

      + *

      + * Since the AAPT tool supports a new format that bundles several related XML files together, we can + * merge the XML files from the previous examples into one XML file: + *

      + *
      + * <animated-vector xmlns:android="http://schemas.android.com/apk/res/android" >
      + *     <aapt:attr name="android:drawable">
      + *         <vector
      + *             android:height="64dp"
      + *             android:width="64dp"
      + *             android:viewportHeight="600"
      + *             android:viewportWidth="600" >
      + *             <group
      + *                 android:name="rotationGroup"
      + *                 android:pivotX="300.0"
      + *                 android:pivotY="300.0"
      + *                 android:rotation="45.0" >
      + *                 <path
      + *                     android:name="v"
      + *                     android:fillColor="#000000"
      + *                     android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" />
      + *             </group>
      + *         </vector>
      + *     </aapt:attr>
      + *
      + *     <target android:name="rotationGroup"> *
      + *         <aapt:attr name="android:animation">
      + *             <objectAnimator
      + *             android:duration="6000"
      + *             android:propertyName="rotation"
      + *             android:valueFrom="0"
      + *             android:valueTo="360" />
      + *         </aapt:attr>
      + *     </target>
      + *
      + *     <target android:name="v" >
      + *         <aapt:attr name="android:animation">
      + *             <set>
      + *                 <objectAnimator
      + *                     android:duration="3000"
      + *                     android:propertyName="pathData"
      + *                     android:valueFrom="M300,70 l 0,-70 70,70 0,0 -70,70z"
      + *                     android:valueTo="M300,70 l 0,-70 70,0  0,140 -70,0 z"
      + *                     android:valueType="pathType"/>
      + *             </set>
      + *         </aapt:attr>
      + *      </target>
      + * </animated-vector>
      + * 
      * * @attr ref android.R.styleable#AnimatedVectorDrawable_drawable * @attr ref android.R.styleable#AnimatedVectorDrawableTarget_name @@ -237,6 +310,17 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable2 { return super.getChangingConfigurations() | mAnimatedVectorState.getChangingConfigurations(); } + /** + * Draws the AnimatedVectorDrawable into the given canvas. + *

      + * Note: Calling this method with a software canvas when the + * AnimatedVectorDrawable is being animated on RenderThread (for API 25 and later) may yield + * outdated result, as the UI thread is not guaranteed to be in sync with RenderThread on + * VectorDrawable's property changes during RenderThread animations. + *

      + * + * @param canvas The canvas to draw into + */ @Override public void draw(Canvas canvas) { if (!canvas.isHardwareAccelerated() && mAnimatorSet instanceof VectorDrawableAnimatorRT) { @@ -272,9 +356,9 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable2 { } /** - * AnimatedVectorDrawable is running on render thread now. Therefore, if the root alpha is being - * animated, then the root alpha value we get from this call could be out of sync with alpha - * value used in the render thread. Otherwise, the root alpha should be always the same value. + * For API 25 and later, AnimatedVectorDrawable runs on RenderThread. Therefore, when the + * root alpha is being animated, this getter does not guarantee to return an up-to-date alpha + * value. * * @return the containing vector drawable's root alpha value. */ @@ -371,7 +455,11 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable2 { int eventType = parser.getEventType(); float pathErrorScale = 1; - while (eventType != XmlPullParser.END_DOCUMENT) { + final int innerDepth = parser.getDepth() + 1; + + // Parse everything until the end of the animated-vector element. + while (eventType != XmlPullParser.END_DOCUMENT + && (parser.getDepth() >= innerDepth || eventType != XmlPullParser.END_TAG)) { if (eventType == XmlPullParser.START_TAG) { final String tagName = parser.getName(); if (ANIMATED_VECTOR.equals(tagName)) { @@ -1446,7 +1534,6 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable2 { } else { addPendingAction(START_ANIMATION); } - } @Override diff --git a/graphics/java/android/graphics/drawable/BitmapDrawable.java b/graphics/java/android/graphics/drawable/BitmapDrawable.java index 9d8ede048924923632abf0e2f8499f2a4307393f..df107f5ce3ef5a88befad1be41cd51bbf46834b1 100644 --- a/graphics/java/android/graphics/drawable/BitmapDrawable.java +++ b/graphics/java/android/graphics/drawable/BitmapDrawable.java @@ -463,31 +463,14 @@ public class BitmapDrawable extends Drawable { return isAutoMirrored() && getLayoutDirection() == LayoutDirection.RTL; } - private void updateMirrorMatrix(float dx) { - if (mMirrorMatrix == null) { - mMirrorMatrix = new Matrix(); - } - mMirrorMatrix.setTranslate(dx, 0); - mMirrorMatrix.preScale(-1.0f, 1.0f); - } - @Override protected void onBoundsChange(Rect bounds) { mDstRectAndInsetsDirty = true; + final Bitmap bitmap = mBitmapState.mBitmap; final Shader shader = mBitmapState.mPaint.getShader(); - if (shader != null) { - if (needMirroring()) { - updateMirrorMatrix(bounds.right - bounds.left); - shader.setLocalMatrix(mMirrorMatrix); - mBitmapState.mPaint.setShader(shader); - } else { - if (mMirrorMatrix != null) { - mMirrorMatrix = null; - shader.setLocalMatrix(Matrix.IDENTITY_MATRIX); - mBitmapState.mPaint.setShader(shader); - } - } + if (bitmap != null && shader != null) { + updateShaderMatrix(bitmap, mBitmapState.mPaint, shader, needMirroring()); } } @@ -548,19 +531,7 @@ public class BitmapDrawable extends Drawable { canvas.restore(); } } else { - if (needMirroring) { - // Mirror the bitmap - updateMirrorMatrix(mDstRect.right - mDstRect.left); - shader.setLocalMatrix(mMirrorMatrix); - paint.setShader(shader); - } else { - if (mMirrorMatrix != null) { - mMirrorMatrix = null; - shader.setLocalMatrix(Matrix.IDENTITY_MATRIX); - paint.setShader(shader); - } - } - + updateShaderMatrix(bitmap, paint, shader, needMirroring); canvas.drawRect(mDstRect, paint); } @@ -573,6 +544,51 @@ public class BitmapDrawable extends Drawable { } } + /** + * Updates the {@code paint}'s shader matrix to be consistent with the + * destination size and layout direction. + * + * @param bitmap the bitmap to be drawn + * @param paint the paint used to draw the bitmap + * @param shader the shader to set on the paint + * @param needMirroring whether the bitmap should be mirrored + */ + private void updateShaderMatrix(@NonNull Bitmap bitmap, @NonNull Paint paint, + @NonNull Shader shader, boolean needMirroring) { + final int sourceDensity = bitmap.getDensity(); + final int targetDensity = mTargetDensity; + final boolean needScaling = sourceDensity != 0 && sourceDensity != targetDensity; + if (needScaling || needMirroring) { + final Matrix matrix = getOrCreateMirrorMatrix(); + matrix.reset(); + + if (needMirroring) { + final int dx = mDstRect.right - mDstRect.left; + matrix.setTranslate(dx, 0); + matrix.setScale(-1, 1); + } + + if (needScaling) { + final float densityScale = targetDensity / (float) sourceDensity; + matrix.postScale(densityScale, densityScale); + } + + shader.setLocalMatrix(matrix); + } else { + mMirrorMatrix = null; + shader.setLocalMatrix(Matrix.IDENTITY_MATRIX); + } + + paint.setShader(shader); + } + + private Matrix getOrCreateMirrorMatrix() { + if (mMirrorMatrix == null) { + mMirrorMatrix = new Matrix(); + } + return mMirrorMatrix; + } + private void updateDstRectAndInsetsIfDirty() { if (mDstRectAndInsetsDirty) { if (mBitmapState.mTileModeX == null && mBitmapState.mTileModeY == null) { diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java index 7f3a4373639b74c9f050b56eb460881d515e357a..c2e302e184c90029ec03db6cadd3ec624746ecc9 100644 --- a/graphics/java/android/graphics/drawable/Drawable.java +++ b/graphics/java/android/graphics/drawable/Drawable.java @@ -109,6 +109,9 @@ import java.util.Collection; *
    18. Nine Patch: an extension to the PNG format allows it to * specify information about how to stretch it and place things inside of * it. + *
    19. Vector: a drawable defined in an XML file as a set of points, + * lines, and curves along with its associated color information. This type + * of drawable can be scaled without loss of display quality. *
    20. Shape: contains simple drawing commands instead of a raw * bitmap, allowing it to resize better in some cases. *
    21. Layers: a compound drawable, which draws multiple underlying @@ -1422,9 +1425,10 @@ public abstract class Drawable { /** * Obtains styled attributes from the theme, if available, or unstyled * resources if the theme is null. + * @hide */ - static @NonNull TypedArray obtainAttributes(@NonNull Resources res, @Nullable Theme theme, - @NonNull AttributeSet set, @NonNull int[] attrs) { + protected static @NonNull TypedArray obtainAttributes(@NonNull Resources res, + @Nullable Theme theme, @NonNull AttributeSet set, @NonNull int[] attrs) { if (theme == null) { return res.obtainAttributes(set, attrs); } diff --git a/graphics/java/android/graphics/drawable/DrawableContainer.java b/graphics/java/android/graphics/drawable/DrawableContainer.java index cc7f5c7cf753bf7431735c18301bc453ea5ffdaf..c7a3c75f3545a763506bce024b29762f858942b8 100644 --- a/graphics/java/android/graphics/drawable/DrawableContainer.java +++ b/graphics/java/android/graphics/drawable/DrawableContainer.java @@ -27,8 +27,8 @@ import android.graphics.ColorFilter; import android.graphics.Insets; import android.graphics.Outline; import android.graphics.PixelFormat; -import android.graphics.Rect; import android.graphics.PorterDuff.Mode; +import android.graphics.Rect; import android.os.SystemClock; import android.util.DisplayMetrics; import android.util.LayoutDirection; @@ -601,8 +601,9 @@ public class DrawableContainer extends Drawable implements Drawable.Callback { * during inflation. * * @param res the resources used to inflate density-dependent values + * @hide */ - final void updateDensity(Resources res) { + protected final void updateDensity(Resources res) { mDrawableContainerState.updateDensity(res); } @@ -711,7 +712,10 @@ public class DrawableContainer extends Drawable implements Drawable.Callback { boolean mHasTintList; boolean mHasTintMode; - DrawableContainerState(DrawableContainerState orig, DrawableContainer owner, + /** + * @hide + */ + protected DrawableContainerState(DrawableContainerState orig, DrawableContainer owner, Resources res) { mOwner = owner; mSourceRes = res != null ? res : (orig != null ? orig.mSourceRes : null); diff --git a/graphics/java/android/graphics/drawable/GradientDrawable.java b/graphics/java/android/graphics/drawable/GradientDrawable.java index 3dbd2a96b00a25cb88f53f6210159a3934c5f99f..8c633b0da93a3204731f406541de1e4b658d21c6 100644 --- a/graphics/java/android/graphics/drawable/GradientDrawable.java +++ b/graphics/java/android/graphics/drawable/GradientDrawable.java @@ -475,16 +475,17 @@ public class GradientDrawable extends Drawable { } /** - * Sets the center location in pixels of the gradient. The radius is - * honored only when the gradient type is set to {@link #RADIAL_GRADIENT} - * or {@link #SWEEP_GRADIENT}. + * Sets the position of the center of the gradient as a fraction of the + * width and height. + *

      + * The default value is (0.5, 0.5). *

      * Note: changing this property will affect all instances * of a drawable loaded from a resource. It is recommended to invoke * {@link #mutate()} before changing this property. * - * @param x the x coordinate of the gradient's center in pixels - * @param y the y coordinate of the gradient's center in pixels + * @param x the X-position of the center of the gradient + * @param y the Y-position of the center of the gradient * * @see #mutate() * @see #setGradientType(int) @@ -498,9 +499,10 @@ public class GradientDrawable extends Drawable { } /** - * Returns the center X location of this gradient in pixels. + * Returns the X-position of the center of the gradient as a fraction of + * the width. * - * @return the center X location of this gradient in pixels + * @return the X-position of the center of the gradient * @see #setGradientCenter(float, float) */ public float getGradientCenterX() { @@ -508,9 +510,10 @@ public class GradientDrawable extends Drawable { } /** - * Returns the center Y location of this gradient in pixels. + * Returns the Y-position of the center of this gradient as a fraction of + * the height. * - * @return the center Y location of this gradient in pixels + * @return the Y-position of the center of the gradient * @see #setGradientCenter(float, float) */ public float getGradientCenterY() { @@ -554,19 +557,43 @@ public class GradientDrawable extends Drawable { } /** - * Sets whether or not this drawable will honor its {@code level} property. + * Sets whether this drawable's {@code level} property will be used to + * scale the gradient. If a gradient is not used, this property has no + * effect. *

      - * Note: changing this property will affect all instances + * Scaling behavior varies based on gradient type: + *

        + *
      • {@link #LINEAR_GRADIENT} adjusts the ending position along the + * gradient's axis of orientation (see {@link #getOrientation()}) + *
      • {@link #RADIAL_GRADIENT} adjusts the outer radius + *
      • {@link #SWEEP_GRADIENT} adjusts the ending angle + *
          + *

          + * The default value for this property is {@code false}. + *

          + * Note: This property corresponds to the + * {@code android:useLevel} attribute on the inner {@code <gradient>} + * tag, NOT the {@code android:useLevel} attribute on the outer + * {@code <shape>} tag. For example, + *

          {@code
          +     * 
          +     *     
          +     * 
          +     * }

          + * Note: Changing this property will affect all instances * of a drawable loaded from a resource. It is recommended to invoke * {@link #mutate()} before changing this property. * - * @param useLevel {@code true} if this drawable should honor its level, - * {@code false} otherwise + * @param useLevel {@code true} if the gradient should be scaled based on + * level, {@code false} otherwise * * @see #mutate() * @see #setLevel(int) * @see #getLevel() * @see #getUseLevel() + * @attr ref android.R.styleable#GradientDrawableGradient_useLevel */ public void setUseLevel(boolean useLevel) { mGradientState.mUseLevel = useLevel; @@ -575,12 +602,13 @@ public class GradientDrawable extends Drawable { } /** - * Returns whether or not this drawable will honor its {@code level} - * property. + * Returns whether this drawable's {@code level} property will be used to + * scale the gradient. * - * @return {@code true} if this drawable should honor its level, + * @return {@code true} if the gradient should be scaled based on level, * {@code false} otherwise * @see #setUseLevel(boolean) + * @attr ref android.R.styleable#GradientDrawableGradient_useLevel */ public boolean getUseLevel() { return mGradientState.mUseLevel; diff --git a/graphics/java/android/graphics/drawable/LayerDrawable.java b/graphics/java/android/graphics/drawable/LayerDrawable.java index 1864206118b2155f8b29f6bbf19f9cacbe986931..c30c4c2f02d6c4a0e72dc347b685a7dcfe5b13c3 100644 --- a/graphics/java/android/graphics/drawable/LayerDrawable.java +++ b/graphics/java/android/graphics/drawable/LayerDrawable.java @@ -269,7 +269,8 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { // If the layer doesn't have a drawable or unresolved theme // attribute for a drawable, attempt to parse one from the child - // element. + // element. If multiple child elements exist, we'll only use the + // first one. if (layer.mDrawable == null && (layer.mThemeAttrs == null || layer.mThemeAttrs[R.styleable.LayerDrawableItem_drawable] == 0)) { while ((type = parser.next()) == XmlPullParser.TEXT) { @@ -279,13 +280,12 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { + ": tag requires a 'drawable' attribute or " + "child tag defining a drawable"); } - layer.mDrawable = Drawable.createFromXmlInner(r, parser, attrs, theme); - } - if (layer.mDrawable != null) { + // We found a child drawable. Take ownership. + layer.mDrawable = Drawable.createFromXmlInner(r, parser, attrs, theme); + layer.mDrawable.setCallback(this); state.mChildrenChangingConfigurations |= layer.mDrawable.getChangingConfigurations(); - layer.mDrawable.setCallback(this); } addLayer(layer); @@ -387,7 +387,19 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { final Drawable dr = a.getDrawable(R.styleable.LayerDrawableItem_drawable); if (dr != null) { + if (layer.mDrawable != null) { + // It's possible that a drawable was already set, in which case + // we should clear the callback. We may have also integrated the + // drawable's changing configurations, but we don't have enough + // information to revert that change. + layer.mDrawable.setCallback(null); + } + + // Take ownership of the new drawable. layer.mDrawable = dr; + layer.mDrawable.setCallback(this); + state.mChildrenChangingConfigurations |= + layer.mDrawable.getChangingConfigurations(); } } diff --git a/graphics/java/android/graphics/drawable/VectorDrawable.java b/graphics/java/android/graphics/drawable/VectorDrawable.java index dc1d18f3b2bda5c821964fb2d714a6a5af0741ea..1ca15525c8a1aca39001f30813612676137f5119 100644 --- a/graphics/java/android/graphics/drawable/VectorDrawable.java +++ b/graphics/java/android/graphics/drawable/VectorDrawable.java @@ -27,9 +27,9 @@ import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.Insets; import android.graphics.PixelFormat; +import android.graphics.PorterDuff.Mode; import android.graphics.PorterDuffColorFilter; import android.graphics.Rect; -import android.graphics.PorterDuff.Mode; import android.graphics.Shader; import android.util.ArrayMap; import android.util.AttributeSet; @@ -76,27 +76,36 @@ import dalvik.system.VMRuntime; *

          *
          android:name
          *
          Defines the name of this vector drawable.
          + *
          Animatable : No.
          *
          android:width
          *
          Used to define the intrinsic width of the drawable. * This support all the dimension units, normally specified with dp.
          + *
          Animatable : No.
          *
          android:height
          *
          Used to define the intrinsic height the drawable. * This support all the dimension units, normally specified with dp.
          + *
          Animatable : No.
          *
          android:viewportWidth
          *
          Used to define the width of the viewport space. Viewport is basically * the virtual canvas where the paths are drawn on.
          + *
          Animatable : No.
          *
          android:viewportHeight
          *
          Used to define the height of the viewport space. Viewport is basically * the virtual canvas where the paths are drawn on.
          + *
          Animatable : No.
          *
          android:tint
          *
          The color to apply to the drawable as a tint. By default, no tint is applied.
          + *
          Animatable : No.
          *
          android:tintMode
          *
          The Porter-Duff blending mode for the tint color. The default value is src_in.
          + *
          Animatable : No.
          *
          android:autoMirrored
          *
          Indicates if the drawable needs to be mirrored when its layout direction is * RTL (right-to-left).
          + *
          Animatable : No.
          *
          android:alpha
          *
          The opacity of this drawable.
          + *
          Animatable : Yes.
          *
          * * @@ -108,24 +117,32 @@ import dalvik.system.VMRuntime; *
          *
          android:name
          *
          Defines the name of the group.
          + *
          Animatable : No.
          *
          android:rotation
          *
          The degrees of rotation of the group.
          + *
          Animatable : Yes.
          *
          android:pivotX
          *
          The X coordinate of the pivot for the scale and rotation of the group. * This is defined in the viewport space.
          + *
          Animatable : Yes.
          *
          android:pivotY
          *
          The Y coordinate of the pivot for the scale and rotation of the group. * This is defined in the viewport space.
          + *
          Animatable : Yes.
          *
          android:scaleX
          *
          The amount of scale on the X Coordinate.
          + *
          Animatable : Yes.
          *
          android:scaleY
          *
          The amount of scale on the Y coordinate.
          + *
          Animatable : Yes.
          *
          android:translateX
          *
          The amount of translation on the X coordinate. * This is defined in the viewport space.
          + *
          Animatable : Yes.
          *
          android:translateY
          *
          The amount of translation on the Y coordinate. * This is defined in the viewport space.
          + *
          Animatable : Yes.
          *
          * * @@ -135,40 +152,60 @@ import dalvik.system.VMRuntime; *
          *
          android:name
          *
          Defines the name of the path.
          + *
          Animatable : No.
          *
          android:pathData
          *
          Defines path data using exactly same format as "d" attribute * in the SVG's path data. This is defined in the viewport space.
          + *
          Animatable : Yes.
          *
          android:fillColor
          *
          Specifies the color used to fill the path. May be a color or, for SDK 24+, a color state list - * or a gradient color. If this property is animated, any value set by the animation will - * override the original value. No path fill is drawn if this property is not specified.
          + * or a gradient color (See {@link android.R.styleable#GradientColor} + * and {@link android.R.styleable#GradientColorItem}). + * If this property is animated, any value set by the animation will override the original value. + * No path fill is drawn if this property is not specified. + *
          Animatable : Yes.
          *
          android:strokeColor
          *
          Specifies the color used to draw the path outline. May be a color or, for SDK 24+, a color - * state list or a gradient color. If this property is animated, any value set by the animation will - * override the original value. No path outline is drawn if this property is not specified.
          + * state list or a gradient color (See {@link android.R.styleable#GradientColor} + * and {@link android.R.styleable#GradientColorItem}). + * If this property is animated, any value set by the animation will override the original value. + * No path outline is drawn if this property is not specified. + *
          Animatable : Yes.
          *
          android:strokeWidth
          *
          The width a path stroke.
          + *
          Animatable : Yes.
          *
          android:strokeAlpha
          *
          The opacity of a path stroke.
          + *
          Animatable : Yes.
          *
          android:fillAlpha
          *
          The opacity to fill the path with.
          + *
          Animatable : Yes.
          *
          android:trimPathStart
          *
          The fraction of the path to trim from the start, in the range from 0 to 1.
          + *
          Animatable : Yes.
          *
          android:trimPathEnd
          *
          The fraction of the path to trim from the end, in the range from 0 to 1.
          + *
          Animatable : Yes.
          *
          android:trimPathOffset
          *
          Shift trim region (allows showed region to include the start and end), in the range * from 0 to 1.
          + *
          Animatable : Yes.
          *
          android:strokeLineCap
          *
          Sets the linecap for a stroked path: butt, round, square.
          + *
          Animatable : No.
          *
          android:strokeLineJoin
          *
          Sets the lineJoin for a stroked path: miter,round,bevel.
          + *
          Animatable : No.
          *
          android:strokeMiterLimit
          *
          Sets the Miter limit for a stroked path.
          + *
          Animatable : No.
          *
          android:fillType
          - *
          Sets the fillType for a path. It is the same as SVG's "fill-rule" properties. - * For more details, see https://www.w3.org/TR/SVG/painting.html#FillRuleProperty
          + *
          Sets the fillType for a path. The types can be either "evenOdd" or "nonZero". They behave the + * same as SVG's "fill-rule" properties. For more details, see + * FillRuleProperty
          + *
          Animatable : No.
          *
          + * * * *
          @@ -178,9 +215,11 @@ import dalvik.system.VMRuntime; *
          *
          android:name
          *
          Defines the name of the clip path.
          + *
          Animatable : No.
          *
          android:pathData
          *
          Defines clip path using the same format as "d" attribute * in the SVG's path data.
          + *
          Animatable : Yes.
          *
          *
          *
        • Here is a simple VectorDrawable in this vectordrawable.xml file. @@ -201,7 +240,26 @@ import dalvik.system.VMRuntime; * android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" /> * </group> * </vector> - *
        • + * + * + *
        • And here is an example of linear gradient color, which is supported in SDK 24+. + * See more details in {@link android.R.styleable#GradientColor} and + * {@link android.R.styleable#GradientColorItem}. + *
          + * <gradient xmlns:android="http://schemas.android.com/apk/res/android"
          + *     android:angle="90"
          + *     android:startColor="?android:attr/colorPrimary"
          + *     android:endColor="?android:attr/colorControlActivated"
          + *     android:centerColor="#f00"
          + *     android:startX="0"
          + *     android:startY="0"
          + *     android:endX="100"
          + *     android:endY="100"
          + *     android:type="linear">
          + * </gradient>
          + * 
          + *
        • + * */ public class VectorDrawable extends Drawable { @@ -686,7 +744,11 @@ public class VectorDrawable extends Drawable { groupStack.push(state.mRootGroup); int eventType = parser.getEventType(); - while (eventType != XmlPullParser.END_DOCUMENT) { + final int innerDepth = parser.getDepth() + 1; + + // Parse everything until the end of the vector element. + while (eventType != XmlPullParser.END_DOCUMENT + && (parser.getDepth() >= innerDepth || eventType != XmlPullParser.END_TAG)) { if (eventType == XmlPullParser.START_TAG) { final String tagName = parser.getName(); final VGroup currentGroup = groupStack.peek(); diff --git a/graphics/java/android/graphics/pdf/PdfEditor.java b/graphics/java/android/graphics/pdf/PdfEditor.java index 2b70b6a45f827f7ed32a2a7afe375d5ded232fe5..cd1f8de6ee0f824147c5024dd6d03e915113bb48 100644 --- a/graphics/java/android/graphics/pdf/PdfEditor.java +++ b/graphics/java/android/graphics/pdf/PdfEditor.java @@ -79,8 +79,12 @@ public final class PdfEditor { } mInput = input; - mNativeDocument = nativeOpen(mInput.getFd(), size); - mPageCount = nativeGetPageCount(mNativeDocument); + + synchronized (PdfRenderer.sPdfiumLock) { + mNativeDocument = nativeOpen(mInput.getFd(), size); + mPageCount = nativeGetPageCount(mNativeDocument); + } + mCloseGuard.open("close"); } @@ -102,7 +106,10 @@ public final class PdfEditor { public void removePage(int pageIndex) { throwIfClosed(); throwIfPageNotInDocument(pageIndex); - mPageCount = nativeRemovePage(mNativeDocument, pageIndex); + + synchronized (PdfRenderer.sPdfiumLock) { + mPageCount = nativeRemovePage(mNativeDocument, pageIndex); + } } /** @@ -125,11 +132,16 @@ public final class PdfEditor { if (clip == null) { Point size = new Point(); getPageSize(pageIndex, size); - nativeSetTransformAndClip(mNativeDocument, pageIndex, transform.native_instance, - 0, 0, size.x, size.y); + + synchronized (PdfRenderer.sPdfiumLock) { + nativeSetTransformAndClip(mNativeDocument, pageIndex, transform.native_instance, + 0, 0, size.x, size.y); + } } else { - nativeSetTransformAndClip(mNativeDocument, pageIndex, transform.native_instance, - clip.left, clip.top, clip.right, clip.bottom); + synchronized (PdfRenderer.sPdfiumLock) { + nativeSetTransformAndClip(mNativeDocument, pageIndex, transform.native_instance, + clip.left, clip.top, clip.right, clip.bottom); + } } } @@ -143,7 +155,10 @@ public final class PdfEditor { throwIfClosed(); throwIfOutSizeNull(outSize); throwIfPageNotInDocument(pageIndex); - nativeGetPageSize(mNativeDocument, pageIndex, outSize); + + synchronized (PdfRenderer.sPdfiumLock) { + nativeGetPageSize(mNativeDocument, pageIndex, outSize); + } } /** @@ -156,7 +171,10 @@ public final class PdfEditor { throwIfClosed(); throwIfOutMediaBoxNull(outMediaBox); throwIfPageNotInDocument(pageIndex); - return nativeGetPageMediaBox(mNativeDocument, pageIndex, outMediaBox); + + synchronized (PdfRenderer.sPdfiumLock) { + return nativeGetPageMediaBox(mNativeDocument, pageIndex, outMediaBox); + } } /** @@ -169,7 +187,10 @@ public final class PdfEditor { throwIfClosed(); throwIfMediaBoxNull(mediaBox); throwIfPageNotInDocument(pageIndex); - nativeSetPageMediaBox(mNativeDocument, pageIndex, mediaBox); + + synchronized (PdfRenderer.sPdfiumLock) { + nativeSetPageMediaBox(mNativeDocument, pageIndex, mediaBox); + } } /** @@ -182,7 +203,10 @@ public final class PdfEditor { throwIfClosed(); throwIfOutCropBoxNull(outCropBox); throwIfPageNotInDocument(pageIndex); - return nativeGetPageCropBox(mNativeDocument, pageIndex, outCropBox); + + synchronized (PdfRenderer.sPdfiumLock) { + return nativeGetPageCropBox(mNativeDocument, pageIndex, outCropBox); + } } /** @@ -195,7 +219,10 @@ public final class PdfEditor { throwIfClosed(); throwIfCropBoxNull(cropBox); throwIfPageNotInDocument(pageIndex); - nativeSetPageCropBox(mNativeDocument, pageIndex, cropBox); + + synchronized (PdfRenderer.sPdfiumLock) { + nativeSetPageCropBox(mNativeDocument, pageIndex, cropBox); + } } /** @@ -205,7 +232,10 @@ public final class PdfEditor { */ public boolean shouldScaleForPrinting() { throwIfClosed(); - return nativeScaleForPrinting(mNativeDocument); + + synchronized (PdfRenderer.sPdfiumLock) { + return nativeScaleForPrinting(mNativeDocument); + } } /** @@ -219,7 +249,10 @@ public final class PdfEditor { public void write(ParcelFileDescriptor output) throws IOException { try { throwIfClosed(); - nativeWrite(mNativeDocument, output.getFd()); + + synchronized (PdfRenderer.sPdfiumLock) { + nativeWrite(mNativeDocument, output.getFd()); + } } finally { IoUtils.closeQuietly(output); } @@ -247,7 +280,9 @@ public final class PdfEditor { } private void doClose() { - nativeClose(mNativeDocument); + synchronized (PdfRenderer.sPdfiumLock) { + nativeClose(mNativeDocument); + } IoUtils.closeQuietly(mInput); mInput = null; mCloseGuard.close(); diff --git a/graphics/java/android/graphics/pdf/PdfRenderer.java b/graphics/java/android/graphics/pdf/PdfRenderer.java index 520ebe5f2db88016145635e839d66711b03b869a..cfc130990e926a2f2874a354e16dc9605225c812 100644 --- a/graphics/java/android/graphics/pdf/PdfRenderer.java +++ b/graphics/java/android/graphics/pdf/PdfRenderer.java @@ -99,6 +99,12 @@ import java.lang.annotation.RetentionPolicy; * @see #close() */ public final class PdfRenderer implements AutoCloseable { + /** + * Any call the native pdfium code has to be single threaded as the library does not support + * parallel use. + */ + final static Object sPdfiumLock = new Object(); + private final CloseGuard mCloseGuard = CloseGuard.get(); private final Point mTempPoint = new Point(); @@ -154,8 +160,12 @@ public final class PdfRenderer implements AutoCloseable { } mInput = input; - mNativeDocument = nativeCreate(mInput.getFd(), size); - mPageCount = nativeGetPageCount(mNativeDocument); + + synchronized (sPdfiumLock) { + mNativeDocument = nativeCreate(mInput.getFd(), size); + mPageCount = nativeGetPageCount(mNativeDocument); + } + mCloseGuard.open("close"); } @@ -189,7 +199,10 @@ public final class PdfRenderer implements AutoCloseable { */ public boolean shouldScaleForPrinting() { throwIfClosed(); - return nativeScaleForPrinting(mNativeDocument); + + synchronized (sPdfiumLock) { + return nativeScaleForPrinting(mNativeDocument); + } } /** @@ -224,7 +237,9 @@ public final class PdfRenderer implements AutoCloseable { if (mCurrentPage != null) { mCurrentPage.close(); } - nativeClose(mNativeDocument); + synchronized (sPdfiumLock) { + nativeClose(mNativeDocument); + } try { mInput.close(); } catch (IOException ioe) { @@ -277,7 +292,9 @@ public final class PdfRenderer implements AutoCloseable { private Page(int index) { Point size = mTempPoint; - mNativePage = nativeOpenPageAndGetSize(mNativeDocument, index, size); + synchronized (sPdfiumLock) { + mNativePage = nativeOpenPageAndGetSize(mNativeDocument, index, size); + } mIndex = index; mWidth = size.x; mHeight = size.y; @@ -384,8 +401,10 @@ public final class PdfRenderer implements AutoCloseable { final long transformPtr = (transform != null) ? transform.native_instance : 0; - nativeRenderPage(mNativeDocument, mNativePage, destination, contentLeft, - contentTop, contentRight, contentBottom, transformPtr, renderMode); + synchronized (sPdfiumLock) { + nativeRenderPage(mNativeDocument, mNativePage, destination, contentLeft, + contentTop, contentRight, contentBottom, transformPtr, renderMode); + } } /** @@ -412,7 +431,9 @@ public final class PdfRenderer implements AutoCloseable { } private void doClose() { - nativeClosePage(mNativePage); + synchronized (sPdfiumLock) { + nativeClosePage(mNativePage); + } mNativePage = 0; mCloseGuard.close(); mCurrentPage = null; diff --git a/include/androidfw/Asset.h b/include/androidfw/Asset.h index ee77e971011b9a60817345f731ae77718a47a7fb..52c863774efb0ca590ec6ba02a241fdbeff94de8 100644 --- a/include/androidfw/Asset.h +++ b/include/androidfw/Asset.h @@ -44,7 +44,7 @@ namespace android { */ class Asset { public: - virtual ~Asset(void); + virtual ~Asset(void) = default; static int32_t getGlobalCount(); static String8 getAssetAllocations(); @@ -119,6 +119,19 @@ public: const char* getAssetSource(void) const { return mAssetSource.string(); } protected: + /* + * Adds this Asset to the global Asset list for debugging and + * accounting. + * Concrete subclasses must call this in their constructor. + */ + static void registerAsset(Asset* asset); + + /* + * Removes this Asset from the global Asset list. + * Concrete subclasses must call this in their destructor. + */ + static void unregisterAsset(Asset* asset); + Asset(void); // constructor; only invoked indirectly /* handle common seek() housekeeping */ diff --git a/keystore/java/android/security/KeyChain.java b/keystore/java/android/security/KeyChain.java index cce58c2096f352b64c2c3cc7685af7b8f9ea52b3..a96ca3922296628bce81c930cfec112f2fd670a7 100644 --- a/keystore/java/android/security/KeyChain.java +++ b/keystore/java/android/security/KeyChain.java @@ -20,6 +20,7 @@ import android.annotation.Nullable; import android.annotation.WorkerThread; import android.app.Activity; import android.app.PendingIntent; +import android.app.Service; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -356,6 +357,9 @@ public final class KeyChain { * *

          This method may block while waiting for a connection to another process, and must never * be called from the main thread. + *

          As {@link Activity} and {@link Service} contexts are short-lived and can be destroyed + * at any time from the main thread, it is safer to rely on a long-lived context such as one + * returned from {@link Context#getApplicationContext()}. * * @param alias The alias of the desired private key, typically returned via * {@link KeyChainAliasCallback#alias}. @@ -368,7 +372,7 @@ public final class KeyChain { if (alias == null) { throw new NullPointerException("alias == null"); } - KeyChainConnection keyChainConnection = bind(context); + KeyChainConnection keyChainConnection = bind(context.getApplicationContext()); try { final IKeyChainService keyChainService = keyChainConnection.getService(); final String keyId = keyChainService.requestPrivateKey(alias); @@ -400,6 +404,9 @@ public final class KeyChain { * *

          This method may block while waiting for a connection to another process, and must never * be called from the main thread. + *

          As {@link Activity} and {@link Service} contexts are short-lived and can be destroyed + * at any time from the main thread, it is safer to rely on a long-lived context such as one + * returned from {@link Context#getApplicationContext()}. * * @param alias The alias of the desired certificate chain, typically * returned via {@link KeyChainAliasCallback#alias}. @@ -412,7 +419,7 @@ public final class KeyChain { if (alias == null) { throw new NullPointerException("alias == null"); } - KeyChainConnection keyChainConnection = bind(context); + KeyChainConnection keyChainConnection = bind(context.getApplicationContext()); try { IKeyChainService keyChainService = keyChainConnection.getService(); diff --git a/keystore/java/android/security/KeyPairGeneratorSpec.java b/keystore/java/android/security/KeyPairGeneratorSpec.java index d8493175e63fa8db660d3750cc26f678e51f3304..d023866ca7024c94db2ece65763e60121f31d585 100644 --- a/keystore/java/android/security/KeyPairGeneratorSpec.java +++ b/keystore/java/android/security/KeyPairGeneratorSpec.java @@ -251,8 +251,9 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { /** * Builder class for {@link KeyPairGeneratorSpec} objects. *

          - * This will build a parameter spec for use with the Android KeyStore facility. + * This will build a parameter spec for use with the + * Android KeyStore + * facility. *

          * The required fields must be filled in with the builder. *

          diff --git a/libs/androidfw/Asset.cpp b/libs/androidfw/Asset.cpp index 4e14b13dc8bd216a18c352063c006026f875da21..6ae39d5d5d01dc9e478ba02ec3f7993c6bb5a92a 100644 --- a/libs/androidfw/Asset.cpp +++ b/libs/androidfw/Asset.cpp @@ -52,6 +52,47 @@ static int32_t gCount = 0; static Asset* gHead = NULL; static Asset* gTail = NULL; +void Asset::registerAsset(Asset* asset) +{ + AutoMutex _l(gAssetLock); + gCount++; + asset->mNext = asset->mPrev = NULL; + if (gTail == NULL) { + gHead = gTail = asset; + } else { + asset->mPrev = gTail; + gTail->mNext = asset; + gTail = asset; + } + + if (kIsDebug) { + ALOGI("Creating Asset %p #%d\n", asset, gCount); + } +} + +void Asset::unregisterAsset(Asset* asset) +{ + AutoMutex _l(gAssetLock); + gCount--; + if (gHead == asset) { + gHead = asset->mNext; + } + if (gTail == asset) { + gTail = asset->mPrev; + } + if (asset->mNext != NULL) { + asset->mNext->mPrev = asset->mPrev; + } + if (asset->mPrev != NULL) { + asset->mPrev->mNext = asset->mNext; + } + asset->mNext = asset->mPrev = NULL; + + if (kIsDebug) { + ALOGI("Destroying Asset in %p #%d\n", asset, gCount); + } +} + int32_t Asset::getGlobalCount() { AutoMutex _l(gAssetLock); @@ -79,43 +120,8 @@ String8 Asset::getAssetAllocations() } Asset::Asset(void) - : mAccessMode(ACCESS_UNKNOWN) + : mAccessMode(ACCESS_UNKNOWN), mNext(NULL), mPrev(NULL) { - AutoMutex _l(gAssetLock); - gCount++; - mNext = mPrev = NULL; - if (gTail == NULL) { - gHead = gTail = this; - } else { - mPrev = gTail; - gTail->mNext = this; - gTail = this; - } - if (kIsDebug) { - ALOGI("Creating Asset %p #%d\n", this, gCount); - } -} - -Asset::~Asset(void) -{ - AutoMutex _l(gAssetLock); - gCount--; - if (gHead == this) { - gHead = mNext; - } - if (gTail == this) { - gTail = mPrev; - } - if (mNext != NULL) { - mNext->mPrev = mPrev; - } - if (mPrev != NULL) { - mPrev->mNext = mNext; - } - mNext = mPrev = NULL; - if (kIsDebug) { - ALOGI("Destroying Asset in %p #%d\n", this, gCount); - } } /* @@ -361,6 +367,9 @@ off64_t Asset::handleSeek(off64_t offset, int whence, off64_t curPosn, off64_t m _FileAsset::_FileAsset(void) : mStart(0), mLength(0), mOffset(0), mFp(NULL), mFileName(NULL), mMap(NULL), mBuf(NULL) { + // Register the Asset with the global list here after it is fully constructed and its + // vtable pointer points to this concrete type. b/31113965 + registerAsset(this); } /* @@ -369,6 +378,10 @@ _FileAsset::_FileAsset(void) _FileAsset::~_FileAsset(void) { close(); + + // Unregister the Asset from the global list here before it is destructed and while its vtable + // pointer still points to this concrete type. b/31113965 + unregisterAsset(this); } /* @@ -685,6 +698,9 @@ _CompressedAsset::_CompressedAsset(void) : mStart(0), mCompressedLen(0), mUncompressedLen(0), mOffset(0), mMap(NULL), mFd(-1), mZipInflater(NULL), mBuf(NULL) { + // Register the Asset with the global list here after it is fully constructed and its + // vtable pointer points to this concrete type. b/31113965 + registerAsset(this); } /* @@ -693,6 +709,10 @@ _CompressedAsset::_CompressedAsset(void) _CompressedAsset::~_CompressedAsset(void) { close(); + + // Unregister the Asset from the global list here before it is destructed and while its vtable + // pointer still points to this concrete type. b/31113965 + unregisterAsset(this); } /* diff --git a/libs/androidfw/AssetManager.cpp b/libs/androidfw/AssetManager.cpp index 209bbad8b86beb9fb07995822fe5626df94470b2..fdd0cafa2a1bd0966a46c79df32bdab92bbe8f7f 100644 --- a/libs/androidfw/AssetManager.cpp +++ b/libs/androidfw/AssetManager.cpp @@ -35,6 +35,9 @@ #include #include #include +#ifndef _WIN32 +#include +#endif #include #include @@ -777,6 +780,12 @@ void AssetManager::addSystemOverlays(const char* pathOverlaysList, return; } +#ifndef _WIN32 + if (TEMP_FAILURE_RETRY(flock(fileno(fin), LOCK_SH)) != 0) { + fclose(fin); + return; + } +#endif char buf[1024]; while (fgets(buf, sizeof(buf), fin)) { // format of each line: @@ -808,6 +817,10 @@ void AssetManager::addSystemOverlays(const char* pathOverlaysList, delete oidmap; } } + +#ifndef _WIN32 + TEMP_FAILURE_RETRY(flock(fileno(fin), LOCK_UN)); +#endif fclose(fin); } @@ -1903,6 +1916,7 @@ ZipFileRO* AssetManager::SharedZip::getZip() Asset* AssetManager::SharedZip::getResourceTableAsset() { + AutoMutex _l(gLock); ALOGV("Getting from SharedZip %p resource asset %p\n", this, mResourceTableAsset); return mResourceTableAsset; } @@ -1912,10 +1926,10 @@ Asset* AssetManager::SharedZip::setResourceTableAsset(Asset* asset) { AutoMutex _l(gLock); if (mResourceTableAsset == NULL) { - mResourceTableAsset = asset; // This is not thread safe the first time it is called, so // do it here with the global lock held. asset->getBuffer(true); + mResourceTableAsset = asset; return asset; } } diff --git a/libs/androidfw/tests/Android.mk b/libs/androidfw/tests/Android.mk index 2bc026b79ca2d3e2f6cc8100e1e48ca8bb0d014b..1fe1773578fa8a4ef732d26c40cb099a9a401a66 100644 --- a/libs/androidfw/tests/Android.mk +++ b/libs/androidfw/tests/Android.mk @@ -22,6 +22,7 @@ LOCAL_PATH:= $(call my-dir) testFiles := \ AppAsLib_test.cpp \ + Asset_test.cpp \ AttributeFinder_test.cpp \ ByteBucketArray_test.cpp \ Config_test.cpp \ diff --git a/libs/androidfw/tests/Asset_test.cpp b/libs/androidfw/tests/Asset_test.cpp new file mode 100644 index 0000000000000000000000000000000000000000..45c8cef92918ae10b1dd126c53ddd6df039d0485 --- /dev/null +++ b/libs/androidfw/tests/Asset_test.cpp @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2016 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. + */ + +#include + +#include + +using namespace android; + +TEST(AssetTest, FileAssetRegistersItself) { + const int32_t count = Asset::getGlobalCount(); + Asset* asset = new _FileAsset(); + EXPECT_EQ(count + 1, Asset::getGlobalCount()); + delete asset; + EXPECT_EQ(count, Asset::getGlobalCount()); +} + +TEST(AssetTest, CompressedAssetRegistersItself) { + const int32_t count = Asset::getGlobalCount(); + Asset* asset = new _CompressedAsset(); + EXPECT_EQ(count + 1, Asset::getGlobalCount()); + delete asset; + EXPECT_EQ(count, Asset::getGlobalCount()); +} diff --git a/libs/hwui/Android.mk b/libs/hwui/Android.mk index 366ef716c109797455e5ae4d98ff90b150ef34a7..cacfce16ab9ab1ec73259258ce94368a84eed4d6 100644 --- a/libs/hwui/Android.mk +++ b/libs/hwui/Android.mk @@ -3,6 +3,7 @@ include $(CLEAR_VARS) LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk HWUI_NEW_OPS := true +BUGREPORT_FONT_CACHE_USAGE := false # Enables fine-grained GLES error checking # If set to true, every GLES call is wrapped & error checked @@ -135,6 +136,13 @@ ifeq (true, $(HWUI_NEW_OPS)) endif +ifeq (true, $(BUGREPORT_FONT_CACHE_USAGE)) + hwui_src_files += \ + font/FontCacheHistoryTracker.cpp + hwui_cflags += -DBUGREPORT_FONT_CACHE_USAGE +endif + + ifndef HWUI_COMPILE_SYMBOLS hwui_cflags += -fvisibility=hidden endif diff --git a/libs/hwui/Caches.cpp b/libs/hwui/Caches.cpp index 949ad450d5f75b0b17fb7894836cfa36a21cbff7..a8ced9b2597b0cee0a3a0fffeeca975f0e5d658c 100644 --- a/libs/hwui/Caches.cpp +++ b/libs/hwui/Caches.cpp @@ -21,6 +21,9 @@ #include "Properties.h" #include "renderstate/RenderState.h" #include "ShadowTessellator.h" +#ifdef BUGREPORT_FONT_CACHE_USAGE +#include "font/FontCacheHistoryTracker.h" +#endif #include "utils/GLUtils.h" #include @@ -195,12 +198,7 @@ void Caches::dumpMemoryUsage(String8 &log) { log.appendFormat(" PatchCache %8d / %8d\n", patchCache.getSize(), patchCache.getMaxSize()); - const uint32_t sizeA8 = fontRenderer.getFontRendererSize(GL_ALPHA); - const uint32_t sizeRGBA = fontRenderer.getFontRendererSize(GL_RGBA); - log.appendFormat(" FontRenderer A8 %8d / %8d\n", sizeA8, sizeA8); - log.appendFormat(" FontRenderer RGBA %8d / %8d\n", sizeRGBA, sizeRGBA); - log.appendFormat(" FontRenderer total %8d / %8d\n", sizeA8 + sizeRGBA, - sizeA8 + sizeRGBA); + fontRenderer.dumpMemoryUsage(log); log.appendFormat("Other:\n"); log.appendFormat(" FboCache %8d / %8d\n", @@ -213,11 +211,14 @@ void Caches::dumpMemoryUsage(String8 &log) { total += tessellationCache.getSize(); total += dropShadowCache.getSize(); total += patchCache.getSize(); - total += fontRenderer.getFontRendererSize(GL_ALPHA); - total += fontRenderer.getFontRendererSize(GL_RGBA); + total += fontRenderer.getSize(); log.appendFormat("Total memory usage:\n"); log.appendFormat(" %d bytes, %.2f MB\n", total, total / 1024.0f / 1024.0f); + +#ifdef BUGREPORT_FONT_CACHE_USAGE + fontRenderer.getFontRenderer().historyTracker().dump(log); +#endif } /////////////////////////////////////////////////////////////////////////////// diff --git a/libs/hwui/FontRenderer.cpp b/libs/hwui/FontRenderer.cpp index 276c18d0d3f9e9777eed539ee284ef72afedb6b3..681cf55066b4e2bed3bab26561c640d5649d402f 100644 --- a/libs/hwui/FontRenderer.cpp +++ b/libs/hwui/FontRenderer.cpp @@ -168,10 +168,17 @@ void FontRenderer::flushAllAndInvalidate() { for (uint32_t i = 0; i < mACacheTextures.size(); i++) { mACacheTextures[i]->init(); + +#ifdef BUGREPORT_FONT_CACHE_USAGE + mHistoryTracker.glyphsCleared(mACacheTextures[i]); +#endif } for (uint32_t i = 0; i < mRGBACacheTextures.size(); i++) { mRGBACacheTextures[i]->init(); +#ifdef BUGREPORT_FONT_CACHE_USAGE + mHistoryTracker.glyphsCleared(mRGBACacheTextures[i]); +#endif } mDrawn = false; @@ -183,6 +190,9 @@ void FontRenderer::flushLargeCaches(std::vector& cacheTextures) { CacheTexture* cacheTexture = cacheTextures[i]; if (cacheTexture->getPixelBuffer()) { cacheTexture->init(); +#ifdef BUGREPORT_FONT_CACHE_USAGE + mHistoryTracker.glyphsCleared(cacheTexture); +#endif LruCache::Iterator it(mActiveFonts); while (it.next()) { it.value()->invalidateTextureCache(cacheTexture); @@ -385,6 +395,10 @@ void FontRenderer::cacheBitmap(const SkGlyph& glyph, CachedGlyphInfo* cachedGlyp } cachedGlyph->mIsValid = true; + +#ifdef BUGREPORT_FONT_CACHE_USAGE + mHistoryTracker.glyphUploaded(cacheTexture, startX, startY, glyph.fWidth, glyph.fHeight); +#endif } CacheTexture* FontRenderer::createCacheTexture(int width, int height, GLenum format, @@ -747,19 +761,68 @@ static uint32_t calculateCacheSize(const std::vector& cacheTextur return size; } -uint32_t FontRenderer::getCacheSize(GLenum format) const { +static uint32_t calculateFreeCacheSize(const std::vector& cacheTextures) { + uint32_t size = 0; + for (uint32_t i = 0; i < cacheTextures.size(); i++) { + CacheTexture* cacheTexture = cacheTextures[i]; + if (cacheTexture && cacheTexture->getPixelBuffer()) { + size += cacheTexture->calculateFreeMemory(); + } + } + return size; +} + +const std::vector& FontRenderer::cacheTexturesForFormat(GLenum format) const { switch (format) { case GL_ALPHA: { - return calculateCacheSize(mACacheTextures); + return mACacheTextures; } case GL_RGBA: { - return calculateCacheSize(mRGBACacheTextures); + return mRGBACacheTextures; } default: { - return 0; + LOG_ALWAYS_FATAL("Unsupported format: %d", format); + // Impossible to hit this, but the compiler doesn't know that + return *(new std::vector()); } } } +static void dumpTextures(String8& log, const char* tag, + const std::vector& cacheTextures) { + for (uint32_t i = 0; i < cacheTextures.size(); i++) { + CacheTexture* cacheTexture = cacheTextures[i]; + if (cacheTexture && cacheTexture->getPixelBuffer()) { + uint32_t free = cacheTexture->calculateFreeMemory(); + uint32_t total = cacheTexture->getPixelBuffer()->getSize(); + log.appendFormat(" %-4s texture %d %8d / %8d\n", tag, i, total - free, total); + } + } +} + +void FontRenderer::dumpMemoryUsage(String8& log) const { + const uint32_t sizeA8 = getCacheSize(GL_ALPHA); + const uint32_t usedA8 = sizeA8 - getFreeCacheSize(GL_ALPHA); + const uint32_t sizeRGBA = getCacheSize(GL_RGBA); + const uint32_t usedRGBA = sizeRGBA - getFreeCacheSize(GL_RGBA); + log.appendFormat(" FontRenderer A8 %8d / %8d\n", usedA8, sizeA8); + dumpTextures(log, "A8", cacheTexturesForFormat(GL_ALPHA)); + log.appendFormat(" FontRenderer RGBA %8d / %8d\n", usedRGBA, sizeRGBA); + dumpTextures(log, "RGBA", cacheTexturesForFormat(GL_RGBA)); + log.appendFormat(" FontRenderer total %8d / %8d\n", usedA8 + usedRGBA, sizeA8 + sizeRGBA); +} + +uint32_t FontRenderer::getCacheSize(GLenum format) const { + return calculateCacheSize(cacheTexturesForFormat(format)); +} + +uint32_t FontRenderer::getFreeCacheSize(GLenum format) const { + return calculateFreeCacheSize(cacheTexturesForFormat(format)); +} + +uint32_t FontRenderer::getSize() const { + return getCacheSize(GL_ALPHA) + getCacheSize(GL_RGBA); +} + }; // namespace uirenderer }; // namespace android diff --git a/libs/hwui/FontRenderer.h b/libs/hwui/FontRenderer.h index e10a81b8ccd8a823860cfb548c48a639c66f7b6a..504dce862f713d10785574710b409f918edcc89f 100644 --- a/libs/hwui/FontRenderer.h +++ b/libs/hwui/FontRenderer.h @@ -21,8 +21,12 @@ #include "font/CacheTexture.h" #include "font/CachedGlyphInfo.h" #include "font/Font.h" +#ifdef BUGREPORT_FONT_CACHE_USAGE +#include "font/FontCacheHistoryTracker.h" +#endif #include +#include #include #include @@ -132,7 +136,12 @@ public: mLinearFiltering = linearFiltering; } - uint32_t getCacheSize(GLenum format) const; + uint32_t getSize() const; + void dumpMemoryUsage(String8& log) const; + +#ifdef BUGREPORT_FONT_CACHE_USAGE + FontCacheHistoryTracker& historyTracker() { return mHistoryTracker; } +#endif private: friend class Font; @@ -175,6 +184,10 @@ private: mUploadTexture = true; } + const std::vector& cacheTexturesForFormat(GLenum format) const; + uint32_t getCacheSize(GLenum format) const; + uint32_t getFreeCacheSize(GLenum format) const; + uint32_t mSmallCacheWidth; uint32_t mSmallCacheHeight; uint32_t mLargeCacheWidth; @@ -199,6 +212,10 @@ private: bool mLinearFiltering; +#ifdef BUGREPORT_FONT_CACHE_USAGE + FontCacheHistoryTracker mHistoryTracker; +#endif + #ifdef ANDROID_ENABLE_RENDERSCRIPT // RS constructs RSC::sp mRs; diff --git a/libs/hwui/FrameBuilder.cpp b/libs/hwui/FrameBuilder.cpp index 37d9d0e749e6d1510c8d40498d338f2c1b119514..7524ba0dcea61b384dbf8b1332744f35393f0ab0 100644 --- a/libs/hwui/FrameBuilder.cpp +++ b/libs/hwui/FrameBuilder.cpp @@ -591,7 +591,7 @@ void FrameBuilder::deferArcOp(const ArcOp& op) { } static bool hasMergeableClip(const BakedOpState& state) { - return state.computedState.clipState + return !state.computedState.clipState || state.computedState.clipState->mode == ClipMode::Rectangle; } diff --git a/libs/hwui/GammaFontRenderer.h b/libs/hwui/GammaFontRenderer.h index 5813e7f717ee628227b684d5568f3eb9e962a699..bd27a1a720609d3348e830cc82e4933eaad3c6e7 100644 --- a/libs/hwui/GammaFontRenderer.h +++ b/libs/hwui/GammaFontRenderer.h @@ -22,6 +22,8 @@ #include +#include + namespace android { namespace uirenderer { @@ -46,8 +48,16 @@ public: return *mRenderer; } - uint32_t getFontRendererSize(GLenum format) const { - return mRenderer ? mRenderer->getCacheSize(format) : 0; + void dumpMemoryUsage(String8& log) const { + if (mRenderer) { + mRenderer->dumpMemoryUsage(log); + } else { + log.appendFormat("FontRenderer doesn't exist.\n"); + } + } + + uint32_t getSize() const { + return mRenderer ? mRenderer->getSize() : 0; } void endPrecaching(); diff --git a/libs/hwui/PropertyValuesAnimatorSet.cpp b/libs/hwui/PropertyValuesAnimatorSet.cpp index 38fb70a92e4314b7faf67a17dc93d1e0ee86450f..e3258e3c1a48f7e23f29210a83a6326ae3f81945 100644 --- a/libs/hwui/PropertyValuesAnimatorSet.cpp +++ b/libs/hwui/PropertyValuesAnimatorSet.cpp @@ -46,8 +46,17 @@ PropertyValuesAnimatorSet::PropertyValuesAnimatorSet() void PropertyValuesAnimatorSet::onFinished(BaseRenderNodeAnimator* animator) { if (mOneShotListener.get()) { - mOneShotListener->onAnimationFinished(animator); + sp listener = std::move(mOneShotListener); + // Set the listener to nullptr before the onAnimationFinished callback, rather than after, + // for two reasons: + // 1) We need to prevent changes to mOneShotListener during the onAnimationFinished + // callback (specifically in AnimationListenerBridge::onAnimationFinished(...) from + // triggering dtor of the bridge and potentially unsafely re-entering + // AnimationListenerBridge::onAnimationFinished(...). + // 2) It's possible that there are changes to the listener during the callback, therefore + // we need to reset the listener before the callback rather than afterwards. mOneShotListener = nullptr; + listener->onAnimationFinished(animator); } } diff --git a/libs/hwui/Readback.cpp b/libs/hwui/Readback.cpp index 55f823dfe2264a1bc8a503462682616e9f72818c..0ab247dc80529be0ec7c9591e489ac89645506de 100644 --- a/libs/hwui/Readback.cpp +++ b/libs/hwui/Readback.cpp @@ -136,7 +136,7 @@ CopyResult Readback::copySurfaceInto(renderthread::RenderThread& renderThread, EGL_NATIVE_BUFFER_ANDROID, clientBuffer, attrs); if (sourceImage == EGL_NO_IMAGE_KHR) { - ALOGW("Error creating image (%#x)", eglGetError()); + ALOGW("eglCreateImageKHR failed (%#x)", eglGetError()); return CopyResult::UnknownError; } GLuint sourceTexId; @@ -147,7 +147,8 @@ CopyResult Readback::copySurfaceInto(renderthread::RenderThread& renderThread, GLenum status = GL_NO_ERROR; while ((status = glGetError()) != GL_NO_ERROR) { - ALOGW("Error creating image (%#x)", status); + ALOGW("glEGLImageTargetTexture2DOES failed (%#x)", status); + eglDestroyImageKHR(display, sourceImage); return CopyResult::UnknownError; } @@ -183,6 +184,13 @@ CopyResult Readback::copySurfaceInto(renderthread::RenderThread& renderThread, caches.textureState().deleteTexture(texture); renderState.deleteFramebuffer(fbo); + sourceTexture.deleteTexture(); + // All we're flushing & finishing is the deletion of the texture since + // copyTextureInto already did a major flush & finish as an implicit + // part of glReadPixels, so this shouldn't pose any major stalls. + glFinish(); + eglDestroyImageKHR(display, sourceImage); + GL_CHECKPOINT(MODERATE); return CopyResult::Success; diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp index ce67554645d1321825ee5e77b88061b741698a42..c7289fce1fbf667ac277fae803898aabd07ee3f4 100644 --- a/libs/hwui/SkiaCanvas.cpp +++ b/libs/hwui/SkiaCanvas.cpp @@ -329,9 +329,10 @@ void SkiaCanvas::restoreToCount(int restoreCount) { static inline SkCanvas::SaveLayerFlags layerFlags(SaveFlags::Flags flags) { SkCanvas::SaveLayerFlags layerFlags = 0; - if (!(flags & SaveFlags::HasAlphaLayer)) { - layerFlags |= SkCanvas::kIsOpaque_SaveLayerFlag; - } + // We intentionally ignore the SaveFlags::HasAlphaLayer and + // SkCanvas::kIsOpaque_SaveLayerFlag flags because HWUI ignores it + // and our Android client may use it incorrectly. + // In Skia, this flag is purely for performance optimization. if (!(flags & SaveFlags::ClipToLayer)) { layerFlags |= SkCanvas::kDontClipToLayer_Legacy_SaveLayerFlag; diff --git a/libs/hwui/SpotShadow.cpp b/libs/hwui/SpotShadow.cpp index 760d814f27a8c45dec1515e91f164f076b9e6b85..cc96a137c3064573a09b514361692dc0e630db27 100644 --- a/libs/hwui/SpotShadow.cpp +++ b/libs/hwui/SpotShadow.cpp @@ -942,9 +942,13 @@ void SpotShadow::generateTriangleStrip(bool isCasterOpaque, float shadowStrength AlphaVertex::set(&shadowVertices[vertexBufferIndex++], newPenumbra[i].x, newPenumbra[i].y, PENUMBRA_ALPHA); } + // Since the umbra can be a faked one when the occluder is too high, the umbra should be lighter + // in this case. + float scaledUmbraAlpha = UMBRA_ALPHA * shadowStrengthScale; + for (int i = 0; i < umbraLength; i++) { AlphaVertex::set(&shadowVertices[vertexBufferIndex++], umbra[i].x, umbra[i].y, - UMBRA_ALPHA); + scaledUmbraAlpha); } for (int i = 0; i < verticesPairIndex; i++) { @@ -984,14 +988,14 @@ void SpotShadow::generateTriangleStrip(bool isCasterOpaque, float shadowStrength indexBuffer[indexBufferIndex++] = newPenumbraLength + i; indexBuffer[indexBufferIndex++] = vertexBufferIndex; AlphaVertex::set(&shadowVertices[vertexBufferIndex++], - closerVertex.x, closerVertex.y, UMBRA_ALPHA); + closerVertex.x, closerVertex.y, scaledUmbraAlpha); } } else { // If there is no occluded umbra at all, then draw the triangle fan // starting from the centroid to all umbra vertices. int lastCentroidIndex = vertexBufferIndex; AlphaVertex::set(&shadowVertices[vertexBufferIndex++], centroid.x, - centroid.y, UMBRA_ALPHA); + centroid.y, scaledUmbraAlpha); for (int i = 0; i < umbraLength; i++) { indexBuffer[indexBufferIndex++] = newPenumbraLength + i; indexBuffer[indexBufferIndex++] = lastCentroidIndex; diff --git a/libs/hwui/VectorDrawable.cpp b/libs/hwui/VectorDrawable.cpp index 2b7994139641009068779d28eed96722416c535c..aeee66106fb347f92f50f36f54c66823980f2c96 100644 --- a/libs/hwui/VectorDrawable.cpp +++ b/libs/hwui/VectorDrawable.cpp @@ -202,7 +202,9 @@ void FullPath::drawPath(SkCanvas* outCanvas, SkPath& renderPath, float strokeSca if (properties.getFillGradient() != nullptr) { paint.setColor(applyAlpha(SK_ColorBLACK, properties.getFillAlpha())); SkShader* newShader = properties.getFillGradient()->newWithLocalMatrix(matrix); - paint.setShader(newShader); + // newWithLocalMatrix(...) creates a new SkShader and returns a bare pointer. We need to + // remove the extra ref so that the ref count is correctly managed. + paint.setShader(newShader)->unref(); needsFill = true; } else if (properties.getFillColor() != SK_ColorTRANSPARENT) { paint.setColor(applyAlpha(properties.getFillColor(), properties.getFillAlpha())); @@ -222,7 +224,9 @@ void FullPath::drawPath(SkCanvas* outCanvas, SkPath& renderPath, float strokeSca if (properties.getStrokeGradient() != nullptr) { paint.setColor(applyAlpha(SK_ColorBLACK, properties.getStrokeAlpha())); SkShader* newShader = properties.getStrokeGradient()->newWithLocalMatrix(matrix); - paint.setShader(newShader); + // newWithLocalMatrix(...) creates a new SkShader and returns a bare pointer. We need to + // remove the extra ref so that the ref count is correctly managed. + paint.setShader(newShader)->unref(); needsStroke = true; } else if (properties.getStrokeColor() != SK_ColorTRANSPARENT) { paint.setColor(applyAlpha(properties.getStrokeColor(), properties.getStrokeAlpha())); diff --git a/libs/hwui/font/CacheTexture.cpp b/libs/hwui/font/CacheTexture.cpp index fcdde45c49f2e378c3d7b36be27a23b708ab3452..49e9f65582ae69a21589ebec5f04956d7f8c505f 100644 --- a/libs/hwui/font/CacheTexture.cpp +++ b/libs/hwui/font/CacheTexture.cpp @@ -330,5 +330,17 @@ bool CacheTexture::fitBitmap(const SkGlyph& glyph, uint32_t* retOriginX, uint32_ return false; } +uint32_t CacheTexture::calculateFreeMemory() const { + CacheBlock* cacheBlock = mCacheBlocks; + uint32_t free = 0; + // currently only two formats are supported: GL_ALPHA or GL_RGBA; + uint32_t bpp = mFormat == GL_RGBA ? 4 : 1; + while (cacheBlock) { + free += bpp * cacheBlock->mWidth * cacheBlock->mHeight; + cacheBlock = cacheBlock->mNext; + } + return free; +} + }; // namespace uirenderer }; // namespace android diff --git a/libs/hwui/font/CacheTexture.h b/libs/hwui/font/CacheTexture.h index 4dfb41dafcc7041bc601817614b1d98abbb8f96d..6750a8ae11cf824b1c407abe13d7feab602e4260 100644 --- a/libs/hwui/font/CacheTexture.h +++ b/libs/hwui/font/CacheTexture.h @@ -178,6 +178,8 @@ public: return mCurrentQuad == mMaxQuadCount; } + uint32_t calculateFreeMemory() const; + private: void setDirty(bool dirty); diff --git a/libs/hwui/font/Font.cpp b/libs/hwui/font/Font.cpp index 8e04c8715f62a37d5dbe243b5610b499d557ce6e..a95454a4c0101bff5a8d3c3d8ad536b6f50f6c9c 100644 --- a/libs/hwui/font/Font.cpp +++ b/libs/hwui/font/Font.cpp @@ -408,9 +408,15 @@ void Font::render(const SkPaint* paint, const glyph_t* glyphs, if (cachedGlyph->mIsValid && cachedGlyph->mCacheTexture) { int penX = x + (int) roundf(positions[(glyphsCount << 1)]); int penY = y + (int) roundf(positions[(glyphsCount << 1) + 1]); - +#ifdef BUGREPORT_FONT_CACHE_USAGE + mState->historyTracker().glyphRendered(cachedGlyph, penX, penY); +#endif (*this.*render)(cachedGlyph, penX, penY, bitmap, bitmapW, bitmapH, bounds, positions); + } else { +#ifdef BUGREPORT_FONT_CACHE_USAGE + mState->historyTracker().glyphRendered(cachedGlyph, -1, -1); +#endif } glyphsCount++; diff --git a/libs/hwui/font/FontCacheHistoryTracker.cpp b/libs/hwui/font/FontCacheHistoryTracker.cpp new file mode 100644 index 0000000000000000000000000000000000000000..a2bfb27535e521497f3281cded0519a84843aeac --- /dev/null +++ b/libs/hwui/font/FontCacheHistoryTracker.cpp @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2016 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. + */ + +#include "FontCacheHistoryTracker.h" + +#include "CachedGlyphInfo.h" +#include "CacheTexture.h" + +namespace android { +namespace uirenderer { + +void FontCacheHistoryTracker::dumpCachedGlyph(String8& log, const CachedGlyph& glyph) { + log.appendFormat("glyph (texture %p, position: (%d, %d), size: %dx%d, gen: %d)", glyph.texture, + glyph.startX, glyph.startY, glyph.bitmapW, glyph.bitmapH, glyph.generation); +} + +void FontCacheHistoryTracker::dumpRenderEntry(String8& log, const RenderEntry& entry) { + if (entry.penX == -1 && entry.penY == -1) { + log.appendFormat(" glyph skipped in gen: %d\n", entry.glyph.generation); + } else { + log.appendFormat(" rendered "); + dumpCachedGlyph(log, entry.glyph); + log.appendFormat(" at (%d, %d)\n", entry.penX, entry.penY); + } +} + +void FontCacheHistoryTracker::dumpUploadEntry(String8& log, const CachedGlyph& glyph) { + if (glyph.bitmapW == 0 && glyph.bitmapH == 0) { + log.appendFormat(" cleared cachetexture %p in gen %d\n", glyph.texture, + glyph.generation); + } else { + log.appendFormat(" uploaded "); + dumpCachedGlyph(log, glyph); + log.appendFormat("\n"); + } +} + +void FontCacheHistoryTracker::dump(String8& log) const { + log.appendFormat("FontCacheHistory: \n"); + log.appendFormat(" Upload history: \n"); + for (size_t i = 0; i < mUploadHistory.size(); i++) { + dumpUploadEntry(log, mUploadHistory[i]); + } + log.appendFormat(" Render history: \n"); + for (size_t i = 0; i < mRenderHistory.size(); i++) { + dumpRenderEntry(log, mRenderHistory[i]); + } +} + +void FontCacheHistoryTracker::glyphRendered(CachedGlyphInfo* glyphInfo, int penX, int penY) { + RenderEntry& entry = mRenderHistory.next(); + entry.glyph.generation = generation; + entry.glyph.texture = glyphInfo->mCacheTexture; + entry.glyph.startX = glyphInfo->mStartX; + entry.glyph.startY = glyphInfo->mStartY; + entry.glyph.bitmapW = glyphInfo->mBitmapWidth; + entry.glyph.bitmapH = glyphInfo->mBitmapHeight; + entry.penX = penX; + entry.penY = penY; +} + +void FontCacheHistoryTracker::glyphUploaded(CacheTexture* texture, uint32_t x, uint32_t y, + uint16_t glyphW, uint16_t glyphH) { + CachedGlyph& glyph = mUploadHistory.next(); + glyph.generation = generation; + glyph.texture = texture; + glyph.startX = x; + glyph.startY = y; + glyph.bitmapW = glyphW; + glyph.bitmapH = glyphH; +} + +void FontCacheHistoryTracker::glyphsCleared(CacheTexture* texture) { + CachedGlyph& glyph = mUploadHistory.next(); + glyph.generation = generation; + glyph.texture = texture; + glyph.startX = 0; + glyph.startY = 0; + glyph.bitmapW = 0; + glyph.bitmapH = 0; +} + +void FontCacheHistoryTracker::frameCompleted() { + generation++; +} +}; // namespace uirenderer +}; // namespace android diff --git a/libs/hwui/font/FontCacheHistoryTracker.h b/libs/hwui/font/FontCacheHistoryTracker.h new file mode 100644 index 0000000000000000000000000000000000000000..f1d9b9f10dc03555c6e4877d65b8cd07d6286b13 --- /dev/null +++ b/libs/hwui/font/FontCacheHistoryTracker.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2016 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. + */ + +#pragma once +#include "../utils/RingBuffer.h" + +#include + +namespace android { +namespace uirenderer { + +class CacheTexture; +struct CachedGlyphInfo; + +// Tracks glyph uploads and recent rendered/skipped glyphs, so it can give an idea +// what a missing character is: skipped glyph, wrong coordinates in cache texture etc. +class FontCacheHistoryTracker { +public: + void glyphRendered(CachedGlyphInfo*, int penX, int penY); + void glyphUploaded(CacheTexture*, uint32_t x, uint32_t y, uint16_t glyphW, uint16_t glyphH); + void glyphsCleared(CacheTexture*); + void frameCompleted(); + + void dump(String8& log) const; +private: + struct CachedGlyph { + void* texture; + uint16_t generation; + uint16_t startX; + uint16_t startY; + uint16_t bitmapW; + uint16_t bitmapH; + }; + + struct RenderEntry { + CachedGlyph glyph; + int penX; + int penY; + }; + + static void dumpCachedGlyph(String8& log, const CachedGlyph& glyph); + static void dumpRenderEntry(String8& log, const RenderEntry& entry); + static void dumpUploadEntry(String8& log, const CachedGlyph& glyph); + + RingBuffer mRenderHistory; + RingBuffer mUploadHistory; + uint16_t generation = 0; +}; + +}; // namespace uirenderer +}; // namespace android \ No newline at end of file diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index dcaec428449c37c77b2700178c13cd77a0c7ab90..975ac8368e3def4be09045642b56d8c595c675ed 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -608,6 +608,10 @@ void CanvasContext::draw() { } GpuMemoryTracker::onFrameCompleted(); +#ifdef BUGREPORT_FONT_CACHE_USAGE + caches.fontRenderer.getFontRenderer().historyTracker().frameCompleted(); +#endif + } // Called by choreographer to do an RT-driven animation @@ -633,6 +637,9 @@ void CanvasContext::prepareAndDraw(RenderNode* node) { prepareTree(info, frameInfo, systemTime(CLOCK_MONOTONIC), node); if (info.out.canDrawThisFrame) { draw(); + } else { + // wait on fences so tasks don't overlap next frame + waitOnFences(); } } diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h index 3eef29b24473b4adee2398d75c2883557380940d..e1821751b57fea2a12fbb1e2b295635e76f3c6e5 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -168,6 +168,8 @@ public: ANDROID_API int64_t getFrameNumber(); + void waitOnFences(); + private: friend class RegisterFrameCallbackTask; // TODO: Replace with something better for layer & other GL object @@ -178,8 +180,6 @@ private: void freePrefetchedLayers(TreeObserver* observer); - void waitOnFences(); - bool isSwapChainStuffed(); EGLint mLastFrameWidth = 0; diff --git a/libs/hwui/renderthread/DrawFrameTask.cpp b/libs/hwui/renderthread/DrawFrameTask.cpp index c9c07b3df292c72b770c0f18b0787b83a5d69801..e3b6dc6fd9fee88ecfc9708c664270a6af3a9677 100644 --- a/libs/hwui/renderthread/DrawFrameTask.cpp +++ b/libs/hwui/renderthread/DrawFrameTask.cpp @@ -104,6 +104,9 @@ void DrawFrameTask::run() { if (CC_LIKELY(canDrawThisFrame)) { context->draw(); + } else { + // wait on fences so tasks don't overlap next frame + context->waitOnFences(); } if (!canUnblockUiThread) { diff --git a/libs/hwui/tests/unit/FrameBuilderTests.cpp b/libs/hwui/tests/unit/FrameBuilderTests.cpp index 53dbede2f8e1e07ec40d41f566630503e65c3bd0..e2dc3a0a2c66e3d4b601a0997ea38036c5db0567 100644 --- a/libs/hwui/tests/unit/FrameBuilderTests.cpp +++ b/libs/hwui/tests/unit/FrameBuilderTests.cpp @@ -477,6 +477,35 @@ RENDERTHREAD_TEST(FrameBuilder, clippedMerging) { EXPECT_EQ(4, renderer.getIndex()); } +RENDERTHREAD_TEST(FrameBuilder, regionClipStopsMerge) { + class RegionClipStopsMergeTestRenderer : public TestRendererBase { + public: + void onTextOp(const TextOp& op, const BakedOpState& state) override { mIndex++; } + }; + auto node = TestUtils::createNode(0, 0, 400, 400, + [](RenderProperties& props, TestCanvas& canvas) { + SkPath path; + path.addCircle(200, 200, 200, SkPath::kCW_Direction); + canvas.save(SaveFlags::MatrixClip); + canvas.clipPath(&path, SkRegion::kIntersect_Op); + SkPaint paint; + paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); + paint.setAntiAlias(true); + paint.setTextSize(50); + TestUtils::drawUtf8ToCanvas(&canvas, "Test string1", paint, 100, 100); + TestUtils::drawUtf8ToCanvas(&canvas, "Test string1", paint, 100, 200); + canvas.restore(); + }); + + FrameBuilder frameBuilder(SkRect::MakeWH(400, 400), 400, 400, + sLightGeometry, Caches::getInstance()); + frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node)); + + RegionClipStopsMergeTestRenderer renderer; + frameBuilder.replayBakedOps(renderer); + EXPECT_EQ(2, renderer.getIndex()); +} + RENDERTHREAD_TEST(FrameBuilder, textMerging) { class TextMergingTestRenderer : public TestRendererBase { public: diff --git a/libs/hwui/tests/unit/VectorDrawableTests.cpp b/libs/hwui/tests/unit/VectorDrawableTests.cpp index 83b485fa705e8b8f4fb012173998d408cac009ac..8e0d3ee572a6888d38280887bd25da8ab5c18f2a 100644 --- a/libs/hwui/tests/unit/VectorDrawableTests.cpp +++ b/libs/hwui/tests/unit/VectorDrawableTests.cpp @@ -426,5 +426,49 @@ TEST(VectorDrawable, groupProperties) { EXPECT_EQ(1.0f, properties->getPivotY()); } + +static SkShader* createShader(bool* isDestroyed) { + class TestShader : public SkShader { + public: + TestShader(bool* isDestroyed) : SkShader(), mDestroyed(isDestroyed) { + } + ~TestShader() { + *mDestroyed = true; + } + + Factory getFactory() const override { return nullptr; } + private: + bool* mDestroyed; + }; + return new TestShader(isDestroyed); +} + +TEST(VectorDrawable, drawPathWithoutIncrementingShaderRefCount) { + VectorDrawable::FullPath path("m1 1", 4); + SkBitmap bitmap; + SkImageInfo info = SkImageInfo::Make(5, 5, kN32_SkColorType, kPremul_SkAlphaType); + bitmap.setInfo(info); + bitmap.allocPixels(info); + SkCanvas canvas(bitmap); + + bool shaderIsDestroyed = false; + + // Initial ref count is 1 + SkShader* shader = createShader(&shaderIsDestroyed); + + // Setting the fill gradient increments the ref count of the shader by 1 + path.mutateStagingProperties()->setFillGradient(shader); + path.draw(&canvas, SkMatrix::I(), 1.0f, 1.0f, true); + // Resetting the fill gradient decrements the ref count of the shader by 1 + path.mutateStagingProperties()->setFillGradient(nullptr); + + // Expect ref count to be 1 again, i.e. nothing else to have a ref to the shader now. Unref() + // again should bring the ref count to zero and consequently trigger detor. + shader->unref(); + + // Verify that detor is called. + EXPECT_TRUE(shaderIsDestroyed); +} + }; // namespace uirenderer }; // namespace android diff --git a/libs/input/PointerController.cpp b/libs/input/PointerController.cpp index 27193b74337964b4559c40199b711dfd681211b1..abef66f9ecd9f13f13baa00e196b9ac114b13fbb 100644 --- a/libs/input/PointerController.cpp +++ b/libs/input/PointerController.cpp @@ -36,6 +36,29 @@ namespace android { +// --- WeakLooperCallback --- + +class WeakLooperCallback: public LooperCallback { +protected: + virtual ~WeakLooperCallback() { } + +public: + WeakLooperCallback(const wp& callback) : + mCallback(callback) { + } + + virtual int handleEvent(int fd, int events, void* data) { + sp callback = mCallback.promote(); + if (callback != NULL) { + return callback->handleEvent(fd, events, data); + } + return 0; // the client is gone, remove the callback + } + +private: + wp mCallback; +}; + // --- PointerController --- // Time to wait before starting the fade when the pointer is inactive. @@ -57,10 +80,11 @@ PointerController::PointerController(const sp& const sp& looper, const sp& spriteController) : mPolicy(policy), mLooper(looper), mSpriteController(spriteController) { mHandler = new WeakMessageHandler(this); + mCallback = new WeakLooperCallback(this); if (mDisplayEventReceiver.initCheck() == NO_ERROR) { mLooper->addFd(mDisplayEventReceiver.getFd(), Looper::POLL_CALLBACK, - Looper::EVENT_INPUT, this, nullptr); + Looper::EVENT_INPUT, mCallback, nullptr); } else { ALOGE("Failed to initialize DisplayEventReceiver."); } diff --git a/libs/input/PointerController.h b/libs/input/PointerController.h index 99292d7ca8a6c5acd17fa514666d0e0ea2ffdc61..4794f3da824ccb41d68bf8b07182ddc34154ed02 100644 --- a/libs/input/PointerController.h +++ b/libs/input/PointerController.h @@ -144,6 +144,7 @@ private: sp mLooper; sp mSpriteController; sp mHandler; + sp mCallback; DisplayEventReceiver mDisplayEventReceiver; diff --git a/location/java/android/location/Address.java b/location/java/android/location/Address.java index b152f48a3e9e0dfcfc03c155840cc314a7d9ce26..335ad5ebcde5d80b1bb36bf3e5802356b0a94022 100644 --- a/location/java/android/location/Address.java +++ b/location/java/android/location/Address.java @@ -28,7 +28,7 @@ import android.os.Parcelable; /** * A class representing an Address, i.e, a set of Strings describing a location. * - * The addres format is a simplified version of xAL (eXtensible Address Language) + * The address format is a simplified version of xAL (eXtensible Address Language) * http://www.oasis-open.org/committees/ciq/ciq.html#6 */ public class Address implements Parcelable { diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java index eae966405deb34898c2b8865e0aa076075d9c236..1ad7618d0a5d779885a739522daffffe084f3693 100644 --- a/location/java/android/location/LocationManager.java +++ b/location/java/android/location/LocationManager.java @@ -1479,7 +1479,7 @@ public class LocationManager { mGpsNmeaListener = null; mNmeaBuffer = null; mOldGnssCallback = null; - mGnssCallback = new GnssStatus.Callback() { + mGnssCallback = mGpsListener != null ? new GnssStatus.Callback() { @Override public void onStarted() { mGpsListener.onGpsStatusChanged(GpsStatus.GPS_EVENT_STARTED); @@ -1499,7 +1499,7 @@ public class LocationManager { public void onSatelliteStatusChanged(GnssStatus status) { mGpsListener.onGpsStatusChanged(GpsStatus.GPS_EVENT_SATELLITE_STATUS); } - }; + } : null; mOldGnssNmeaListener = null; mGnssNmeaListener = null; } @@ -1516,12 +1516,12 @@ public class LocationManager { mOldGnssCallback = null; mGnssCallback = null; mOldGnssNmeaListener = null; - mGnssNmeaListener = new OnNmeaMessageListener() { + mGnssNmeaListener = mGpsNmeaListener != null ? new OnNmeaMessageListener() { @Override public void onNmeaMessage(String nmea, long timestamp) { mGpsNmeaListener.onNmeaReceived(timestamp, nmea); } - }; + } : null; } GnssStatusListenerTransport(GnssStatusCallback callback) { @@ -1530,7 +1530,7 @@ public class LocationManager { GnssStatusListenerTransport(GnssStatusCallback callback, Handler handler) { mOldGnssCallback = callback; - mGnssCallback = new GnssStatus.Callback() { + mGnssCallback = mOldGnssCallback != null ? new GnssStatus.Callback() { @Override public void onStarted() { mOldGnssCallback.onStarted(); @@ -1550,7 +1550,7 @@ public class LocationManager { public void onSatelliteStatusChanged(GnssStatus status) { mOldGnssCallback.onSatelliteStatusChanged(status); } - }; + } : null; mGnssHandler = new GnssHandler(handler); mOldGnssNmeaListener = null; mGnssNmeaListener = null; @@ -1583,12 +1583,12 @@ public class LocationManager { mOldGnssCallback = null; mGnssHandler = new GnssHandler(handler); mOldGnssNmeaListener = listener; - mGnssNmeaListener = new OnNmeaMessageListener() { + mGnssNmeaListener = mOldGnssNmeaListener != null ? new OnNmeaMessageListener() { @Override public void onNmeaMessage(String message, long timestamp) { mOldGnssNmeaListener.onNmeaReceived(timestamp, message); } - }; + } : null; mGpsListener = null; mGpsNmeaListener = null; mNmeaBuffer = new ArrayList(); @@ -1611,7 +1611,7 @@ public class LocationManager { @Override public void onGnssStarted() { - if (mGpsListener != null) { + if (mGnssCallback != null) { Message msg = Message.obtain(); msg.what = GpsStatus.GPS_EVENT_STARTED; mGnssHandler.sendMessage(msg); @@ -1620,7 +1620,7 @@ public class LocationManager { @Override public void onGnssStopped() { - if (mGpsListener != null) { + if (mGnssCallback != null) { Message msg = Message.obtain(); msg.what = GpsStatus.GPS_EVENT_STOPPED; mGnssHandler.sendMessage(msg); @@ -1629,7 +1629,7 @@ public class LocationManager { @Override public void onFirstFix(int ttff) { - if (mGpsListener != null) { + if (mGnssCallback != null) { mTimeToFirstFix = ttff; Message msg = Message.obtain(); msg.what = GpsStatus.GPS_EVENT_FIRST_FIX; diff --git a/media/java/android/media/AudioAttributes.java b/media/java/android/media/AudioAttributes.java index 5286f8fa5ad31bbbda6c1c7b0a1f7a51ee9207b3..89709ee6b95a147800e02a690308a519a16514cc 100644 --- a/media/java/android/media/AudioAttributes.java +++ b/media/java/android/media/AudioAttributes.java @@ -24,6 +24,7 @@ import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; import android.util.Log; +import android.util.SparseIntArray; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -169,6 +170,66 @@ public final class AudioAttributes implements Parcelable { */ public final static int USAGE_VIRTUAL_SOURCE = 15; + /** + * IMPORTANT: when adding new usage types, add them to SDK_USAGES and update SUPPRESSIBLE_USAGES + * if applicable. + */ + + /** + * @hide + * Denotes a usage for notifications that do not expect immediate intervention from the user, + * will be muted when the Zen mode disables notifications + * @see #SUPPRESSIBLE_USAGES + */ + public final static int SUPPRESSIBLE_NOTIFICATION = 1; + /** + * @hide + * Denotes a usage for notifications that do expect immediate intervention from the user, + * will be muted when the Zen mode disables calls + * @see #SUPPRESSIBLE_USAGES + */ + public final static int SUPPRESSIBLE_CALL = 2; + + /** + * @hide + * Array of all usage types for calls and notifications to assign the suppression behavior, + * used by the Zen mode restrictions. + * @see com.android.server.notification.ZenModeHelper + */ + public static final SparseIntArray SUPPRESSIBLE_USAGES; + + static { + SUPPRESSIBLE_USAGES = new SparseIntArray(); + SUPPRESSIBLE_USAGES.put(USAGE_NOTIFICATION, SUPPRESSIBLE_NOTIFICATION); + SUPPRESSIBLE_USAGES.put(USAGE_NOTIFICATION_RINGTONE, SUPPRESSIBLE_CALL); + SUPPRESSIBLE_USAGES.put(USAGE_NOTIFICATION_COMMUNICATION_REQUEST,SUPPRESSIBLE_CALL); + SUPPRESSIBLE_USAGES.put(USAGE_NOTIFICATION_COMMUNICATION_INSTANT,SUPPRESSIBLE_NOTIFICATION); + SUPPRESSIBLE_USAGES.put(USAGE_NOTIFICATION_COMMUNICATION_DELAYED,SUPPRESSIBLE_NOTIFICATION); + SUPPRESSIBLE_USAGES.put(USAGE_NOTIFICATION_EVENT, SUPPRESSIBLE_NOTIFICATION); + } + + /** + * @hide + * Array of all usage types exposed in the SDK that applications can use. + */ + public final static int[] SDK_USAGES = { + USAGE_UNKNOWN, + USAGE_MEDIA, + USAGE_VOICE_COMMUNICATION, + USAGE_VOICE_COMMUNICATION_SIGNALLING, + USAGE_ALARM, + USAGE_NOTIFICATION, + USAGE_NOTIFICATION_RINGTONE, + USAGE_NOTIFICATION_COMMUNICATION_REQUEST, + USAGE_NOTIFICATION_COMMUNICATION_INSTANT, + USAGE_NOTIFICATION_COMMUNICATION_DELAYED, + USAGE_NOTIFICATION_EVENT, + USAGE_ASSISTANCE_ACCESSIBILITY, + USAGE_ASSISTANCE_NAVIGATION_GUIDANCE, + USAGE_ASSISTANCE_SONIFICATION, + USAGE_GAME + }; + /** * Flag defining a behavior where the audibility of the sound will be ensured by the system. */ diff --git a/media/java/android/media/ExifInterface.java b/media/java/android/media/ExifInterface.java index 56af57aa8e96278c739349ceeb6c2592296b1ea1..6f24f763d6a69f218cd3f91da694a53eba865866 100644 --- a/media/java/android/media/ExifInterface.java +++ b/media/java/android/media/ExifInterface.java @@ -1554,14 +1554,16 @@ public class ExifInterface { * copying all the data from one file to another and deleting the old file and renaming the * other. It's best to use {@link #setAttribute(String,String)} to set all attributes to write * and make a single call rather than multiple calls for each attribute. + *

          + * This method is only supported for JPEG files. + *

          */ public void saveAttributes() throws IOException { if (!mIsSupportedFile || mIsRaw) { - throw new UnsupportedOperationException( - "ExifInterface only supports saving attributes on JPEG formats."); + throw new IOException("ExifInterface only supports saving attributes on JPEG formats."); } if (mIsInputStream || (mSeekableFileDescriptor == null && mFilename == null)) { - throw new UnsupportedOperationException( + throw new IOException( "ExifInterface does not support saving attributes for the current input."); } diff --git a/media/java/android/media/ImageReader.java b/media/java/android/media/ImageReader.java index 2cbeb3a260be6c1796fe5d1a60a1474a5ea0ad09..ed718493bd7899efcb8ad889a67430e9dcf44623 100644 --- a/media/java/android/media/ImageReader.java +++ b/media/java/android/media/ImageReader.java @@ -241,6 +241,10 @@ public class ImageReader implements AutoCloseable { * same {@link Surface} can be reused with a different API once the first source is * disconnected from the {@link Surface}.

          * + *

          Please note that holding on to the Surface object returned by this method is not enough + * to keep its parent ImageReader from being reclaimed. In that sense, a Surface acts like a + * {@link java.lang.ref.WeakReference weak reference} to the ImageReader that provides it.

          + * * @return A {@link Surface} to use for a drawing target for various APIs. */ public Surface getSurface() { diff --git a/media/java/android/media/MediaExtractor.java b/media/java/android/media/MediaExtractor.java index 6f5199b6959c96e0cc252c1c887bb3722d0222b8..c8aedd09d60c81da215c4736437c52fa09825f20 100644 --- a/media/java/android/media/MediaExtractor.java +++ b/media/java/android/media/MediaExtractor.java @@ -496,6 +496,11 @@ final public class MediaExtractor { /** * Advance to the next sample. Returns false if no more sample data * is available (end of stream). + * + * When extracting a local file, the behaviors of {@link #advance} and + * {@link #readSampleData} are undefined in presence of concurrent + * writes to the same local file; more specifically, end of stream + * could be signalled earlier than expected. */ public native boolean advance(); diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java index 31c7a3249542a24f9b1b5aea4f918b2e0681ac61..e5f7527c9db2b3ce37b663f4e76f4fc3f8748e0e 100644 --- a/media/java/android/media/MediaPlayer.java +++ b/media/java/android/media/MediaPlayer.java @@ -1641,7 +1641,8 @@ public class MediaPlayer extends PlayerBase * (i.e. reaches the end of the stream). * The media framework will attempt to transition from this player to * the next as seamlessly as possible. The next player can be set at - * any time before completion. The next player must be prepared by the + * any time before completion, but shall be after setDataSource has been + * called successfully. The next player must be prepared by the * app, and the application should not call start() on it. * The next MediaPlayer must be different from 'this'. An exception * will be thrown if next == this. diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java index 101facd4909bba0f2a2ded64868a8f8c9ea219f2..79195d6de29fd6489b1f976e1a3ebef012452972 100644 --- a/media/java/android/media/MediaRouter.java +++ b/media/java/android/media/MediaRouter.java @@ -220,8 +220,7 @@ public class MediaRouter { if (mBluetoothA2dpRoute != null) { final boolean a2dpEnabled = isBluetoothA2dpOn(); - if (mainType != AudioRoutesInfo.MAIN_SPEAKER && - mSelectedRoute == mBluetoothA2dpRoute && !a2dpEnabled) { + if (mSelectedRoute == mBluetoothA2dpRoute && !a2dpEnabled) { selectRouteStatic(ROUTE_TYPE_LIVE_AUDIO, mDefaultAudioVideo, false); } else if ((mSelectedRoute == mDefaultAudioVideo || mSelectedRoute == null) && a2dpEnabled) { diff --git a/media/java/android/media/MediaScanner.java b/media/java/android/media/MediaScanner.java index 1a5e1a115067beb0a1e50351a5240e5c4162d1b7..f565af0525d0391036192b53fc5aab247a5e78ac 100644 --- a/media/java/android/media/MediaScanner.java +++ b/media/java/android/media/MediaScanner.java @@ -21,12 +21,14 @@ import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; +import android.content.SharedPreferences; import android.database.Cursor; import android.database.SQLException; import android.drm.DrmManagerClient; import android.graphics.BitmapFactory; import android.mtp.MtpConstants; import android.net.Uri; +import android.os.Build; import android.os.Environment; import android.os.RemoteException; import android.os.SystemProperties; @@ -153,6 +155,11 @@ public class MediaScanner implements AutoCloseable { private static final String MUSIC_DIR = "/music/"; private static final String PODCAST_DIR = "/podcasts/"; + public static final String SCANNED_BUILD_PREFS_NAME = "MediaScanBuild"; + public static final String LAST_INTERNAL_SCAN_FINGERPRINT = "lastScanFingerprint"; + private static final String SYSTEM_SOUNDS_DIR = "/system/media/audio"; + private static String sLastInternalScanFingerprint; + private static final String[] ID3_GENRES = { // ID3v1 Genres "Blues", @@ -402,6 +409,13 @@ public class MediaScanner implements AutoCloseable { mMediaProvider = mContext.getContentResolver() .acquireContentProviderClient(MediaStore.AUTHORITY); + if (sLastInternalScanFingerprint == null) { + final SharedPreferences scanSettings = + mContext.getSharedPreferences(SCANNED_BUILD_PREFS_NAME, Context.MODE_PRIVATE); + sLastInternalScanFingerprint = + scanSettings.getString(LAST_INTERNAL_SCAN_FINGERPRINT, new String()); + } + mAudioUri = Audio.Media.getContentUri(volumeName); mVideoUri = Video.Media.getContentUri(volumeName); mImagesUri = Images.Media.getContentUri(volumeName); @@ -585,16 +599,24 @@ public class MediaScanner implements AutoCloseable { entry.mRowId = 0; } - if (entry.mPath != null && - ((!mDefaultNotificationSet && + if (entry.mPath != null) { + if (((!mDefaultNotificationSet && doesPathHaveFilename(entry.mPath, mDefaultNotificationFilename)) || (!mDefaultRingtoneSet && doesPathHaveFilename(entry.mPath, mDefaultRingtoneFilename)) || (!mDefaultAlarmSet && doesPathHaveFilename(entry.mPath, mDefaultAlarmAlertFilename)))) { - Log.w(TAG, "forcing rescan of " + entry.mPath + - "since ringtone setting didn't finish"); - scanAlways = true; + Log.w(TAG, "forcing rescan of " + entry.mPath + + "since ringtone setting didn't finish"); + scanAlways = true; + } else if (isSystemSoundWithMetadata(entry.mPath) + && !Build.FINGERPRINT.equals(sLastInternalScanFingerprint)) { + // file is located on the system partition where the date cannot be trusted: + // rescan if the build fingerprint has changed since the last scan. + Log.i(TAG, "forcing rescan of " + entry.mPath + + " since build fingerprint changed"); + scanAlways = true; + } } // rescan for metadata if file was modified since last scan @@ -1128,6 +1150,15 @@ public class MediaScanner implements AutoCloseable { }; // end of anonymous MediaScannerClient instance + private static boolean isSystemSoundWithMetadata(String path) { + if (path.startsWith(SYSTEM_SOUNDS_DIR + ALARMS_DIR) + || path.startsWith(SYSTEM_SOUNDS_DIR + RINGTONES_DIR) + || path.startsWith(SYSTEM_SOUNDS_DIR + NOTIFICATIONS_DIR)) { + return true; + } + return false; + } + private String settingSetIndicatorName(String base) { return base + "_set"; } @@ -1252,16 +1283,6 @@ public class MediaScanner implements AutoCloseable { } } - private boolean inScanDirectory(String path, String[] directories) { - for (int i = 0; i < directories.length; i++) { - String directory = directories[i]; - if (path.startsWith(directory)) { - return true; - } - } - return false; - } - private void pruneDeadThumbnailFiles() { HashSet existingFiles = new HashSet(); String directory = "/sdcard/DCIM/.thumbnails"; diff --git a/media/java/android/media/MediaScannerConnection.java b/media/java/android/media/MediaScannerConnection.java index d71467255ff346115bc566a7198b688dbaa2d116..471fa2c4bad936facb3ecc03c9eb4a9cb40acec3 100644 --- a/media/java/android/media/MediaScannerConnection.java +++ b/media/java/android/media/MediaScannerConnection.java @@ -133,6 +133,10 @@ public class MediaScannerConnection implements ServiceConnection { } try { mContext.unbindService(this); + if (mClient instanceof ClientProxy) { + mClient = null; + } + mService = null; } catch (IllegalArgumentException ex) { if (false) { Log.v(TAG, "disconnect failed: " + ex); @@ -205,6 +209,7 @@ public class MediaScannerConnection implements ServiceConnection { void scanNextPath() { if (mNextPath >= mPaths.length) { mConnection.disconnect(); + mConnection = null; return; } String mimeType = mMimeTypes != null ? mMimeTypes[mNextPath] : null; diff --git a/media/java/android/media/Ringtone.java b/media/java/android/media/Ringtone.java index c2bcd930dd2944cb2e321e1c50ad0e6a188346aa..79412d43af45b837e5b63b1d49e8d34a4b7f819b 100644 --- a/media/java/android/media/Ringtone.java +++ b/media/java/android/media/Ringtone.java @@ -469,6 +469,7 @@ public class Ringtone { synchronized (sActiveRingtones) { sActiveRingtones.remove(Ringtone.this); } + mp.setOnCompletionListener(null); // Help the Java GC: break the refcount cycle. } } } diff --git a/media/java/android/mtp/MtpDevice.java b/media/java/android/mtp/MtpDevice.java index 4082778986c62b0df081849e9a80077c5eb1ee02..e7ea1a5a12cffff3abde1e6afa5d419dcd55f330 100644 --- a/media/java/android/mtp/MtpDevice.java +++ b/media/java/android/mtp/MtpDevice.java @@ -18,11 +18,13 @@ package android.mtp; import android.annotation.NonNull; import android.annotation.Nullable; +import android.content.Context; import android.hardware.usb.UsbDevice; import android.hardware.usb.UsbDeviceConnection; import android.os.CancellationSignal; import android.os.ParcelFileDescriptor; +import android.os.UserManager; import com.android.internal.util.Preconditions; import java.io.IOException; @@ -62,7 +64,17 @@ public final class MtpDevice { * @return true if the device was successfully opened. */ public boolean open(UsbDeviceConnection connection) { - boolean result = native_open(mDevice.getDeviceName(), connection.getFileDescriptor()); + boolean result = false; + + Context context = connection.getContext(); + if (context != null) { + UserManager userManager = (UserManager) context.getSystemService(Context.USER_SERVICE); + + if (!userManager.hasUserRestriction(UserManager.DISALLOW_USB_FILE_TRANSFER)) { + result = native_open(mDevice.getDeviceName(), connection.getFileDescriptor()); + } + } + if (!result) { connection.close(); } diff --git a/media/jni/audioeffect/android_media_Visualizer.cpp b/media/jni/audioeffect/android_media_Visualizer.cpp index f1a8c6fbdb29c85efe0fb4527c71d837ac64d52f..aec31f0479c28d673b36911cd4688eaedf34cf06 100644 --- a/media/jni/audioeffect/android_media_Visualizer.cpp +++ b/media/jni/audioeffect/android_media_Visualizer.cpp @@ -435,11 +435,12 @@ setup_failure: // ---------------------------------------------------------------------------- static void android_media_visualizer_native_release(JNIEnv *env, jobject thiz) { - sp lpVisualizer = setVisualizer(env, thiz, 0); - if (lpVisualizer == 0) { - return; + { //limit scope so that lpVisualizer is deleted before JNI storage data. + sp lpVisualizer = setVisualizer(env, thiz, 0); + if (lpVisualizer == 0) { + return; + } } - // delete the JNI data VisualizerJniStorage* lpJniStorage = (VisualizerJniStorage *)env->GetLongField(thiz, fields.fidJniData); diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/ExifInterfaceTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/ExifInterfaceTest.java index db326ba6e2c20a4d128f5b110ff96dc33f707831..012041ff13802dc6a8d66e699efdfc50c133c536 100644 --- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/ExifInterfaceTest.java +++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/ExifInterfaceTest.java @@ -416,7 +416,7 @@ public class ExifInterfaceTest extends AndroidTestCase { in = getContext().getAssets().open(imageFile.getName()); ExifInterface exifInterface = new ExifInterface(in); exifInterface.saveAttributes(); - } catch (UnsupportedOperationException e) { + } catch (IOException e) { // Expected. saveAttributes is not supported with an ExifInterface object which was // created with InputStream. return; diff --git a/obex/javax/obex/ClientOperation.java b/obex/javax/obex/ClientOperation.java index cf8956f3fe56291aca5d3614b4331de93216bb78..509ff2467fb52d9fb6ada6a53751ec53f0ed03ee 100755 --- a/obex/javax/obex/ClientOperation.java +++ b/obex/javax/obex/ClientOperation.java @@ -207,7 +207,6 @@ public final class ClientOperation implements Operation, BaseStream { * object */ public synchronized int getResponseCode() throws IOException { - //avoid dup validateConnection if ((mReplyHeader.responseCode == -1) || (mReplyHeader.responseCode == ResponseCodes.OBEX_HTTP_CONTINUE)) { validateConnection(); @@ -423,8 +422,9 @@ public final class ClientOperation implements Operation, BaseStream { private void validateConnection() throws IOException { ensureOpen(); - // to sure only one privateInput object exist. - if (mPrivateInput == null) { + // Make sure that a response has been recieved from remote + // before continuing + if (mPrivateInput == null || mReplyHeader.responseCode == -1) { startProcessing(); } } diff --git a/packages/CaptivePortalLogin/res/values-bn-rBD/strings.xml b/packages/CaptivePortalLogin/res/values-bn-rBD/strings.xml index 20173b0dc3bf6a4a55d3f2574d685821b81e65b4..24cbfbd6430ef2b115162c5807336dc5ae9b1268 100644 --- a/packages/CaptivePortalLogin/res/values-bn-rBD/strings.xml +++ b/packages/CaptivePortalLogin/res/values-bn-rBD/strings.xml @@ -4,7 +4,7 @@ "CaptivePortalLogin" "যেভাবে আছে সেভাবেই এই নেটওয়ার্ক ব্যবহার করুন" "এই নেটওয়ার্ক ব্যবহার করবেন না" - "নেটওয়ার্কে প্রবেশ করুন করুন" + "নেটওয়ার্কে প্রবেশ করুন" "আপনি যে নেটওয়ার্কে যোগ দেওয়ার চেষ্টা করছেন তাতে নিরাপত্তার সমস্যা আছে।" "উদাহরণস্বরূপ, লগইন পৃষ্ঠাটি প্রদর্শিত প্রতিষ্ঠানের অন্তর্গত নাও হতে পারে৷" "যাই হোক না কেন ব্রাউজারের মাধ্যমে অবিরত রাখুন" diff --git a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java index b58c87a5094d34adcd3e48ef7f82414772386250..bb8eb2cd0797714210ec08eb51666b778155404c 100644 --- a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java +++ b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java @@ -115,6 +115,7 @@ public class CaptivePortalLoginActivity extends Activity { myWebView.clearCache(true); WebSettings webSettings = myWebView.getSettings(); webSettings.setJavaScriptEnabled(true); + webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE); mWebViewClient = new MyWebViewClient(); myWebView.setWebViewClient(mWebViewClient); myWebView.setWebChromeClient(new MyWebChromeClient()); diff --git a/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java b/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java index 1922773c9cb8f525d0c91e1402a088fdaa6e0050..46e7fe0b305398134bc6628817956c2914a2bfa6 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java @@ -612,23 +612,13 @@ public abstract class BaseActivity extends Activity return; } - if (!mState.hasLocationChanged()) { - super.onBackPressed(); - return; - } - - if (onBeforePopDir() || popDir()) { + if (popDir()) { return; } super.onBackPressed(); } - boolean onBeforePopDir() { - // Files app overrides this with some fancy logic. - return false; - } - public void onStackPicked(DocumentStack stack) { try { // Update the restored stack to ensure we have freshest data diff --git a/packages/DocumentsUI/src/com/android/documentsui/Events.java b/packages/DocumentsUI/src/com/android/documentsui/Events.java index 14d4e2d942d97f8217c97ec507e86cc6c2aca38e..02a912734239300bcb57ed7324154c43ba9e08a4 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/Events.java +++ b/packages/DocumentsUI/src/com/android/documentsui/Events.java @@ -53,7 +53,8 @@ public final class Events { */ public static boolean isTouchType(int toolType) { return toolType == MotionEvent.TOOL_TYPE_FINGER - || toolType == MotionEvent.TOOL_TYPE_STYLUS; + || toolType == MotionEvent.TOOL_TYPE_STYLUS + || toolType == MotionEvent.TOOL_TYPE_UNKNOWN; } /** diff --git a/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java b/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java index b82f8dd3d7a3b6abfda7bb0cffe9761845faf0ff..3b1ca77b680ad3db70c0e6fe83884a08d18bc167 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java @@ -60,12 +60,6 @@ public class FilesActivity extends BaseActivity { public static final String TAG = "FilesActivity"; - // See comments where this const is referenced for details. - private static final int DRAWER_NO_FIDDLE_DELAY = 1500; - - // Track the time we opened the drawer in response to back being pressed. - // We use the time gap to figure out whether to close app or reopen the drawer. - private long mDrawerLastFiddled; private DocumentClipper mClipper; public FilesActivity() { @@ -341,8 +335,18 @@ public class FilesActivity extends BaseActivity { // Fall back to traditional VIEW action... intent = new Intent(Intent.ACTION_VIEW); - intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - intent.setData(doc.derivedUri); + intent.setDataAndType(doc.derivedUri, doc.mimeType); + + // Downloads has traditionally added the WRITE permission + // in the TrampolineActivity. Since this behavior is long + // established, we set the same permission for non-managed files + // This ensures consistent behavior between the Downloads root + // and other roots. + int flags = Intent.FLAG_GRANT_READ_URI_PERMISSION; + if (doc.isWriteSupported()) { + flags |= Intent.FLAG_GRANT_WRITE_URI_PERMISSION; + } + intent.setFlags(flags); if (DEBUG && intent.getClipData() != null) { Log.d(TAG, "Starting intent w/ clip data: " + intent.getClipData()); @@ -385,34 +389,6 @@ public class FilesActivity extends BaseActivity { } } - // Do some "do what a I want" drawer fiddling, but don't - // do it if user already hit back recently and we recently - // did some fiddling. - @Override - boolean onBeforePopDir() { - int size = mState.stack.size(); - - if (mDrawer.isPresent() - && (System.currentTimeMillis() - mDrawerLastFiddled) > DRAWER_NO_FIDDLE_DELAY) { - // Close drawer if it is open. - if (mDrawer.isOpen()) { - mDrawer.setOpen(false); - mDrawerLastFiddled = System.currentTimeMillis(); - return true; - } - - // Open the Close drawer if it is closed and we're at the top of a root. - if (size <= 1) { - mDrawer.setOpen(true); - // Remember so we don't just close it again if back is pressed again. - mDrawerLastFiddled = System.currentTimeMillis(); - return true; - } - } - - return false; - } - // Turns out only DocumentsActivity was ever calling saveStackBlocking. // There may be a case where we want to contribute entries from // Behavior here in FilesActivity, but it isn't yet obvious. diff --git a/packages/DocumentsUI/src/com/android/documentsui/IconUtils.java b/packages/DocumentsUI/src/com/android/documentsui/IconUtils.java index 177ba0d201544c6a78dacd88a2fd4420521b7817..d87bc11a8495c0f5540163247f1b57ec6f845654 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/IconUtils.java +++ b/packages/DocumentsUI/src/com/android/documentsui/IconUtils.java @@ -42,12 +42,6 @@ public class IconUtils { public static Drawable loadMimeIcon( Context context, String mimeType, String authority, String docId, int mode) { if (Document.MIME_TYPE_DIR.equals(mimeType)) { - // TODO: eventually move these hacky assets into that package - if ("com.android.providers.media.documents".equals(authority) - && docId.startsWith("album")) { - return context.getDrawable(R.drawable.ic_doc_album); - } - if (mode == State.MODE_GRID) { return context.getDrawable(R.drawable.ic_grid_folder); } else { diff --git a/packages/DocumentsUI/src/com/android/documentsui/LocalPreferences.java b/packages/DocumentsUI/src/com/android/documentsui/LocalPreferences.java index d2e9885edf1456b29639a4bc5725daf07431f99b..b3db037697f35a09af190ca24912350e82d3f3ae 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/LocalPreferences.java +++ b/packages/DocumentsUI/src/com/android/documentsui/LocalPreferences.java @@ -22,6 +22,7 @@ import android.annotation.IntDef; import android.annotation.Nullable; import android.content.Context; import android.content.SharedPreferences; +import android.content.SharedPreferences.Editor; import android.os.UserHandle; import android.preference.PreferenceManager; @@ -84,6 +85,15 @@ public class LocalPreferences { @Retention(RetentionPolicy.SOURCE) public @interface PermissionStatus {} + /** + * Clears all preferences associated with a given package. + * + *

          Typically called when a package is removed or when user asked to clear its data. + */ + static void clearPackagePreferences(Context context, String packageName) { + clearScopedAccessPreferences(context, packageName); + } + /** * Methods below are used to keep track of denied user requests on scoped directory access so * the dialog is not offered when user checked the 'Do not ask again' box @@ -108,6 +118,23 @@ public class LocalPreferences { getPrefs(context).edit().putInt(key, status).apply(); } + private static void clearScopedAccessPreferences(Context context, String packageName) { + final String keySubstring = "|" + packageName + "|"; + final SharedPreferences prefs = getPrefs(context); + Editor editor = null; + for (final String key : prefs.getAll().keySet()) { + if (key.contains(keySubstring)) { + if (editor == null) { + editor = prefs.edit(); + } + editor.remove(key); + } + } + if (editor != null) { + editor.apply(); + } + } + private static String getScopedAccessDenialsKey(String packageName, String uuid, String directory) { final int userId = UserHandle.myUserId(); diff --git a/packages/DocumentsUI/src/com/android/documentsui/PackageReceiver.java b/packages/DocumentsUI/src/com/android/documentsui/PackageReceiver.java index aef63afcbcd735cd0a7114f6f3215d06d0912203..fd1183fda13d867d94599912374322bc9dfcf0a7 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/PackageReceiver.java +++ b/packages/DocumentsUI/src/com/android/documentsui/PackageReceiver.java @@ -23,7 +23,7 @@ import android.content.Intent; import android.net.Uri; /** - * Clean up {@link RecentsProvider} when packages are removed. + * Cleans up {@link RecentsProvider} and {@link LocalPreferences} when packages are removed. */ public class PackageReceiver extends BroadcastReceiver { @Override @@ -31,15 +31,19 @@ public class PackageReceiver extends BroadcastReceiver { final ContentResolver resolver = context.getContentResolver(); final String action = intent.getAction(); + final Uri data = intent.getData(); + final String packageName = data == null ? null : data.getSchemeSpecificPart(); + if (Intent.ACTION_PACKAGE_FULLY_REMOVED.equals(action)) { resolver.call(RecentsProvider.buildRecent(), RecentsProvider.METHOD_PURGE, null, null); - + if (packageName != null) { + LocalPreferences.clearPackagePreferences(context, packageName); + } } else if (Intent.ACTION_PACKAGE_DATA_CLEARED.equals(action)) { - final Uri data = intent.getData(); - if (data != null) { - final String packageName = data.getSchemeSpecificPart(); + if (packageName != null) { resolver.call(RecentsProvider.buildRecent(), RecentsProvider.METHOD_PURGE_PACKAGE, packageName, null); + LocalPreferences.clearPackagePreferences(context, packageName); } } } diff --git a/packages/DocumentsUI/src/com/android/documentsui/RecentsLoader.java b/packages/DocumentsUI/src/com/android/documentsui/RecentsLoader.java index cebc9b05679e6d480bd376689f859130d5d10666..557a2f6abc9f325af008f90b5c949f3c3c3987a1 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/RecentsLoader.java +++ b/packages/DocumentsUI/src/com/android/documentsui/RecentsLoader.java @@ -157,6 +157,9 @@ public class RecentsLoader extends AsyncTaskLoader { throw new RuntimeException(e); } catch (ExecutionException e) { // We already logged on other side + } catch (Exception e) { + Log.e(TAG, "Failed to query Recents for authority: " + task.authority + + ". Skip this authority in Recents.", e); } } else { allDone = false; diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java index 3eca8f6f176671065621234436f6fe3b0edd709f..b333e45428c11d9a840755f78c3fd1f46c0f7fe4 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java @@ -53,10 +53,13 @@ import android.provider.DocumentsContract.Document; import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; import android.support.v13.view.DragStartHelper; +import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; +import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.GridLayoutManager.SpanSizeLookup; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.OnItemTouchListener; +import android.support.v7.widget.RecyclerView.Recycler; import android.support.v7.widget.RecyclerView.RecyclerListener; import android.support.v7.widget.RecyclerView.ViewHolder; import android.text.BidiFormatter; @@ -243,7 +246,40 @@ public class DirectoryFragment extends Fragment mRecView.setAdapter(mAdapter); - mLayout = new GridLayoutManager(getContext(), mColumnCount); + // Switch Access Accessibility API needs an {@link AccessibilityDelegate} to know the proper + // route when user selects an UI element. It usually guesses this if the element has an + // {@link OnClickListener}, but since we do not have one for itemView, we will need to + // manually route it to the right behavior. RecyclerView has its own AccessibilityDelegate, + // and routes it to its LayoutManager; so we must override the LayoutManager's accessibility + // methods to route clicks correctly. + mLayout = new GridLayoutManager(getContext(), mColumnCount) { + @Override + public void onInitializeAccessibilityNodeInfoForItem( + RecyclerView.Recycler recycler, RecyclerView.State state, + View host, AccessibilityNodeInfoCompat info) { + super.onInitializeAccessibilityNodeInfoForItem(recycler, state, host, info); + info.addAction(AccessibilityActionCompat.ACTION_CLICK); + } + + @Override + public boolean performAccessibilityActionForItem( + RecyclerView.Recycler recycler, RecyclerView.State state, View view, + int action, Bundle args) { + // We are only handling click events; route all other to default implementation + if (action == AccessibilityNodeInfoCompat.ACTION_CLICK) { + RecyclerView.ViewHolder vh = mRecView.getChildViewHolder(view); + if (vh instanceof DocumentHolder) { + DocumentHolder dh = (DocumentHolder) vh; + if (dh.mEventListener != null) { + dh.mEventListener.onActivate(dh); + return true; + } + } + } + return super.performAccessibilityActionForItem(recycler, state, view, action, + args); + } + }; SpanSizeLookup lookup = mAdapter.createSpanSizeLookup(); if (lookup != null) { mLayout.setSpanSizeLookup(lookup); @@ -717,63 +753,57 @@ public class DirectoryFragment extends Fragment private void openDocuments(final Selection selected) { Metrics.logUserAction(getContext(), Metrics.USER_ACTION_OPEN); - new GetDocumentsTask() { - @Override - void onDocumentsReady(List docs) { - // TODO: Implement support in Files activity for opening multiple docs. - BaseActivity.get(DirectoryFragment.this).onDocumentsPicked(docs); - } - }.execute(selected); + // Model must be accessed in UI thread, since underlying cursor is not threadsafe. + List docs = mModel.getDocuments(selected); + // TODO: Implement support in Files activity for opening multiple docs. + BaseActivity.get(DirectoryFragment.this).onDocumentsPicked(docs); } private void shareDocuments(final Selection selected) { Metrics.logUserAction(getContext(), Metrics.USER_ACTION_SHARE); - new GetDocumentsTask() { - @Override - void onDocumentsReady(List docs) { - Intent intent; - - // Filter out directories and virtual files - those can't be shared. - List docsForSend = new ArrayList<>(); - for (DocumentInfo doc: docs) { - if (!doc.isDirectory() && !doc.isVirtualDocument()) { - docsForSend.add(doc); - } - } + // Model must be accessed in UI thread, since underlying cursor is not threadsafe. + List docs = mModel.getDocuments(selected); + Intent intent; - if (docsForSend.size() == 1) { - final DocumentInfo doc = docsForSend.get(0); - - intent = new Intent(Intent.ACTION_SEND); - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - intent.addCategory(Intent.CATEGORY_DEFAULT); - intent.setType(doc.mimeType); - intent.putExtra(Intent.EXTRA_STREAM, doc.derivedUri); - - } else if (docsForSend.size() > 1) { - intent = new Intent(Intent.ACTION_SEND_MULTIPLE); - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - intent.addCategory(Intent.CATEGORY_DEFAULT); - - final ArrayList mimeTypes = new ArrayList<>(); - final ArrayList uris = new ArrayList<>(); - for (DocumentInfo doc : docsForSend) { - mimeTypes.add(doc.mimeType); - uris.add(doc.derivedUri); - } + // Filter out directories and virtual files - those can't be shared. + List docsForSend = new ArrayList<>(); + for (DocumentInfo doc: docs) { + if (!doc.isDirectory() && !doc.isVirtualDocument()) { + docsForSend.add(doc); + } + } - intent.setType(findCommonMimeType(mimeTypes)); - intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); + if (docsForSend.size() == 1) { + final DocumentInfo doc = docsForSend.get(0); - } else { - return; - } + intent = new Intent(Intent.ACTION_SEND); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + intent.addCategory(Intent.CATEGORY_DEFAULT); + intent.setType(doc.mimeType); + intent.putExtra(Intent.EXTRA_STREAM, doc.derivedUri); + + } else if (docsForSend.size() > 1) { + intent = new Intent(Intent.ACTION_SEND_MULTIPLE); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + intent.addCategory(Intent.CATEGORY_DEFAULT); - intent = Intent.createChooser(intent, getActivity().getText(R.string.share_via)); - startActivity(intent); + final ArrayList mimeTypes = new ArrayList<>(); + final ArrayList uris = new ArrayList<>(); + for (DocumentInfo doc : docsForSend) { + mimeTypes.add(doc.mimeType); + uris.add(doc.derivedUri); } - }.execute(selected); + + intent.setType(findCommonMimeType(mimeTypes)); + intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); + + } else { + return; + } + + intent = Intent.createChooser(intent, getActivity().getText(R.string.share_via)); + startActivity(intent); } private String generateDeleteMessage(final List docs) { @@ -821,52 +851,51 @@ public class DirectoryFragment extends Fragment } final DocumentInfo srcParent = getDisplayState().stack.peek(); - new GetDocumentsTask() { - @Override - void onDocumentsReady(final List docs) { - - TextView message = - (TextView) mInflater.inflate(R.layout.dialog_delete_confirmation, null); - message.setText(generateDeleteMessage(docs)); - - // This "insta-hides" files that are being deleted, because - // the delete operation may be not execute immediately (it - // may be queued up on the FileOperationService.) - // To hide the files locally, we call the hide method on the adapter - // ...which a live object...cannot be parceled. - // For that reason, for now, we implement this dialog NOT - // as a fragment (which can survive rotation and have its own state), - // but as a simple runtime dialog. So rotating a device with an - // active delete dialog...results in that dialog disappearing. - // We can do better, but don't have cycles for it now. - new AlertDialog.Builder(getActivity()) - .setView(message) - .setPositiveButton( - android.R.string.yes, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - // Finish selection mode first which clears selection so we - // don't end up trying to deselect deleted documents. - // This is done here, rather in the onActionItemClicked - // so we can avoid de-selecting items in the case where - // the user cancels the delete. - if (mActionMode != null) { - mActionMode.finish(); - } else { - Log.w(TAG, "Action mode is null before deleting documents."); - } - // Hide the files in the UI...since the operation - // might be queued up on FileOperationService. - // We're walking a line here. - mAdapter.hide(selected.getAll()); - FileOperations.delete( - getActivity(), docs, srcParent, getDisplayState().stack); - } - }) - .setNegativeButton(android.R.string.no, null) - .show(); - } - }.execute(selected); + + // Model must be accessed in UI thread, since underlying cursor is not threadsafe. + List docs = mModel.getDocuments(selected); + + TextView message = + (TextView) mInflater.inflate(R.layout.dialog_delete_confirmation, null); + message.setText(generateDeleteMessage(docs)); + + // This "insta-hides" files that are being deleted, because + // the delete operation may be not execute immediately (it + // may be queued up on the FileOperationService.) + // To hide the files locally, we call the hide method on the adapter + // ...which a live object...cannot be parceled. + // For that reason, for now, we implement this dialog NOT + // as a fragment (which can survive rotation and have its own state), + // but as a simple runtime dialog. So rotating a device with an + // active delete dialog...results in that dialog disappearing. + // We can do better, but don't have cycles for it now. + new AlertDialog.Builder(getActivity()) + .setView(message) + .setPositiveButton( + android.R.string.yes, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + // Finish selection mode first which clears selection so we + // don't end up trying to deselect deleted documents. + // This is done here, rather in the onActionItemClicked + // so we can avoid de-selecting items in the case where + // the user cancels the delete. + if (mActionMode != null) { + mActionMode.finish(); + } else { + Log.w(TAG, "Action mode is null before deleting documents."); + } + // Hide the files in the UI...since the operation + // might be queued up on FileOperationService. + // We're walking a line here. + mAdapter.hide(selected.getAll()); + FileOperations.delete( + getActivity(), docs, srcParent, getDisplayState().stack); + } + }) + .setNegativeButton(android.R.string.no, null) + .show(); } private void transferDocuments(final Selection selected, final @OpType int mode) { @@ -900,25 +929,21 @@ public class DirectoryFragment extends Fragment ? R.string.menu_move : R.string.menu_copy; intent.putExtra(DocumentsContract.EXTRA_PROMPT, getResources().getString(drawerTitleId)); - new GetDocumentsTask() { - @Override - void onDocumentsReady(List docs) { - // TODO: Can this move to Fragment bundle state? - getDisplayState().selectedDocumentsForCopy = docs; - - // Determine if there is a directory in the set of documents - // to be copied? Why? Directory creation isn't supported by some roots - // (like Downloads). This informs DocumentsActivity (the "picker") - // to restrict available roots to just those with support. - intent.putExtra(Shared.EXTRA_DIRECTORY_COPY, hasDirectory(docs)); - intent.putExtra(FileOperationService.EXTRA_OPERATION, mode); - - // This just identifies the type of request...we'll check it - // when we reveive a response. - startActivityForResult(intent, REQUEST_COPY_DESTINATION); - } + // Model must be accessed in UI thread, since underlying cursor is not threadsafe. + List docs = mModel.getDocuments(selected); + // TODO: Can this move to Fragment bundle state? + getDisplayState().selectedDocumentsForCopy = docs; + + // Determine if there is a directory in the set of documents + // to be copied? Why? Directory creation isn't supported by some roots + // (like Downloads). This informs DocumentsActivity (the "picker") + // to restrict available roots to just those with support. + intent.putExtra(Shared.EXTRA_DIRECTORY_COPY, hasDirectory(docs)); + intent.putExtra(FileOperationService.EXTRA_OPERATION, mode); - }.execute(selected); + // This just identifies the type of request...we'll check it + // when we reveive a response. + startActivityForResult(intent, REQUEST_COPY_DESTINATION); } private static boolean hasDirectory(List docs) { @@ -937,12 +962,9 @@ public class DirectoryFragment extends Fragment // Rename option is only available in menu when 1 document selected assert(selected.size() == 1); - new GetDocumentsTask() { - @Override - void onDocumentsReady(List docs) { - RenameDocumentFragment.show(getFragmentManager(), docs.get(0)); - } - }.execute(selected); + // Model must be accessed in UI thread, since underlying cursor is not threadsafe. + List docs = mModel.getDocuments(selected); + RenameDocumentFragment.show(getFragmentManager(), docs.get(0)); } @Override @@ -1101,19 +1123,17 @@ public class DirectoryFragment extends Fragment } } - void copySelectionToClipboard(Selection selection) { - assert(!selection.isEmpty()); - new GetDocumentsTask() { - @Override - void onDocumentsReady(List docs) { - mClipper.clipDocuments(docs); - Activity activity = getActivity(); - Snackbars.makeSnackbar(activity, - activity.getResources().getQuantityString( - R.plurals.clipboard_files_clipped, docs.size(), docs.size()), - Snackbar.LENGTH_SHORT).show(); - } - }.execute(selection); + void copySelectionToClipboard(Selection selected) { + assert(!selected.isEmpty()); + + // Model must be accessed in UI thread, since underlying cursor is not threadsafe. + List docs = mModel.getDocuments(selected); + mClipper.clipDocuments(docs); + Activity activity = getActivity(); + Snackbars.makeSnackbar(activity, + activity.getResources().getQuantityString( + R.plurals.clipboard_files_clipped, docs.size(), docs.size()), + Snackbar.LENGTH_SHORT).show(); } public void pasteFromClipboard() { @@ -1422,25 +1442,6 @@ public class DirectoryFragment extends Fragment mShadowView.draw(canvas); } } - /** - * Abstract task providing support for loading documents *off* - * the main thread. And if it isn't obvious, creating a list - * of documents (especially large lists) can be pretty expensive. - */ - private abstract class GetDocumentsTask - extends AsyncTask> { - @Override - protected final List doInBackground(Selection... selected) { - return mModel.getDocuments(selected[0]); - } - - @Override - protected final void onPostExecute(List docs) { - onDocumentsReady(docs); - } - - abstract void onDocumentsReady(List docs); - } @Override public boolean isSelected(String modelId) { diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/Model.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/Model.java index 0a2960f8ffe0497267750bbe8eb6aca3de759514..94b8277f4eddc0b14d0d4e880d60760501a27483 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/Model.java +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/Model.java @@ -107,7 +107,13 @@ public class Model { mSortOrder = result.sortOrder; doc = result.doc; - updateModelData(); + try { + updateModelData(); + } catch (Exception e) { + Log.e(TAG, "Error while accessing cursors", e); + notifyUpdateListeners(e); + return; + } final Bundle extras = mCursor.getExtras(); if (extras != null) { diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java index 3a86a51b2d1886595b7fb762d0497096623ae77a..63f66de9ad842718ac06b3f139eb2af200c26997 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java +++ b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java @@ -235,6 +235,10 @@ public class DocumentInfo implements Durable, Parcelable { return (flags & Document.FLAG_DIR_PREFERS_GRID) != 0; } + public boolean isWriteSupported() { + return (flags & Document.FLAG_SUPPORTS_WRITE) != 0; + } + public boolean isDeleteSupported() { return (flags & Document.FLAG_SUPPORTS_DELETE) != 0; } diff --git a/packages/DocumentsUI/src/com/android/documentsui/services/MoveJob.java b/packages/DocumentsUI/src/com/android/documentsui/services/MoveJob.java index 111817132fa1db289ad230a2427735a725dfa51d..1de3bbc204965572dd4ef29e813c0762e84c28a9 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/services/MoveJob.java +++ b/packages/DocumentsUI/src/com/android/documentsui/services/MoveJob.java @@ -117,7 +117,9 @@ final class MoveJob extends CopyJob { byteCopyDocument(src, dest); // Remove the source document. - deleteDocument(src, srcParent); + if(!isCanceled()) { + deleteDocument(src, srcParent); + } } @Override diff --git a/packages/EasterEgg/src/com/android/egg/neko/NekoService.java b/packages/EasterEgg/src/com/android/egg/neko/NekoService.java index 32e3358430169e1956cf6dbbc4342dd5bee3a329..808ec361fb4f059bb676a17387933bce23d50a3f 100644 --- a/packages/EasterEgg/src/com/android/egg/neko/NekoService.java +++ b/packages/EasterEgg/src/com/android/egg/neko/NekoService.java @@ -102,6 +102,14 @@ public class NekoService extends JobService { return false; } + public static void registerJobIfNeeded(Context context, long intervalMinutes) { + JobScheduler jss = context.getSystemService(JobScheduler.class); + JobInfo info = jss.getPendingJob(JOB_ID); + if (info == null) { + registerJob(context, intervalMinutes); + } + } + public static void registerJob(Context context, long intervalMinutes) { JobScheduler jss = context.getSystemService(JobScheduler.class); jss.cancel(JOB_ID); diff --git a/packages/EasterEgg/src/com/android/egg/neko/NekoTile.java b/packages/EasterEgg/src/com/android/egg/neko/NekoTile.java index 8a3ec8fa19e9d04162cf6182ab8c24442b343ed6..159b40a3e5afd757e3d553305ae3a5ce138e0fcf 100644 --- a/packages/EasterEgg/src/com/android/egg/neko/NekoTile.java +++ b/packages/EasterEgg/src/com/android/egg/neko/NekoTile.java @@ -68,6 +68,9 @@ public class NekoTile extends TileService implements PrefsListener { Tile tile = getQsTile(); int foodState = mPrefs.getFoodState(); Food food = new Food(foodState); + if (foodState != 0) { + NekoService.registerJobIfNeeded(this, food.getInterval(this)); + } tile.setIcon(food.getIcon(this)); tile.setLabel(food.getName(this)); tile.setState(foodState != 0 ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE); diff --git a/packages/EasterEgg/src/com/android/egg/neko/PrefState.java b/packages/EasterEgg/src/com/android/egg/neko/PrefState.java index 5f54180bc2e09e93730685cb8193f91bbb0c8df1..bf71b197d3cb8f2f50506b4cb7ab1b7ffbc8fc83 100644 --- a/packages/EasterEgg/src/com/android/egg/neko/PrefState.java +++ b/packages/EasterEgg/src/com/android/egg/neko/PrefState.java @@ -43,13 +43,11 @@ public class PrefState implements OnSharedPreferenceChangeListener { public void addCat(Cat cat) { mPrefs.edit() .putString(CAT_KEY_PREFIX + String.valueOf(cat.getSeed()), cat.getName()) - .commit(); + .apply(); } public void removeCat(Cat cat) { - mPrefs.edit() - .remove(CAT_KEY_PREFIX + String.valueOf(cat.getSeed())) - .commit(); + mPrefs.edit().remove(CAT_KEY_PREFIX + String.valueOf(cat.getSeed())).apply(); } public List getCats() { @@ -71,7 +69,7 @@ public class PrefState implements OnSharedPreferenceChangeListener { } public void setFoodState(int foodState) { - mPrefs.edit().putInt(FOOD_STATE, foodState).commit(); + mPrefs.edit().putInt(FOOD_STATE, foodState).apply(); } public void setListener(PrefsListener listener) { diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java index 78b99274e444b5c5be0fab344c77e50f0fc9e193..3ef9b8e1b8c4ec4bb5454431a11d2c1eaeb72d90 100644 --- a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java +++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java @@ -466,10 +466,7 @@ public class ExternalStorageProvider extends DocumentsProvider { displayName = FileUtils.buildValidFatFilename(displayName); final File before = getFileForDocId(docId); - final File after = new File(before.getParentFile(), displayName); - if (after.exists()) { - throw new IllegalStateException("Already exists " + after); - } + final File after = FileUtils.buildUniqueFile(before.getParentFile(), displayName); if (!before.renameTo(after)) { throw new IllegalStateException("Failed to rename to " + after); } @@ -566,6 +563,7 @@ public class ExternalStorageProvider extends DocumentsProvider { throws FileNotFoundException { final MatrixCursor result = new MatrixCursor(resolveDocumentProjection(projection)); + query = query.toLowerCase(); final File parent; synchronized (mRootsLock) { parent = mRoots.get(rootId).path; diff --git a/packages/Keyguard/src/com/android/keyguard/EmergencyButton.java b/packages/Keyguard/src/com/android/keyguard/EmergencyButton.java index d9ad444ec3f85a0715b6c1524067c5fca36d4103..abdbe09a6b8fac0ce9f9b7fe9de141efd3c651ea 100755 --- a/packages/Keyguard/src/com/android/keyguard/EmergencyButton.java +++ b/packages/Keyguard/src/com/android/keyguard/EmergencyButton.java @@ -29,13 +29,16 @@ import android.telecom.TelecomManager; import android.telephony.ServiceState; import android.util.AttributeSet; import android.util.Slog; +import android.view.MotionEvent; import android.view.View; +import android.view.ViewConfiguration; import android.widget.Button; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.internal.telephony.IccCardConstants.State; import com.android.internal.widget.LockPatternUtils; +import com.android.internal.policy.EmergencyAffordanceManager; /** * This class implements a smart emergency button that updates itself based @@ -52,7 +55,10 @@ public class EmergencyButton extends Button { | Intent.FLAG_ACTIVITY_CLEAR_TOP); private static final String LOG_TAG = "EmergencyButton"; + private final EmergencyAffordanceManager mEmergencyAffordanceManager; + private int mDownX; + private int mDownY; KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() { @Override @@ -70,6 +76,7 @@ public class EmergencyButton extends Button { updateEmergencyCallButton(); } }; + private boolean mLongPressWasDragged; public interface EmergencyButtonCallback { public void onEmergencyButtonClickedWhenInCall(); @@ -92,6 +99,7 @@ public class EmergencyButton extends Button { com.android.internal.R.bool.config_voice_capable); mEnableEmergencyCallWhileSimLocked = mContext.getResources().getBoolean( com.android.internal.R.bool.config_enable_emergency_call_while_sim_locked); + mEmergencyAffordanceManager = new EmergencyAffordanceManager(context); } @Override @@ -116,9 +124,44 @@ public class EmergencyButton extends Button { takeEmergencyCallAction(); } }); + setOnLongClickListener(new OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + if (!mLongPressWasDragged + && mEmergencyAffordanceManager.needsEmergencyAffordance()) { + mEmergencyAffordanceManager.performEmergencyCall(); + return true; + } + return false; + } + }); updateEmergencyCallButton(); } + @Override + public boolean onTouchEvent(MotionEvent event) { + final int x = (int) event.getX(); + final int y = (int) event.getY(); + if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { + mDownX = x; + mDownY = y; + mLongPressWasDragged = false; + } else { + final int xDiff = Math.abs(x - mDownX); + final int yDiff = Math.abs(y - mDownY); + int touchSlop = ViewConfiguration.get(mContext).getScaledTouchSlop(); + if (Math.abs(yDiff) > touchSlop || Math.abs(xDiff) > touchSlop) { + mLongPressWasDragged = true; + } + } + return super.onTouchEvent(event); + } + + @Override + public boolean performLongClick() { + return super.performLongClick(); + } + @Override protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardPINView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardPINView.java index ebd0fe93bf6ed0960f7a15195437f0da5757ed07..113c212697f01173a9294521e9a25d3a10a9c842 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardPINView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardPINView.java @@ -16,13 +16,9 @@ package com.android.keyguard; -import android.animation.Animator; -import android.animation.ObjectAnimator; import android.content.Context; import android.provider.Settings; import android.util.AttributeSet; -import android.view.RenderNode; -import android.view.RenderNodeAnimator; import android.view.View; import android.view.ViewGroup; import android.view.animation.AnimationUtils; @@ -182,9 +178,10 @@ public class KeyguardPINView extends KeyguardPinBasedInputView { setTranslationY(0); AppearAnimationUtils.startTranslationYAnimation(this, 0 /* delay */, 280 /* duration */, mDisappearYTranslation, mDisappearAnimationUtils.getInterpolator()); - DisappearAnimationUtils disappearAnimationUtils = mKeyguardUpdateMonitor.isUserUnlocked() - ? mDisappearAnimationUtils - : mDisappearAnimationUtilsLocked; + DisappearAnimationUtils disappearAnimationUtils = mKeyguardUpdateMonitor + .needsSlowUnlockTransition() + ? mDisappearAnimationUtilsLocked + : mDisappearAnimationUtils; disappearAnimationUtils.startAnimation2d(mViews, new Runnable() { @Override diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java index 172352b7684e4b810cde173a48c02770b9025f8b..094209e53b4ee5a6f3517f8de612c1a5229c092c 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java @@ -434,9 +434,9 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit @Override public boolean startDisappearAnimation(final Runnable finishRunnable) { - float durationMultiplier = mKeyguardUpdateMonitor.isUserUnlocked() - ? 1f - : DISAPPEAR_MULTIPLIER_LOCKED; + float durationMultiplier = mKeyguardUpdateMonitor.needsSlowUnlockTransition() + ? DISAPPEAR_MULTIPLIER_LOCKED + : 1f; mLockPatternView.clearPattern(); enableClipping(false); setTranslationY(0); @@ -445,9 +445,10 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit -mDisappearAnimationUtils.getStartTranslation(), mDisappearAnimationUtils.getInterpolator()); - DisappearAnimationUtils disappearAnimationUtils = mKeyguardUpdateMonitor.isUserUnlocked() - ? mDisappearAnimationUtils - : mDisappearAnimationUtilsLocked; + DisappearAnimationUtils disappearAnimationUtils = mKeyguardUpdateMonitor + .needsSlowUnlockTransition() + ? mDisappearAnimationUtilsLocked + : mDisappearAnimationUtils; disappearAnimationUtils.startAnimation2d(mLockPatternView.getCellStates(), () -> { enableClipping(true); diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java index 215d86a2e1f124352c8d926e344bfcea71e579dc..a05bf941965598789d8f3c18fe206c65f8a8ce4e 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -16,6 +16,7 @@ package com.android.keyguard; +import static android.content.Intent.ACTION_USER_UNLOCKED; import static android.os.BatteryManager.BATTERY_HEALTH_UNKNOWN; import static android.os.BatteryManager.BATTERY_STATUS_FULL; import static android.os.BatteryManager.BATTERY_STATUS_UNKNOWN; @@ -34,9 +35,12 @@ import android.app.PendingIntent; import android.app.admin.DevicePolicyManager; import android.app.trust.TrustManager; import android.content.BroadcastReceiver; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.database.ContentObserver; import android.graphics.Bitmap; import android.hardware.fingerprint.FingerprintManager; @@ -108,12 +112,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private static final String PERMISSION_SELF = "com.android.systemui.permission.SELF"; - /** - * Milliseconds after unlocking with fingerprint times out, i.e. the user has to use a - * strong auth method like password, PIN or pattern. - */ - private static final long FINGERPRINT_UNLOCK_TIMEOUT_MS = 72 * 60 * 60 * 1000; - // Callback messages private static final int MSG_TIME_UPDATE = 301; private static final int MSG_BATTERY_UPDATE = 302; @@ -138,6 +136,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private static final int MSG_SERVICE_STATE_CHANGE = 330; private static final int MSG_SCREEN_TURNED_ON = 331; private static final int MSG_SCREEN_TURNED_OFF = 332; + private static final int MSG_DREAMING_STATE_CHANGED = 333; + private static final int MSG_USER_UNLOCKED = 334; /** Fingerprint state: Not listening to fingerprint. */ private static final int FINGERPRINT_STATE_STOPPED = 0; @@ -159,6 +159,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private static final int DEFAULT_CHARGING_VOLTAGE_MICRO_VOLT = 5000000; + private static final ComponentName FALLBACK_HOME_COMPONENT = new ComponentName( + "com.android.settings", "com.android.settings.FallbackHome"); + private static KeyguardUpdateMonitor sInstance; private final Context mContext; @@ -177,7 +180,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private boolean mGoingToSleep; private boolean mBouncer; private boolean mBootCompleted; - private boolean mUserUnlocked; + private boolean mNeedsSlowUnlockTransition; private boolean mHasLockscreenWallpaper; // Device provisioning state @@ -287,6 +290,12 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { handleScreenTurnedOff(); Trace.endSection(); break; + case MSG_DREAMING_STATE_CHANGED: + handleDreamingStateChanged(msg.arg1); + break; + case MSG_USER_UNLOCKED: + handleUserUnlocked(); + break; } } }; @@ -380,7 +389,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } /** @return List of SubscriptionInfo records, maybe empty but never null */ - List getSubscriptionInfo(boolean forceReload) { + public List getSubscriptionInfo(boolean forceReload) { List sil = mSubscriptionInfo; if (sil == null || forceReload) { sil = mSubscriptionManager.getActiveSubscriptionInfoList(); @@ -572,8 +581,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { && !hasFingerprintUnlockTimedOut(sCurrentUser); } - public boolean isUserUnlocked() { - return mUserUnlocked; + public boolean needsSlowUnlockTransition() { + return mNeedsSlowUnlockTransition; } public StrongAuthTracker getStrongAuthTracker() { @@ -598,7 +607,10 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } private void scheduleStrongAuthTimeout() { - long when = SystemClock.elapsedRealtime() + FINGERPRINT_UNLOCK_TIMEOUT_MS; + final DevicePolicyManager dpm = + (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE); + long when = SystemClock.elapsedRealtime() + dpm.getRequiredStrongAuthTimeout(null, + sCurrentUser); Intent intent = new Intent(ACTION_STRONG_AUTH_TIMEOUT); intent.putExtra(USER_ID, sCurrentUser); PendingIntent sender = PendingIntent.getBroadcast(mContext, @@ -716,6 +728,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } else if (DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED .equals(action)) { mHandler.sendEmptyMessage(MSG_DPM_STATE_CHANGED); + } else if (ACTION_USER_UNLOCKED.equals(action)) { + mHandler.sendEmptyMessage(MSG_USER_UNLOCKED); } } }; @@ -986,6 +1000,17 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } } + private void handleDreamingStateChanged(int dreamStart) { + final int count = mCallbacks.size(); + boolean showingDream = dreamStart == 1; + for (int i = 0; i < count; i++) { + KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); + if (cb != null) { + cb.onDreamingStateChanged(showingDream); + } + } + } + /** * IMPORTANT: Must be called from UI thread. */ @@ -1009,6 +1034,16 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } } + private void handleUserUnlocked() { + mNeedsSlowUnlockTransition = resolveNeedsSlowUnlockTransition(); + for (int i = 0; i < mCallbacks.size(); i++) { + KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); + if (cb != null) { + cb.onUserUnlocked(); + } + } + } + private KeyguardUpdateMonitor(Context context) { mContext = context; mSubscriptionManager = SubscriptionManager.from(context); @@ -1049,6 +1084,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { allUserFilter.addAction(ACTION_FACE_UNLOCK_STARTED); allUserFilter.addAction(ACTION_FACE_UNLOCK_STOPPED); allUserFilter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED); + allUserFilter.addAction(ACTION_USER_UNLOCKED); context.registerReceiverAsUser(mBroadcastAllReceiver, UserHandle.ALL, allUserFilter, null, null); @@ -1454,7 +1490,18 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private void handleKeyguardReset() { if (DEBUG) Log.d(TAG, "handleKeyguardReset"); updateFingerprintListeningState(); - mUserUnlocked = mUserManager.isUserUnlocked(getCurrentUser()); + mNeedsSlowUnlockTransition = resolveNeedsSlowUnlockTransition(); + } + + private boolean resolveNeedsSlowUnlockTransition() { + if (mUserManager.isUserUnlocked(getCurrentUser())) { + return false; + } + Intent homeIntent = new Intent(Intent.ACTION_MAIN) + .addCategory(Intent.CATEGORY_HOME); + ResolveInfo resolveInfo = mContext.getPackageManager().resolveActivity(homeIntent, + 0 /* flags */); + return FALLBACK_HOME_COMPONENT.equals(resolveInfo.getComponentInfo().getComponentName()); } /** @@ -1759,6 +1806,14 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { mHandler.sendEmptyMessage(MSG_SCREEN_TURNED_OFF); } + public void dispatchDreamingStarted() { + mHandler.sendMessage(mHandler.obtainMessage(MSG_DREAMING_STATE_CHANGED, 1, 0)); + } + + public void dispatchDreamingStopped() { + mHandler.sendMessage(mHandler.obtainMessage(MSG_DREAMING_STATE_CHANGED, 0, 0)); + } + public boolean isDeviceInteractive() { return mDeviceInteractive; } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java index 41c99fa77bcccb529ac4442166ec8d43b9280e38..1dcef16f11677c9af505c32a6844b42bf398bf62 100755 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java @@ -135,6 +135,11 @@ public class KeyguardUpdateMonitorCallback { */ public void onUserInfoChanged(int userId) { } + /** + * Called when a user got unlocked. + */ + public void onUserUnlocked() { } + /** * Called when boot completed. * @@ -253,4 +258,10 @@ public class KeyguardUpdateMonitorCallback { * Called when the state whether we have a lockscreen wallpaper has changed. */ public void onHasLockscreenWallpaperChanged(boolean hasLockscreenWallpaper) { } + + /** + * Called when the dream's window state is changed. + * @param dreaming true if the dream's window has been created and is visible + */ + public void onDreamingStateChanged(boolean dreaming) { } } diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java index cce619e67d198ddb6164cc652727e3bc820a0ecc..4950af3e14e08cfcef5c44e594f019a3689607f0 100644 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java @@ -873,7 +873,7 @@ class MtpDatabase { } private static int getRootFlags(int[] operationsSupported) { - int rootFlag = Root.FLAG_SUPPORTS_IS_CHILD; + int rootFlag = Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_LOCAL_ONLY; if (MtpDeviceRecord.isWritingSupported(operationsSupported)) { rootFlag |= Root.FLAG_SUPPORTS_CREATE; } diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java index 90dd4406346a85146aa2bd1cf891f02a1e502c8b..8f254e9735da533ff8c7b10357f5a7c70b351bb1 100644 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java @@ -282,8 +282,8 @@ class MtpManager { } final MtpDeviceInfo info = mtpDevice.getDeviceInfo(); if (info != null) { - operationsSupported = mtpDevice.getDeviceInfo().getOperationsSupported(); - eventsSupported = mtpDevice.getDeviceInfo().getEventsSupported(); + operationsSupported = info.getOperationsSupported(); + eventsSupported = info.getEventsSupported(); } } else { roots = new MtpRoot[0]; diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java index 404047b8baed8ea6982269b745b60c3945012ae9..8c13c813552babe0151ff619dad9604298f840c4 100644 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java +++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java @@ -128,7 +128,7 @@ public class MtpDatabaseTest extends AndroidTestCase { cursor.moveToNext(); assertEquals(1, getInt(cursor, Root.COLUMN_ROOT_ID)); assertEquals( - Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE, + Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE | Root.FLAG_LOCAL_ONLY, getInt(cursor, Root.COLUMN_FLAGS)); assertEquals(R.drawable.ic_root_mtp, getInt(cursor, Root.COLUMN_ICON)); assertEquals("Device Storage", getString(cursor, Root.COLUMN_TITLE)); diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java index 9ed15c82f33649e07856999b97b39898216a6efa..d19b46083f91fac3a0873f3481aa4d895fda5aab 100644 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java +++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java @@ -210,7 +210,11 @@ public class MtpDocumentsProviderTest extends AndroidTestCase { assertEquals(2, cursor.getCount()); cursor.moveToNext(); assertEquals("1", cursor.getString(0)); - assertEquals(Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE, cursor.getInt(1)); + assertEquals( + Root.FLAG_SUPPORTS_IS_CHILD | + Root.FLAG_SUPPORTS_CREATE | + Root.FLAG_LOCAL_ONLY, + cursor.getInt(1)); assertEquals(R.drawable.ic_root_mtp, cursor.getInt(2)); assertEquals("Device A Storage A", cursor.getString(3)); assertEquals("1", cursor.getString(4)); @@ -225,7 +229,8 @@ public class MtpDocumentsProviderTest extends AndroidTestCase { cursor.moveToNext(); cursor.moveToNext(); assertEquals("2", cursor.getString(0)); - assertEquals(Root.FLAG_SUPPORTS_IS_CHILD, cursor.getInt(1)); + assertEquals( + Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_LOCAL_ONLY, cursor.getInt(1)); assertEquals(R.drawable.ic_root_mtp, cursor.getInt(2)); assertEquals("Device B Storage B", cursor.getString(3)); assertEquals("2", cursor.getString(4)); @@ -271,7 +276,9 @@ public class MtpDocumentsProviderTest extends AndroidTestCase { cursor.moveToNext(); assertEquals("1", cursor.getString(0)); - assertEquals(Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE, cursor.getInt(1)); + assertEquals( + Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE | Root.FLAG_LOCAL_ONLY, + cursor.getInt(1)); assertEquals(R.drawable.ic_root_mtp, cursor.getInt(2)); assertEquals("Device A", cursor.getString(3)); assertEquals("1", cursor.getString(4)); @@ -279,7 +286,9 @@ public class MtpDocumentsProviderTest extends AndroidTestCase { cursor.moveToNext(); assertEquals("2", cursor.getString(0)); - assertEquals(Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE, cursor.getInt(1)); + assertEquals( + Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE | Root.FLAG_LOCAL_ONLY, + cursor.getInt(1)); assertEquals(R.drawable.ic_root_mtp, cursor.getInt(2)); assertEquals("Device B Storage B", cursor.getString(3)); assertEquals("2", cursor.getString(4)); diff --git a/packages/PrintSpooler/res/layout/print_activity.xml b/packages/PrintSpooler/res/layout/print_activity.xml index 2db6fb06480cda166a7126f828509c2e36dbf144..31a776c99e805dd47a5ee5d47ae07a1b7ca88766 100644 --- a/packages/PrintSpooler/res/layout/print_activity.xml +++ b/packages/PrintSpooler/res/layout/print_activity.xml @@ -16,7 +16,6 @@ @@ -28,12 +27,14 @@ android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingStart="8dip" + android:layout_marginEnd="16dp" android:elevation="@dimen/preview_controls_elevation" android:background="?android:attr/colorPrimary"> diff --git a/packages/PrintSpooler/res/values-zh-rCN/strings.xml b/packages/PrintSpooler/res/values-zh-rCN/strings.xml index 3debf8e60cdbcfca569914ab4483e41ec13860ab..d4e796339bc9a30943263177b572531c6dbb2166 100644 --- a/packages/PrintSpooler/res/values-zh-rCN/strings.xml +++ b/packages/PrintSpooler/res/values-zh-rCN/strings.xml @@ -60,7 +60,7 @@ 找到 %1$s 台打印机 "%1$s - %2$s" - "关于此打印机的更多信息" + "此打印机的详细信息" "无法创建文件" "部分打印服务已停用" "正在搜索打印机" diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml index c16e08a7c42838d21221d4c7e3680191ac539644..66f2f87fa31e90f9ad5dad61b91a3236cac57aef 100644 --- a/packages/SettingsLib/res/values-af/strings.xml +++ b/packages/SettingsLib/res/values-af/strings.xml @@ -28,7 +28,8 @@ "WiFi-verbinding het misluk" "Stawingsprobleem" "Nie binne ontvangs nie" - "Geen internettoegang bespeur nie, sal nie outomaties herkoppel nie." + "Geen internettoegang word bespeur nie, sal nie outomaties herkoppel nie." + "Geen internettoegang nie." "Gestoor deur %1$s" "Gekoppel via Wi-Fi-assistent" "Gekoppel via %1$s" @@ -233,8 +234,6 @@ "Wys snitgrense, kantlyne, ens." "Dwing RTL-uitlegrigting" "Dwing skermuitlegrigting na RTL vir alle locales" - "Wys CPU-verbruik" - "Skermlaag wys huidige CPU-gebruik" "Forseer GPU-lewering" "Dwing gebruik van GPU vir 2D-tekening" "Dwing 4x MSAA" @@ -341,4 +340,5 @@ "Grootste" "Gepasmaak (%d)" "Hulp en terugvoer" + "Kieslys" diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml index 6e9dcd7fc193fe714da03f112254186f8950f7c7..cfda4ab177d976afbbfabc886de0e2177e696c10 100644 --- a/packages/SettingsLib/res/values-am/strings.xml +++ b/packages/SettingsLib/res/values-am/strings.xml @@ -28,7 +28,8 @@ "የWiFi ግንኙነት መሰናከል" "የማረጋገጫ ችግር" "በክልል ውስጥ የለም" - "ምንም የበይነ መረብ መዳረሻ ተፈልጎ አልተገኘም፣ በራስ-ሰር እንደገና እንዲገናኝ አይደረግም።" + "ምንም የበይነ መረብ መዳረሻ አልተገኘም፣ በራስ-ሰር እንደገና እንዲገናኝ አይደረግም።" + "ምንም የበይነመረብ መዳረሻ የለም።" "የተቀመጠው በ%1$s" "በWi‑Fi ረዳት አማካኝነት ተገናኝቷል" "በ%1$s በኩል መገናኘት" @@ -233,8 +234,6 @@ "የቅንጥብ ገደቦች፣ ጠርዞች፣ ወዘተ አሳይ" "የቀኝ-ወደ-ግራ አቀማመጥ አቅጣጫ አስገድድ" "ለሁሉም አካባቢዎች የማያ ገጽ አቀማመጥ ከቀኝ-ወደ-ግራ እንዲሆን አስገድድ" - "የCPU አጠቃቀም አሳይ" - "የማያ ተደራቢ የአሁኑን የCPU አጠቃቀም እያሳየ ነው።" "GPU ምላሽ መስጠትን አስገድድ" "ለ2-ልኬት መሳል የGPU ስራ አስገድድ" "4x MSAA አስገድድ" @@ -341,4 +340,5 @@ "በጣም ተለቅ ያለ" "ብጁ (%d)" "እገዛ እና ግብረመልስ" + "ምናሌ" diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index ee579dc30b001ab98edee6dd6a00cc1aa6ca2aa9..e65feff40590fd6e90e46623bf7628bf5a4ffb92 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -28,7 +28,8 @@ "‏أخفق اتصال WiFi" "حدثت مشكلة في المصادقة" "ليست في النطاق" - "لم يتم اكتشاف اتصال بالإنترنت." + "لم يتم اكتشاف اتصال بالإنترنت، ولن تتم إعادة الاتصال تلقائيًا." + "لا يتوفر اتصال بالإنترنت." "تم الحفظ بواسطة %1$s" "‏تم التوصيل عبر مساعد Wi-Fi" "‏تم الاتصال عبر %1$s" @@ -233,8 +234,6 @@ "عرض حدود وهوامش المقطع وما إلى ذلك." "فرض اتجاه التنسيق ليكون من اليمين إلى اليسار" "فرض اتجاه تنسيق الشاشة ليكون من اليمين إلى اليسار لجميع اللغات" - "‏عرض استخدام CPU" - "‏عرض تراكب الشاشة لاستخدام CPU الحالي" "‏فرض عرض رسومات GPU" "فرض استخدام وحدة معالجة الرسومات للرسم ثنائي الأبعاد" "‏فرض 4x MSAA" @@ -329,7 +328,7 @@ "الشاشة الرئيسية للإعدادات" "٠‏٪" - "٪۵۰" + "٥٠٪" "٪۱۰۰" "قبل %1$s" @@ -341,4 +340,5 @@ "أكبر مستوى" "مخصص (%d)" "المساعدة والتعليقات" + "القائمة" diff --git a/packages/SettingsLib/res/values-az-rAZ/strings.xml b/packages/SettingsLib/res/values-az-rAZ/strings.xml index 60d0169be4b07c84610cb1179e903031c1122ffc..5aac49e14443c56b59025a4e1882cd8fb24719c8 100644 --- a/packages/SettingsLib/res/values-az-rAZ/strings.xml +++ b/packages/SettingsLib/res/values-az-rAZ/strings.xml @@ -28,7 +28,8 @@ "WiFi Bağlantı Uğursuzluğu" "Autentifikasiya problemi" "Diapazonda deyil" - "İnternet bağlantısı tapılmadı, avtomatik olaraq yenidən qoşulmayacaq." + "İnternet bağlantısı tapılmadı, avtomatik olaraq yenidən qoşulmayacaq." + "İnternet girişi yoxdur." "%1$s tərəfindən saxlandı" "Wi‑Fi köməkçisi vasitəsilə qoşulub" "%1$s vasitəsilə qoşuludur" @@ -233,8 +234,6 @@ "Klip sərhədləri, boşluqları və s. göstər" "RTL düzən istiqamətinə məcbur edin" "Ekran düzən istiqamətini RTL üzərinə bütün yerli variantlar üçün məcbur edin" - "CPU istifadəsini göstər" - "Ekran örtüşməsi cari CPU istifadəsini göstərir" "GPU renderə məcbur edin" "2d rəsm üçün GPU məcburi istifadə" "4x MSAA məcbur edin" @@ -341,4 +340,5 @@ "Ən böyük" "Fərdi (%d)" "Yardım və rəy" + "Menyu" diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml index 060a5fb15be3c487c0cc33932d593fb691136fb3..345c0bb5adcfde89eb3fbb4ec2df3340f01a5dd2 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml @@ -28,7 +28,8 @@ "Wi-Fi veza je otkazala" "Problem sa potvrdom autentičnosti" "Nije u opsegu" - "Pristup internetu nije otkriven, automatsko povezivanje nije moguće." + "Pristup internetu nije otkriven, automatsko povezivanje nije moguće." + "Nema pristupa internetu." "Sačuvao/la je %1$s" "Povezano preko Wi‑Fi pomoćnika" "Veza je uspostavljena preko pristupne tačke %1$s" @@ -233,8 +234,6 @@ "Prikaži granice klipa, margine itd." "Nametni smer rasporeda zdesna nalevo" "Nametni smer rasporeda ekrana zdesna nalevo za sve lokalitete" - "Prik. upotrebu procesora" - "Postav. element sa trenutnom upotrebom procesora" "Prinudni prikaz pom. GPU" "Prinudno koristi GPU za 2D crtanje" "Nametni 4x MSAA" @@ -282,7 +281,7 @@ "Pokrećite WebView prikazivače zasebno" "Primena WebView-a" "Podesite primenu WebView-a" - "Ovaj izbor više nije važeći. Pokušajte ponovo." + "Ovaj izbor više nije važeći. Probajte ponovo." "Konvertuj u šifrovanje datoteka" "Konvertuj..." "Već se koristi šifrovanje datoteka" @@ -341,4 +340,5 @@ "Najveći" "Prilagođeni (%d)" "Pomoć i povratne informacije" + "Meni" diff --git a/packages/SettingsLib/res/values-be-rBY/strings.xml b/packages/SettingsLib/res/values-be-rBY/strings.xml index 03de8bab32c14d06f061f38091e78fdacff63773..52077fb7c481c407b0deb999f8c4c8001536b6c2 100644 --- a/packages/SettingsLib/res/values-be-rBY/strings.xml +++ b/packages/SettingsLib/res/values-be-rBY/strings.xml @@ -28,7 +28,8 @@ "Збой падлучэння Wi-Fi" "Праблема аўтэнтыфікацыі" "Не ў зоне дасягальнасці" - "Доступ да інтэрнэту не выяўлены, аўтаматычнае перападлучэнне не адбудзецца." + "Доступ да інтэрнэту не выяўлены, аўтаматычнае перападключэнне не адбудзецца." + "Няма доступу да інтэрнэту." "Хто захаваў: %1$s" "Падлучана праз памочніка Wi‑Fi" "Падлучана праз %1$s" @@ -233,8 +234,6 @@ "Паказаць межы кліпу, палі і г. д." "Прымусовая раскладка справа налева" "Прымусовая раскладка экрана справа налева для ўсіх рэгіянальных налад" - "Паказаць выкарыстанне ЦП" - "Наклад на экран з бягучым выкарыстаннем працэсара" "Прымусовае адлюстраванне GPU" "Прымусовае выкарыстанне GPU для 2-мерных чарцяжоў" "Прымусовае выкананне 4x MSAA" @@ -341,4 +340,5 @@ "Найвялікшы" "Карыстальніцкі (%d)" "Даведка і водгукі" + "Меню" diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml index f6596dc48addeae54aa9ba9627826238a38efe33..eba51b37dc792531ac2997abd5669655038920c2 100644 --- a/packages/SettingsLib/res/values-bg/strings.xml +++ b/packages/SettingsLib/res/values-bg/strings.xml @@ -28,7 +28,8 @@ "Неуспешна връзка с Wi-Fi" "Проблем при удостоверяването" "Извън обхват" - "Не е открит достъп до интернет. Няма да се свърже отново автоматично." + "Не е открит достъп до интернет. Връзката няма да се възобнови автоматично." + "Няма достъп до интернет." "Запазено от %1$s" "Установена е връзка чрез помощника за Wi-Fi" "Установена е връзка през „%1$s“" @@ -233,8 +234,6 @@ "Показв. на границите на изрязване, полетата и др." "Принуд. оформл. отдясно наляво" "Принуд. оформл. на екрана отдясно наляво за вс. локали" - "Употреба на процесора" - "Наслагване на екрана показва употр. на процесора" "Принудително изобразяване" "Принуд. използв. на GPU за двуизмерно начертаване" "Задаване на 4x MSAA" @@ -341,4 +340,5 @@ "Най-голямо" "Персонализирано (%d)" "Помощ и отзиви" + "Меню" diff --git a/packages/SettingsLib/res/values-bn-rBD/strings.xml b/packages/SettingsLib/res/values-bn-rBD/strings.xml index 4a11198be5f96c3f209f74843d201606445930e1..4ad361bd39b919c49ed076c8648c044f5aee6435 100644 --- a/packages/SettingsLib/res/values-bn-rBD/strings.xml +++ b/packages/SettingsLib/res/values-bn-rBD/strings.xml @@ -28,7 +28,8 @@ "WiFi সংযোগের ব্যর্থতা" "প্রমাণীকরণ সমস্যা" "পরিসরের মধ্যে নয়" - "কোনো ইন্টারনেট অ্যাক্সেস শনাক্ত হয়নি, স্বয়ংক্রিয়ভাবে পুনরায় সংযোগ স্থাপন করবে না৷" + "কোনো ইন্টারনেট অ্যাক্সেস শনাক্ত হয়নি, স্বয়ংক্রিয়ভাবে পুনরায় সংযোগ স্থাপন করবে না৷" + "কোনো ইন্টারনেট অ্যাক্সেস নেই৷" "%1$s দ্বারা সংরক্ষিত" "ওয়াই-ফাই সহায়ক-এর মাধ্যমে সংযুক্ত হয়েছে" "%1$s মাধ্যমে সংযুক্ত হয়েছে" @@ -233,8 +234,6 @@ "ক্লিপ বাউন্ড, মার্জিন ইত্যাদি দেখান" "RTL লেআউট দিকনির্দেশ জোর দিন" "সমস্ত স্থানের জন্য RTL এ স্ক্রীন লেআউট দিকনির্দেশে জোর দেয়" - "CPU এর ব্যবহার দেখান" - "স্ক্রীন ওভারলে বর্তমান CPU ব্যবহার দেখাচ্ছে" "জোর করে GPU রেন্ডারিং করুন" "2D অঙ্কনের জন্য GPU-এর ব্যবহারে জোর দিন" "4x MSAA এ জোর দিন" @@ -341,4 +340,5 @@ "বৃহত্তম" "কাস্টম (%d)" "সহায়তা ও মতামত" + "মেনু" diff --git a/packages/SettingsLib/res/values-bs-rBA/strings.xml b/packages/SettingsLib/res/values-bs-rBA/strings.xml index 40a3630a4e55fef6da44b9b30a6b53e93e59fa61..8c7c4e0df94e11c8076dbb0622d13e28139a7662 100644 --- a/packages/SettingsLib/res/values-bs-rBA/strings.xml +++ b/packages/SettingsLib/res/values-bs-rBA/strings.xml @@ -28,7 +28,8 @@ "Greška pri povezivanju na Wi-Fi" "Problem pri provjeri vjerodostojnosti." "Nije u dometu" - "Pristup internetu nije pronađen. Neće se ponovo povezivati automatski." + "Pristup internetu nije pronađen. Neće se ponovo povezivati automatski." + "Nema pristupa internetu." "Sačuvao %1$s" "Povezani preko Wi-Fi pomoćnika" "Povezani preko %1$s" @@ -233,8 +234,6 @@ "Prikaži granice isječka, margine itd." "Prisilno postavi raspored s desna u lijevo" "Prisilno postavi raspored ekrana s desna u lijevo za sve regije" - "Prikaži korištenje CPU-a" - "Trenutno korištenje CPU-a prikazuje se u nadsloju preko ekrana" "Prisili GPU iscrtavanje" "Prisilno koristite GPU za 2d crtanje" "Prinudno primjeni 4x MSAA" @@ -341,4 +340,5 @@ "Najveće" "Prilagodi (%d)" "Pomoć i povratne informacije" + "Meni" diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index 99850a5d5cd437d69752cdb89f6eabd054fcd1af..20ae6b0ce23ab079cbee0ac6f736a60a4b2fc61f 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -28,7 +28,8 @@ "Error de connexió Wi-Fi" "Problema d\'autenticació" "Fora de l\'abast" - "No s\'ha detectat accés a Internet, no s\'hi tornarà a connectar automàticament." + "No s\'ha detectat accés a Internet; no s\'hi tornarà a connectar automàticament." + "No hi ha accés a Internet." "Desat per %1$s" "Connectat mitjançant l\'assistent de Wi‑Fi" "Connectada mitjançant %1$s" @@ -233,8 +234,6 @@ "Mostra els límits de clips, els marges, etc." "Força direcció dreta-esquerra" "Força direcció de pantalla dreta-esquerra en totes les llengües" - "Mostra l\'ús de la CPU" - "Superposa l\'ús de la CPU a la pantalla" "Força acceleració GPU" "Força l\'ús de GPU per a dibuixos en 2D" "Força MSAA 4x" @@ -341,4 +340,5 @@ "Màxim" "Personalitzat (%d)" "Ajuda i suggeriments" + "Menú" diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml index 361ba1f0cef2d02f087e313c21665854eedbfb22..bbc1266cd5544901753562eb718c9afe33532d71 100644 --- a/packages/SettingsLib/res/values-cs/strings.xml +++ b/packages/SettingsLib/res/values-cs/strings.xml @@ -28,7 +28,8 @@ "Selhání připojení Wi-Fi" "Problém s ověřením" "Mimo dosah" - "Nebyl zjištěn žádný přístup k internetu, připojení nebude automaticky obnoveno." + "Nebyl zjištěn žádný přístup k internetu, připojení nebude automaticky obnoveno." + "Není k dispozici přístup k internetu." "Uloženo uživatelem %1$s" "Připojeno pomocí asistenta připojení Wi-Fi" "Připojeno prostřednictvím %1$s" @@ -233,8 +234,6 @@ "Zobrazit u výstřižku ohraničení, okraje atd." "Vynutit rozvržení zprava doleva" "Vynutit ve všech jazycích rozvržení obrazovky zprava doleva" - "Zobrazit využití CPU" - "Překryvná vrstva s aktuálním využitím procesoru" "Vykreslování pomocí GPU" "Vynutit použití GPU pro 2D vykreslování" "Vynutit 4x MSAA" @@ -341,4 +340,5 @@ "Největší" "Vlastní (%d)" "Nápověda a zpětná vazba" + "Nabídka" diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml index 98f41fc8945db578b6c4d2b86d49b3e0af4e18f4..108d8dccd4191ce28b63f8780fa5a8867db918bf 100644 --- a/packages/SettingsLib/res/values-da/strings.xml +++ b/packages/SettingsLib/res/values-da/strings.xml @@ -28,7 +28,8 @@ "Wi-Fi-forbindelsesfejl" "Problem med godkendelse" "Ikke inden for rækkevidde" - "Der blev ikke fundet nogen internetadgang. Forbindelsen bliver ikke automatisk genoprettet." + "Der blev ikke fundet nogen internetadgang. Forbindelsen bliver ikke automatisk genoprettet." + "Ingen internetadgang." "Gemt af %1$s" "Forbindelse via Wi-Fi-assistent" "Tilsluttet via %1$s" @@ -151,7 +152,7 @@ "Tilbagekald tilladelser for USB-fejlfinding" "Genvej til fejlrapporting" "Vis en knap til oprettelse af fejlrapporter i menu for slukknap" - "Undgå dvale" + "Lås ikke" "Skærmen går ikke i dvale under opladning" "Aktivér Bluetooth HCI snoop log" "Gem alle Bluetooth HCI-pakker i en fil" @@ -233,8 +234,6 @@ "Vis grænser for klip, margener osv." "Tving læsning mod venstre" "Tving til højre mod venstre-layout for alle sprog" - "Vis CPU-forbrug" - "Skærmoverlejring viser det aktuelle CPU-forbrug" "Tving gengivelse af GPU" "Gennemtving brug af GPU til 2D-tegning" "Tving 4x MSAA" @@ -341,4 +340,5 @@ "Størst" "Tilpasset (%d)" "Hjælp og feedback" + "Menu" diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index c9da6c96c0ffb316fa8e6d3da00681930ba155a9..d93dbac8965d700d13d9b1dd0c94d031023bfca6 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -28,7 +28,8 @@ "WLAN-Verbindungsfehler" "Authentifizierungsproblem" "Nicht in Reichweite" - "Keine Internetverbindung erkannt, es kann nicht automatisch eine Verbindung hergestellt werden." + "Keine Internetverbindung erkannt. Es kann nicht automatisch eine Verbindung hergestellt werden." + "Kein Internetzugriff." "Gespeichert von %1$s" "Über WLAN-Assistenten verbunden" "Über %1$s verbunden" @@ -38,7 +39,7 @@ "Verbindung wird getrennt..." "Verbindung wird hergestellt..." "Verbunden" - "Pairing läuft…" + "Kopplung läuft…" "Verbunden (kein Telefon)" "Verbunden (außer Audiomedien)" "Verbunden (ohne Nachrichtenzugriff)" @@ -69,12 +70,12 @@ "Für Audiosystem des Telefons verwenden" "Für Dateiübertragung verwenden" "Für Eingabe verwenden" - "Pairing durchführen" - "Pairing durchführen" + "Koppeln" + "KOPPELN" "Abbrechen" - "Über das Pairing kann auf deine Kontakte und auf deinen Anrufverlauf zugegriffen werden, wenn eine Verbindung besteht." - "Pairing mit %1$s war nicht möglich." - "Pairing mit %1$s war nicht möglich, weil die eingegebene PIN oder der Zugangscode falsch ist." + "Über die Kopplung kann auf deine Kontakte und auf deinen Anrufverlauf zugegriffen werden, wenn eine Verbindung besteht." + "Kopplung mit %1$s war nicht möglich." + "Kopplung mit %1$s war nicht möglich, weil die eingegebene PIN oder der Zugangscode falsch ist." "Kommunikation mit %1$s ist nicht möglich." "Verbindung wurde von %1$s abgelehnt." "WLAN: aus" @@ -233,8 +234,6 @@ "Clip-Begrenzungen, Ränder usw. anzeigen" "RTL-Layout erzwingen" "RTL-Bildschirmlayout für alle Sprachen erzwingen" - "CPU-Auslastung anzeigen" - "Bildschirm-Overlay mit aktueller CPU-Auslastung" "GPU-Rendering erzwingen" "Einsatz von GPU für 2D-Zeichnung erzwingen" "4x MSAA erzwingen" @@ -341,4 +340,5 @@ "Am größten" "Benutzerdefiniert (%d)" "Hilfe & Feedback" + "Menü" diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml index 05e4e64c383f79e39858af5ca1a1011956cb785d..6bbc11c73d28da8c76b1c9a59c9ad0b4db240b3a 100644 --- a/packages/SettingsLib/res/values-el/strings.xml +++ b/packages/SettingsLib/res/values-el/strings.xml @@ -28,7 +28,8 @@ "Αποτυχία σύνδεσης Wi-Fi" "Πρόβλημα ελέγχου ταυτότητας" "Εκτός εμβέλειας" - "Δεν εντοπίστηκε καμία πρόσβαση στο διαδίκτυο, δεν θα γίνει αυτόματη επανασύνδεση." + "Δεν εντοπίστηκε πρόσβαση στο διαδίκτυο. Δεν θα πραγματοποιηθεί αυτόματη επανασύνδεση." + "Δεν υπάρχει πρόσβαση στο διαδίκτυο." "Αποθηκεύτηκε από %1$s" "Σύνδεση μέσω βοηθού Wi‑Fi" "Συνδέθηκε μέσω %1$s" @@ -233,8 +234,6 @@ "Εμφάνιση ορίων κλιπ, περιθωρίων, κλπ." "Επιβολή κατ. διάταξης RTL" "Επιβολή διάταξης οθόν. RTL για όλες τις τοπ. ρυθμ." - "Προβολή χρήσης CPU" - "Επικάλυψη οθόνης για προβολή τρέχουσας χρήσης CPU" "Αναγκαστική απόδοση GPU" "Αναγκαστική χρήση του GPU για σχέδιο 2D" "Αναγκαστικά 4x MSAA" @@ -287,8 +286,8 @@ "Μετατροπή…" "Με κρυπτογράφηση αρχείου" "Μετατροπή σε κρυπτογράφηση βάσει αρχείου…" - "Μετατροπή τμήματος δεδομένων σε κρυπτογράφηση βάσει αρχείου.\n !!Προσοχή!! Με αυτήν την ενέργεια, θα διαγραφούν όλα τα δεδομένα σας.\n Αυτή η λειτουργία βρίσκεται σε δοκιμαστικό στάδιο alpha και ενδέχεται να μην λειτουργεί σωστά.\n Πατήστε \"Εκκαθάριση και μετατροπή…\" για να συνεχίσετε." - "Εκκαθάριση και μετατροπή…" + "Μετατροπή τμήματος δεδομένων σε κρυπτογράφηση βάσει αρχείου.\n !!Προσοχή!! Με αυτήν την ενέργεια, θα διαγραφούν όλα τα δεδομένα σας.\n Αυτή η λειτουργία βρίσκεται σε δοκιμαστικό στάδιο alpha και ενδέχεται να μην λειτουργεί σωστά.\n Πατήστε \"Διαγραφή και μετατροπή…\" για να συνεχίσετε." + "Διαγραφή και μετατροπή…" "Λειτουργία χρώματος εικόνας" "Χρήση sRGB" "Απενεργοποιημένο" @@ -341,4 +340,5 @@ "Μεγαλύτερα" "Προσαρμοσμένη (%d)" "Βοήθεια και σχόλια" + "Μενού" diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml index 799802b86b3a17c1a16fd398da2d58fe81e63d50..a571affde0777bcb1f78aa99099db83a58eb101f 100644 --- a/packages/SettingsLib/res/values-en-rAU/strings.xml +++ b/packages/SettingsLib/res/values-en-rAU/strings.xml @@ -28,7 +28,8 @@ "Wi-Fi Connection Failure" "Authentication problem" "Not in range" - "No Internet Access Detected, won\'t automatically reconnect." + "No Internet access detected, won\'t automatically reconnect." + "No Internet Access." "Saved by %1$s" "Connected via Wi‑Fi assistant" "Connected via %1$s" @@ -233,8 +234,6 @@ "Show clip bounds, margins, etc." "Force RTL layout direction" "Force screen layout direction to RTL for all locales" - "Show CPU usage" - "Screen overlay showing current CPU usage" "Force GPU rendering" "Force use of GPU for 2D drawing" "Force 4x MSAA" @@ -341,4 +340,5 @@ "Largest" "Custom (%d)" "Help & feedback" + "Menu" diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml index 799802b86b3a17c1a16fd398da2d58fe81e63d50..a571affde0777bcb1f78aa99099db83a58eb101f 100644 --- a/packages/SettingsLib/res/values-en-rGB/strings.xml +++ b/packages/SettingsLib/res/values-en-rGB/strings.xml @@ -28,7 +28,8 @@ "Wi-Fi Connection Failure" "Authentication problem" "Not in range" - "No Internet Access Detected, won\'t automatically reconnect." + "No Internet access detected, won\'t automatically reconnect." + "No Internet Access." "Saved by %1$s" "Connected via Wi‑Fi assistant" "Connected via %1$s" @@ -233,8 +234,6 @@ "Show clip bounds, margins, etc." "Force RTL layout direction" "Force screen layout direction to RTL for all locales" - "Show CPU usage" - "Screen overlay showing current CPU usage" "Force GPU rendering" "Force use of GPU for 2D drawing" "Force 4x MSAA" @@ -341,4 +340,5 @@ "Largest" "Custom (%d)" "Help & feedback" + "Menu" diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml index 799802b86b3a17c1a16fd398da2d58fe81e63d50..a571affde0777bcb1f78aa99099db83a58eb101f 100644 --- a/packages/SettingsLib/res/values-en-rIN/strings.xml +++ b/packages/SettingsLib/res/values-en-rIN/strings.xml @@ -28,7 +28,8 @@ "Wi-Fi Connection Failure" "Authentication problem" "Not in range" - "No Internet Access Detected, won\'t automatically reconnect." + "No Internet access detected, won\'t automatically reconnect." + "No Internet Access." "Saved by %1$s" "Connected via Wi‑Fi assistant" "Connected via %1$s" @@ -233,8 +234,6 @@ "Show clip bounds, margins, etc." "Force RTL layout direction" "Force screen layout direction to RTL for all locales" - "Show CPU usage" - "Screen overlay showing current CPU usage" "Force GPU rendering" "Force use of GPU for 2D drawing" "Force 4x MSAA" @@ -341,4 +340,5 @@ "Largest" "Custom (%d)" "Help & feedback" + "Menu" diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index 08e739a00f50935966c5ff48a330f1efa98ffb5d..924c18ad92fd206ecfa35350fda93fb25e5a3da2 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -28,7 +28,8 @@ "Error de conexión Wi-Fi" "Problema de autenticación" "Fuera de alcance" - "No se detectó el acceso a Internet. No se volverá a conectar de forma automática." + "No se detectó el acceso a Internet. No se volverá a conectar de forma automática." + "No se detectó el acceso a Internet." "Guardadas por %1$s" "Conexión por asistente de Wi-Fi" "Conexión a través de %1$s" @@ -233,8 +234,6 @@ "Mostrar límites de recortes, márgenes, etc." "Forzar diseño der. a izq." "Forzar diseño pantalla der.>izq., cualquier idioma" - "Mostrar el uso de CPU" - "Mostrar superposición en pantalla con uso actual de la CPU" "Forzar representación GPU" "Forzar uso de GPU para dibujar en 2d" "Forzar MSAA 4x" @@ -341,4 +340,5 @@ "Máximo" "Personalizado (%d)" "Ayuda y comentarios" + "Menú" diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index 3d2f6c132da0324de154905affa7dae4cd148d64..7824949072223d0c2e7c9bd4524b52c99236b552 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -28,7 +28,8 @@ "Error de conexión Wi-Fi" "Error de autenticación" "Fuera de rango" - "No se ha detectado acceso a Internet, no se volverá a conectar automáticamente." + "No se ha detectado acceso a Internet, por lo que no se volverá a conectar automáticamente." + "No se ha detectado acceso a Internet." "Guardadas por %1$s" "Conectado a través de asistente Wi‑Fi" "Conectado a través de %1$s" @@ -173,7 +174,7 @@ "Aumentar el nivel de logging de Wi-Fi, mostrar por SSID RSSI en el selector Wi-Fi" "Si está habilitada, la conexión Wi‑Fi será más agresiva al transferir la conexión de datos al móvil (si la señal Wi‑Fi no es estable)" "Permitir/No permitir búsquedas de Wi-Fi basadas en la cantidad de tráfico de datos presente en la interfaz" - "Tamaños del búfer de Logger" + "Tamaños de búfer de registrador" "Elige el tamaño del Logger por búfer" "¿Borrar almacenamiento continuo del registrador?" "Cuando ya no supervisamos la actividad con el registrador de forma continua, estamos obligados a borrar los datos del registrador almacenados en el dispositivo." @@ -233,8 +234,6 @@ "Mostrar límites de vídeo, márgenes, etc." "Forzar dirección diseño RTL" "Forzar dirección (RTL) para todas configuraciones" - "Mostrar uso de la CPU" - "Suporponer el uso de la CPU en la pantalla" "Forzar aceleración GPU" "Forzar uso de GPU para dibujos en 2D" "Forzar MSAA 4x" @@ -341,4 +340,5 @@ "Lo más grande posible" "Personalizado (%d)" "Ayuda y sugerencias" + "Menú" diff --git a/packages/SettingsLib/res/values-et-rEE/strings.xml b/packages/SettingsLib/res/values-et-rEE/strings.xml index a7b0f64f9a4d3d739658d0b68de19afe7753b4e9..5f76b9fd9723b435ce0e39a7e1cc22796a5aea30 100644 --- a/packages/SettingsLib/res/values-et-rEE/strings.xml +++ b/packages/SettingsLib/res/values-et-rEE/strings.xml @@ -28,7 +28,8 @@ "WiFi-ühenduse viga" "Autentimise probleem" "Pole vahemikus" - "Interneti-ühendust ei tuvastatud, seadet ei ühendata automaatselt." + "Interneti-ühendust ei tuvastatud, seadet ei ühendata automaatselt uuesti." + "Interneti-ühendus puudub." "Salvestas: %1$s" "Ühendatud WiFi-abi kaudu" "Ühendatud üksuse %1$s kaudu" @@ -233,8 +234,6 @@ "Kuva klipi piirid, veerised jms" "Paremalt vasakule paig." "Määra lokaatides ekraanipaig. paremalt vasakule" - "CPU-kasutuse kuvamine" - "Praegust CPU-kasutust kuvav ekraani ülekate" "Jõusta GPU renderdamine" "Jõusta GPU kasutam. kahemõõtmeliste jooniste puhul" "Jõusta 4x MSAA" @@ -341,4 +340,5 @@ "Suurim" "Kohandatud (%d)" "Abi ja tagasiside" + "Menüü" diff --git a/packages/SettingsLib/res/values-eu-rES/strings.xml b/packages/SettingsLib/res/values-eu-rES/strings.xml index f476511b8106ce396aa0f3d4cf881e2d0e4e9e12..abcf2828e2c014ff8330acbfc78acef54fbcd55a 100644 --- a/packages/SettingsLib/res/values-eu-rES/strings.xml +++ b/packages/SettingsLib/res/values-eu-rES/strings.xml @@ -28,7 +28,8 @@ "Ezin izan da konektatu Wi-Fi sarera" "Autentifikazio-arazoa" "Urrunegi" - "Ez da hauteman Interneterako sarbiderik. Ez da automatikoki berriro konektatuko." + "Ez da hauteman Interneterako sarbiderik. Ez da automatikoki berriro konektatuko." + "Ezin da konektatu Internetera." "%1$s aplikazioak gorde du" "Wi‑Fi laguntzailearen bidez konektatuta" "%1$s bidez konektatuta" @@ -233,8 +234,6 @@ "Erakutsi kliparen mugak, marjinak, etab." "Behartu eskuin-ezker norabidea." "Behartu pantaila-diseinuaren norabidea eskuin-ezker izatera eskualdeko ezarpen guztiekin." - "Erakutsi PUZ erabilera" - "PUZ erabilera erakusten duen pantaila-gainjartzea" "Behartu GPU errendatzea" "Behartu GPUa erabiltzera 2 dimentsioko marrazkietan." "Behartu 4x MSAA" @@ -341,4 +340,5 @@ "Handiena" "Pertsonalizatua (%d)" "Laguntza eta iritziak" + "Menua" diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index 44918513bcd753a372f2547698f31db7f7e0f8b3..c573b687967e1086481c19b3752d4d4043fcccca 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -28,7 +28,8 @@ "‏اتصال Wi-Fi برقرار نشد" "مشکل احراز هویت" "در محدوده نیست" - "دسترسی به اینترنت شناسایی نشد، به صورت خودکار وصل نمی‌شود." + "دسترسی به اینترنت شناسایی نشد، به‌صورت خودکار وصل نمی‌شود." + "دسترسی به اینترنت وجود ندارد." "ذخیره‌شده توسط %1$s" "‏متصل شده از طریق دستیار Wi-Fi" "‏متصل از طریق %1$s" @@ -183,7 +184,7 @@ "‏انتخاب پیکربندی USB" "مکان‌های کاذب مجاز هستند" "مکان‌های کاذب مجاز هستند" - "فعال کردن بازبینی ویژگی بازدید" + "فعال کردن نمایش بازبینی ویژگی" "‏داده سلولی همیشه فعال نگه داشته می‌شود، حتی وقتی Wi-Fi فعال است (برای جابه‌جایی سریع شبکه)." "‏اشکال‌زدایی USB انجام شود؟" "‏اشکال‌زدایی USB فقط برای اهداف برنامه‌نویسی در نظر گرفته شده است. از آن برای رونوشت‌برداری داده بین رایانه و دستگاهتان، نصب برنامه‌ها در دستگاهتان بدون اعلان و خواندن داده‌های گزارش استفاده کنید." @@ -233,8 +234,6 @@ "نمایش مرزها، حاشیه‌ها و ویژگی‌های دیگر کلیپ." "‏اجباری کردن چیدمان RTL" "‏اجباری کردن چیدمان RTL صفحه برای همه زبان‌ها" - "‏نمایش میزان استفاده از CPU" - "‏هم‌پوشانی صفحه‌نمایش میزان استفاده از CPU فعلی" "‏پردازش اجباری GPU" "‏استفاده اجباری از GPU برای طراحی دوم" "‏اجبار 4x MSAA" @@ -341,4 +340,5 @@ "بزرگ‌ترین" "سفارشی (%d)" "راهنما و بازخورد" + "منو" diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml index cdef968d90aa5939c6d304fae1a55d5d12f9b905..05f786addec2309a1fd8a2411faba8ad6d35ce32 100644 --- a/packages/SettingsLib/res/values-fi/strings.xml +++ b/packages/SettingsLib/res/values-fi/strings.xml @@ -28,7 +28,8 @@ "Wi-Fi-yhteysvirhe" "Todennusvirhe" "Ei kantoalueella" - "Internetyhteyttä ei havaittu, yhteyttä ei muodosteta automaattisesti uudelleen." + "Internetyhteyttä ei havaittu. Yhteyttä ei muodosteta automaattisesti uudelleen." + "Ei internetyhteyttä" "Tallentaja: %1$s" "Yhteys muodostettu Wi‑Fi-apurin kautta" "Yhdistetty seuraavan kautta: %1$s" @@ -233,8 +234,6 @@ "Näytä leikkeiden rajat, marginaalit jne." "Pakota RTL-ulkoasun suunta" "Pakota kaikkien kielten näytön ulkoasun suunnaksi RTL" - "Näytä suorittimen käyttö" - "Näytön peittokuva näyttää nykyisen suoritinkäytön" "Pakota GPU-hahmonnus" "Käytä GPU:ta 2d-piirtämiseen" "Pakota 4x MSAA" @@ -341,4 +340,5 @@ "Suurin" "Muokattu (%d)" "Ohje ja palaute" + "Valikko" diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index 958b8fd4d5d3d30bf7a938e630acc413f7f4274d..25384434313c80634925076fd70311b2dbe8b233 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -28,7 +28,8 @@ "Échec de connexion Wi-Fi" "Problème d\'authentification" "Hors de portée" - "Aucun accès à Internet détecté, reconnexion automatique impossible" + "Aucun accès à Internet détecté, reconnexion automatique impossible." + "Aucun accès à Internet." "Enregistrés par %1$s" "Connecté à l\'aide de l\'assistant Wi-Fi" "Connecté par %1$s" @@ -233,8 +234,6 @@ "Afficher les limites, les marges de clip, etc." "Forcer orient. : g. à d." "Forcer l\'orientation: g. à droite (toutes langues)" - "Afficher mém. CPU utilisée" - "Superposition écran indiquant mémoire CPU utilisée" "Forcer le rendu GPU" "Forcer l\'utilisation du GPU pour le dessin 2D" "Forcer MSAA 4x" @@ -341,4 +340,5 @@ "La plus grande" "Personnalisée (%d)" "Aide et commentaires" + "Menu" diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index cf08f3b5f237f8debda407aceaa9a979e0b01138..3b5491f5ca33d3585a4c6d09a43235f0d541ae54 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -28,7 +28,8 @@ "Échec de la connexion Wi-Fi" "Problème d\'authentification." "Hors de portée" - "Aucun accès à Internet détecté, reconnexion automatique impossible" + "Aucun accès à Internet détecté. Reconnexion automatique impossible." + "Aucun accès à Internet" "Enregistré par %1$s" "Connecté via l\'assistant Wi‑Fi" "Connecté via %1$s" @@ -233,8 +234,6 @@ "Afficher les limites de coupe, les marges, etc." "Forcer droite à gauche" "Forcer orient. droite à gauche pour toutes langues" - "Afficher mém. CPU utilisée" - "Superposition écran indiquant mémoire CPU utilisée" "Forcer le rendu GPU" "Forcer l\'utilisation du GPU pour le dessin 2D" "Forcer MSAA 4x" @@ -341,4 +340,5 @@ "Le plus grand" "Personnalisé (%d)" "Aide et commentaires" + "Menu" diff --git a/packages/SettingsLib/res/values-gl-rES/strings.xml b/packages/SettingsLib/res/values-gl-rES/strings.xml index cdc4581ca80ca078629f43aed9853f087e61b982..dcd45a85dd301d165e1a64b023b7cd0cee2fb067 100644 --- a/packages/SettingsLib/res/values-gl-rES/strings.xml +++ b/packages/SettingsLib/res/values-gl-rES/strings.xml @@ -28,7 +28,8 @@ "Erro na conexión wifi" "Problema de autenticación" "Non está dentro da zona de cobertura" - "Non se detectou acceso a Internet e non se volverá conectar automaticamente." + "Non se detectou acceso a Internet e non se volverá establecer conexión automaticamente." + "Non hai acceso a Internet." "Redes gardadas por %1$s" "Conectado ao asistente de wifi" "Conectado a través de %1$s" @@ -233,8 +234,6 @@ "Mostra os límites dos clips, as marxes, etc." "Forzar dirección do deseño RTL" "Forza a dirección de pantalla a RTL (dereita a esquerda) para todas as configuración rexionais" - "Mostrar uso da CPU" - "Superpoñer o uso da CPU na pantalla" "Forzar procesamento GPU" "Forzar o uso de GPU para o debuxo en 2D" "Forzar MSAA 4x" @@ -341,4 +340,5 @@ "O máis grande" "Personalizado (%d)" "Axuda e suxestións" + "Menú" diff --git a/packages/SettingsLib/res/values-gu-rIN/strings.xml b/packages/SettingsLib/res/values-gu-rIN/strings.xml index 1b40e01737d1e2704c9ea86bfa91d463fef86f4b..554ca40a751b052148d25f8c90c94f57f23d5784 100644 --- a/packages/SettingsLib/res/values-gu-rIN/strings.xml +++ b/packages/SettingsLib/res/values-gu-rIN/strings.xml @@ -28,7 +28,8 @@ "WiFi કનેક્શન નિષ્ફળ" "પ્રમાણીકરણ સમસ્યા" "રેન્જમાં નથી" - "કોઈ ઇન્ટરનેટ અ‍ૅક્સેસ શોધાયું નથી, આપમેળે ફરીથી કનેક્ટ કરશે નહીં." + "કોઈ ઇન્ટરનેટ અ‍ૅક્સેસ મળી નથી, આપમેળે ફરીથી કનેક્ટ કરશે નહીં." + "કોઈ ઇન્ટરનેટ ઍક્સેસ નથી." "%1$s દ્વારા સચવાયું" "Wi-Fi સહાયક દ્વારા કનેક્ટ થયું" "%1$s દ્વારા કનેક્ટ થયેલ" @@ -233,8 +234,6 @@ "ક્લિપ બાઉન્ડ્સ, હાંસિયાં વગેરે બતાવો." "RTL લેઆઉટ દિશા નિર્દેશની ફરજ પાડો" "તમામ લૉકેલ્સ માટે સ્ક્રીન લેઆઉટ દિશા નિર્દેશને RTL ની ફરજ પાડો" - "CPU સંગ્રહ બતાવો" - "વર્તમાન CPU વપરાશ દર્શાવતું સ્ક્રીન ઓવરલે" "GPU રેન્ડરિંગની ફરજ પાડો" "2જા રેખાંકન માટે GPU ના ઉપયોગની ફરજ પાડો" "4x MSAA ને ફરજ પાડો" @@ -341,4 +340,5 @@ "સૌથી મોટું" "કસ્ટમ (%d)" "સહાય અને પ્રતિસાદ" + "મેનુ" diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index 8dfbb4a58780c832d6cebffec411a08d5b23de48..fb6f181e6b20d32083dbe3dc6dbe33396bc76c29 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -28,7 +28,8 @@ "वाईफ़ाई कनेक्‍शन विफलता" "प्रमाणीकरण समस्या" "रेंज में नहीं" - "किसी इंटरनेट कनेक्‍शन का पता नहीं चला, अपने आप पुन: कनेक्‍ट नहीं हो सकता." + "किसी इंटरनेट कनेक्‍शन का पता नहीं चला, अपने आप फिर से कनेक्‍ट नहीं हो सकता." + "कोई इंटरनेट एक्सेस नहीं." "%1$s के द्वारा सहेजा गया" "वाई-फ़ाई सहायक के द्वारा कनेक्‍ट है" "%1$s के द्वारा उपलब्ध" @@ -233,8 +234,6 @@ "क्लिप सीमाएं, मार्जिन, आदि दिखाएं." "RTL लेआउट दिशा लागू करें" "सभी भाषाओं के लिए स्क्रीन लेआउट दिशा को RTL रखें" - "CPU उपयोग दिखाएं" - "स्‍क्रीन ओवरले वर्तमान CPU उपयोग को दिखा रहा है" "बलपूर्वक GPU रेंडर करें" "2d ड्रॉइंग के लिए GPU का बलपूर्वक उपयोग करें" "4x MSAA को बाध्य करें" @@ -341,4 +340,5 @@ "सबसे बड़ा" "कस्टम (%d)" "सहायता और फ़ीडबैक" + "मेनू" diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml index 07e492581d4187e9af75d36227c1ab59c5874b53..619826d274f495f0235347ee2b182a05e701b683 100644 --- a/packages/SettingsLib/res/values-hr/strings.xml +++ b/packages/SettingsLib/res/values-hr/strings.xml @@ -28,7 +28,8 @@ "Povezivanje s Wi-Fi-jem nije uspjelo" "Problem u autentifikaciji" "Nije u rasponu" - "Pristup internetu nije otkriven. Nema automatskog ponovnog povezivanja." + "Pristup internetu nije otkriven. Nema automatskog ponovnog povezivanja." + "Nema pristupa internetu." "Spremljeno: %1$s" "Povezani putem pomoćnika za Wi-Fi" "Povezano putem %1$s" @@ -233,8 +234,6 @@ "Prikazuju se obrubi, margine itd. isječaka." "Nametni zdesna ulijevo" "Nametni smjer zdesna ulijevo za sve zemlje/jezike" - "Prikaži upotrebu procesora" - "Na zaslonu se prikazuje iskorištenost procesora." "Nametni GPU renderiranje" "Nametni upotrebu GPU-a za 2D crteže" "Nametni 4x MSAA" @@ -341,4 +340,5 @@ "Najveće" "Prilagođeno (%d)" "Pomoć i povratne informacije" + "Izbornik" diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml index 0d8ec26eb6686b43bb771508a4cc2a7faf9740d6..e389c0093a9e930e53187134b0362df49c15d4d3 100644 --- a/packages/SettingsLib/res/values-hu/strings.xml +++ b/packages/SettingsLib/res/values-hu/strings.xml @@ -28,7 +28,8 @@ "Wi-Fi-kapcsolati hiba" "Azonosítási probléma" "Hatókörön kívül" - "Nincs érzékelhető internet-hozzáférés, ezért nem kapcsolódik újra automatikusan." + "Nincs érzékelhető internet-hozzáférés, ezért nem kapcsolódik újra automatikusan." + "Nincs internet-hozzáférés." "Mentette: %1$s" "Csatlakozva Wi‑Fi-segéddel" "Csatlakozva a következőn keresztül: %1$s" @@ -233,8 +234,6 @@ "Kliphatárok, margók stb. megjelenítése." "Elrendezés jobbról balra" "Elrendezés jobbról balra minden nyelvnél" - "CPU-használat mutatása" - "Képernyőfedvény a jelenlegi CPU-használattal" "GPU-megjelenítés" "GPU használatának kényszerítése 2D rajzhoz" "4x MSAA kényszerítése" @@ -341,4 +340,5 @@ "Legnagyobb" "Egyéni (%d)" "Súgó és visszajelzés" + "Menü" diff --git a/packages/SettingsLib/res/values-hy-rAM/strings.xml b/packages/SettingsLib/res/values-hy-rAM/strings.xml index cb12fbfaf502b734ee4d226b3cc1e746857c7f42..8d2d78efc45c5b0f720667691323880d62114dfe 100644 --- a/packages/SettingsLib/res/values-hy-rAM/strings.xml +++ b/packages/SettingsLib/res/values-hy-rAM/strings.xml @@ -28,7 +28,8 @@ "WiFi կապի ձախողում" "Նույնականացման խնդիր" "Ընդգրկույթից դուրս է" - "Ինտերնետի հասանելիություն չկա. ավտոմատ կերպով կրկին չի միանա:" + "Ինտերնետ կապ չկա, ինչի պատճառով ավտոմատ վերամիացում չի կատարվի:" + "Ինտերնետ կապ չկա:" "Պահել է հետևյալ օգտվողը՝ %1$s" "Կապակցված է Wi‑Fi Օգնականի միջոցով" "Կապակցված է %1$s-ի միջոցով" @@ -38,7 +39,7 @@ "Անջատվում է..." "Միանում է..." "Միացված է" - "Զուգավորում..." + "Զուգակցում..." "Միացված (առանց հեռախոսի)" "Միացված է (առանց մեդիա)" "Միացված է (հաղորդագրությանը մուտք չկա)" @@ -72,7 +73,7 @@ "Զուգավորել" "Զուգավորել" "Չեղարկել" - "Զուգավորում է մուտքի թույլտվությունը դեպի ձեր կոնտակտները և զանգերի պատմությունը, երբ միացված է:" + "Զուգակցում է մուտքի թույլտվությունը դեպի ձեր կոնտակտները և զանգերի պատմությունը, երբ միացված է:" "Չհաջողվեց զուգավորել %1$s-ի հետ:" "Հնարավոր չեղավ զուգավորվել %1$s-ի հետ սխալ PIN-ի կամ անցաբառի պատճառով:." "Հնարավոր չէ կապ հաստատել %1$s-ի հետ:" @@ -233,8 +234,6 @@ "Ցույց տալ կտրվածքի սահմանները, լուսանցքները և այլն" "Փոխել RTL-ի դասավորության ուղղությունը" "Դարձնել էկրանի դասավորության ուղղությունը դեպի RTL բոլոր լեզուների համար" - "Ցույց տալ CPU-ի աշխատանքը" - "Էկրանի վերադրումը ցույց է տալիս ընթացիկ CPU օգտագործումը" "Ստիպել GPU-ին մատուցել" "Ստիպողաբար GPU-ի օգտագործում 2-րդ պատկերի համար" "Ստիպել 4x MSAA" @@ -341,4 +340,5 @@ "Ամենամեծ" "Հատուկ (%d)" "Օգնություն և հետադարձ կապ" + "Ընտրացանկ" diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index ffdb6074557166fc410e73d10adb0d9bd2e265b2..0e0d32f0065d93bc9ebfef36a6f3bdf0a330164c 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -28,7 +28,8 @@ "Kegagalan Sambungan Wi-Fi" "Masalah autentikasi" "Tidak dalam jangkauan" - "Akses Internet Tidak Terdeteksi, tidak akan menyambung ulang secara otomatis." + "Akses Internet Tidak Terdeteksi, tidak akan menyambung ulang secara otomatis." + "Tidak Ada Akses Internet." "Disimpan oleh %1$s" "Terhubung melalui Asisten Wi-Fi" "Terhubung melalui %1$s" @@ -233,8 +234,6 @@ "Tampilkan batas klip, margin, dll." "Paksa arah tata letak RTL" "Paksa arah tata letak layar RTL untuk semua lokal" - "Tampilkan penggunaan CPU" - "Hamparan layar menampilkan penggunaan CPU saat ini" "Paksa perenderan GPU" "Paksa penggunaan GPU untuk gambar 2d" "Force 4x MSAA" @@ -341,4 +340,5 @@ "Terbesar" "(%d) khusus" "Bantuan & masukan" + "Menu" diff --git a/packages/SettingsLib/res/values-is-rIS/strings.xml b/packages/SettingsLib/res/values-is-rIS/strings.xml index 25e13a4d69d8665ee24bcad7a116ffd4fb2cb9ed..d1c177bcd44d98384772503c25a93d63347340bb 100644 --- a/packages/SettingsLib/res/values-is-rIS/strings.xml +++ b/packages/SettingsLib/res/values-is-rIS/strings.xml @@ -28,7 +28,8 @@ "WiFi-tengingarvilla" "Vandamál við auðkenningu" "Ekkert samband" - "Enginn netaðgangur fannst; endurtengist ekki sjálfkrafa." + "Enginn netaðgangur fannst, endurtengist ekki sjálfkrafa." + "Enginn netaðgangur." "%1$s vistaði" "Tengt í gegnum Wi-Fi aðstoð" "Tengt í gegnum %1$s" @@ -233,8 +234,6 @@ "Sýna skurðlínur, spássíur o.s.frv." "Þvinga umbrot frá hægri til vinstri" "Þvinga umbrot skjás frá hægri til vinstri fyrir alla tungumálskóða" - "Sýna örgjörvanotkun" - "Skjáyfirlögn sem sýnir núverandi örgjörvanotkun" "Þvinga skjákortsteiknun" "Þvinga notkun skjákorts fyrir tvívíða teikningu" "Þvinga 4x MSAA" @@ -341,4 +340,5 @@ "Stærst" "Sérsniðið (%d)" "Hjálp og ábendingar" + "Valmynd" diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml index cb323a29c4994f32665e2b9d8a178045d63cf7eb..c566e79a7f0a2b27205b8e6c041f1958c74fd88a 100644 --- a/packages/SettingsLib/res/values-it/strings.xml +++ b/packages/SettingsLib/res/values-it/strings.xml @@ -28,7 +28,8 @@ "Errore connessione Wi-Fi" "Problema di autenticazione" "Fuori portata" - "Nessun accesso a Internet rilevato, non verrà eseguita la riconnessione automatica." + "Nessun accesso a Internet rilevato. Non verrà eseguita la riconnessione automatica." + "Nessun accesso a Internet." "Salvata da %1$s" "Connesso tramite assistente Wi‑Fi" "Collegato tramite %1$s" @@ -191,7 +192,7 @@ "Consentire impostazioni di sviluppo?" "Queste impostazioni sono utilizzabili solo a scopo di sviluppo. Possono causare l\'arresto o il comportamento anomalo del dispositivo e delle applicazioni su di esso." "Verifica app tramite USB" - "Controlla che le applicazioni installate tramite ADB/ADT non abbiano un comportamento dannoso." + "Controlla che le app installate tramite ADB/ADT non abbiano un comportamento dannoso." "Consente di disattivare la funzione del volume assoluto Bluetooth in caso di problemi con il volume dei dispositivi remoti, ad esempio un volume troppo alto o la mancanza di controllo." "Terminale locale" "Abilita l\'app Terminale che offre l\'accesso alla shell locale" @@ -233,8 +234,6 @@ "Mostra limiti, margini dei clip e così via" "Forza direzione layout RTL" "Direzione layout schermo RTL per tutte le lingue" - "Mostra utilizzo CPU" - "Overlay schermo che mostra l\'uso corrente della CPU" "Forza rendering GPU" "Forza l\'uso della GPU per i disegni 2D" "Forza MSAA 4x" @@ -329,8 +328,8 @@ "Home page Impostazioni" "0%" - "50%%" - "100%%" + "50%" + "100%" "%1$s fa" "%1$s rimanenti" @@ -341,4 +340,5 @@ "Massimo" "Personalizzato (%d)" "Guida e feedback" + "Menu" diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml index 7c16e4276347bca2763fb682b944394d95b9ac33..4523380ca44734cc21a98291e87414ae819d52b4 100644 --- a/packages/SettingsLib/res/values-iw/strings.xml +++ b/packages/SettingsLib/res/values-iw/strings.xml @@ -28,7 +28,8 @@ "‏כשל בחיבור Wi-Fi" "בעיית אימות" "מחוץ לטווח" - "אין גישה לאינטרנט. לא יתבצע חיבור מחדש באופן אוטומטי." + "אין גישה לאינטרנט. לא יתבצע חיבור מחדש באופן אוטומטי." + "אין גישה לאינטרנט." "נשמר על ידי %1$s" "‏מחובר באמצעות אסיסטנט ה-Wi-Fi" "‏מחובר דרך %1$s" @@ -233,8 +234,6 @@ "הצג גבולות קליפ, שוליים וכו\'" "אלץ כיוון פריסה מימין לשמאל" "אלץ כיוון פריסת מסך מימין לשמאל עבור כל השפות בכל המקומות" - "‏הצג את השימוש ב-CPU" - "‏שכבת-על של מסך שמציגה את השימוש הנוכחי ב-CPU" "‏אלץ עיבוד ב-GPU" "‏אכוף שימוש ב-GPU לשרטוט דו-מימדי" "‏אלץ הפעלת 4x MSAA" @@ -341,4 +340,5 @@ "הכי גדול" "מותאם אישית (%d)" "עזרה ומשוב" + "תפריט" diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml index 25f4152a22fad4509b778b1f14a35b0e9626e6b2..1761adb503d893340bfb01abc8f886f3d973f443 100644 --- a/packages/SettingsLib/res/values-ja/strings.xml +++ b/packages/SettingsLib/res/values-ja/strings.xml @@ -28,7 +28,8 @@ "WiFi接続エラー" "認証に問題" "圏外" - "インターネットアクセスを検出できないため、自動的に再接続されません。" + "インターネット アクセスを検出できないため、自動的に再接続されません。" + "インターネットに接続していません。" "%1$sで保存" "Wi‑Fiアシスタント経由で接続" "%1$s経由で接続" @@ -233,8 +234,6 @@ "クリップの境界線、マージンなどを表示" "RTLレイアウト方向を使用" "すべての言語/地域で画面レイアウト方向をRTLに設定" - "CPU使用状況を表示" - "現在のCPU使用状況をオーバーレイ表示する" "GPUレンダリングを使用" "2D描画にGPUを常に使用する" "4x MSAAを適用" @@ -343,4 +342,5 @@ "最大" "カスタム(%d)" "ヘルプとフィードバック" + "メニュー" diff --git a/packages/SettingsLib/res/values-ka-rGE/strings.xml b/packages/SettingsLib/res/values-ka-rGE/strings.xml index ffe194a0bc29722f63a5b422f466131602f43823..a39d4b2ce0ec2cdca4f0c8aa140e7d7e609d8e4a 100644 --- a/packages/SettingsLib/res/values-ka-rGE/strings.xml +++ b/packages/SettingsLib/res/values-ka-rGE/strings.xml @@ -28,7 +28,8 @@ "WiFi კავშირის შეფერხება" "ავთენტიკაციის პრობლემა" "არ არის დიაპაზონში" - "ინტერნეტთან წვდომის ამოცნობა ვერ მოხერხდა. ავტომატურად ხელახლა დაკავშირება არ განხორციელდება." + "ინტერნეტთან კავშირის ამოცნობა ვერ მოხერხდა. ავტომატურად ხელახლა დაკავშირება არ განხორციელდება." + "ინტერნეტთან კავშირი არ არის." "შენახული %1$s-ის მიერ" "დაკავშირებულია Wi-Fi თანაშემწით" "%1$s-ით დაკავშირებული" @@ -233,8 +234,6 @@ "კლიპის საზღვრების, მინდვრების ჩვენება და ა.შ." "მარჯვნიდან მარცხნივ განლაგების მიმართულების იძულება" "ეკრანის RTL მიმართულებაზე იძულება ყველა ლოკალისათვის" - "ცენტრალური პროცესორის ჩატვირთვის ჩვენება" - "ეკრანის გადაფარვა აჩვენებს CPU ამჟამინდელ გამოყენებას" "GPU-აჩქარება" "GPU-ის ძალით გამოყენება 2d drawing-თვის" "4x MSAA-ს ჩართვა" @@ -341,4 +340,5 @@ "უდიდესი" "მორგებული (%d)" "დახმარება და გამოხმაურება" + "მენიუ" diff --git a/packages/SettingsLib/res/values-kk-rKZ/strings.xml b/packages/SettingsLib/res/values-kk-rKZ/strings.xml index 3dcc7eb50cedbd7f256b93239191f0be915b2334..c636feb73aa65a6bc43dda52debed41fad87545d 100644 --- a/packages/SettingsLib/res/values-kk-rKZ/strings.xml +++ b/packages/SettingsLib/res/values-kk-rKZ/strings.xml @@ -28,7 +28,8 @@ "Wi-Fi байланысының қатесі" "Растау мәселесі" "Аумақта жоқ" - "Интернетке қатынас анықталмады, автоматты түрде қайта қосылу орындалмайды." + "Интернетпен байланыс жоқ, автоматты түрде қайта қосылмайды." + "Интернетпен байланыс жоқ." "%1$s сақтаған" "Wi‑Fi көмекшісі арқылы қосылу орындалды" "%1$s арқылы қосылған" @@ -233,8 +234,6 @@ "Қию шектерін, жиектерін, т.б көрсету." "Оңнан солға орналасу бағытына реттеу" "Экранның орналасу бағытын барлық тілдер үшін оңнан солға қарату" - "CPU (орталық өңдеу бірлігі) қолданысы" - "Экран бетіне ағымдағы CPU қолданысы көрсетіледі" "GPU рендерингін жылдамдату" "Графикалық процессорды 2d сызбаларына қолдану" "4x MSAA қолдану" @@ -341,4 +340,5 @@ "Ең үлкен" "Арнаулы (%d)" "Анықтама және пікір" + "Mәзір" diff --git a/packages/SettingsLib/res/values-km-rKH/strings.xml b/packages/SettingsLib/res/values-km-rKH/strings.xml index aa0ce2498737eb984d19fda063d56e4e8beb36da..94ce5f1596405a152408b226ae1231174a5faeeb 100644 --- a/packages/SettingsLib/res/values-km-rKH/strings.xml +++ b/packages/SettingsLib/res/values-km-rKH/strings.xml @@ -28,7 +28,8 @@ "ការ​ភ្ជាប់​ WiFi បរាជ័យ" "បញ្ហា​ក្នុង​ការ​ផ្ទៀងផ្ទាត់" "នៅ​ក្រៅ​តំបន់" - "រក​មិន​ឃើញ​ការ​ចូល​ដំណើរការ​អ៊ីនធឺណិត, នឹង​មិន​ភ្ជាប់​ឡើង​វិញ​ដោយ​ស្វ័យ​ប្រវត្តិ​ទេ។" + "រកមិនឃើញការតភ្ជាប់អ៊ីនធឺណិតទេ វានឹងមិនភ្ជាប់ឡើងវិញដោយស្វ័យប្រវត្តិទេ។" + "គ្មានការតភ្ជាប់អ៊ីនធឺណិតទេ" "បានរក្សាទុកដោយ %1$s" "បានភ្ជាប់តាមរយៈជំនួយការ Wi‑Fi" "បានភ្ជាប់តាមរយៈ %1$s" @@ -233,8 +234,6 @@ "បង្ហាញ​ការ​ភ្ជាប់​អត្ថបទ​សម្រង់ រឹម ។ល។" "បង្ខំ​ទិស​ប្លង់ RTL" "បង្ខំ​ទិស​ប្លង់​អេក្រង់​ទៅកាន់ RTL សម្រាប់​មូលដ្ឋាន​ទាំងអស់" - "បង្ហាញ​​ការ​ប្រើ CPU" - "អេក្រង់​ត្រួត​គ្នា​បង្ហាញ​​ការ​ប្រើ CPU បច្ចុប្បន្ន" "បង្ខំ​ឲ្យ​បង្ហាញ GPU" "បង្ខំ​ប្រើ GPU សម្រាប់​ការ​គូរ​លើក​ទី​ពីរ" "បង្ខំ 4x MSAA" @@ -341,4 +340,5 @@ "ធំបំផុត" "ផ្ទាល់ខ្លួន (%d)" "ជំនួយ និងមតិស្ថាបនា" + "ម៉ឺនុយ" diff --git a/packages/SettingsLib/res/values-kn-rIN/strings.xml b/packages/SettingsLib/res/values-kn-rIN/strings.xml index 643875fa6ea03f780773f903df8979370cc395b3..ce10d356a2d3892f2376a59dc7632f76b725d018 100644 --- a/packages/SettingsLib/res/values-kn-rIN/strings.xml +++ b/packages/SettingsLib/res/values-kn-rIN/strings.xml @@ -28,7 +28,8 @@ "WiFi ಸಂಪರ್ಕ ವಿಫಲತೆ" "ಪ್ರಮಾಣೀಕರಣ ಸಮಸ್ಯೆ" "ವ್ಯಾಪ್ತಿಯಲ್ಲಿಲ್ಲ" - "ಯಾವುದೇ ಇಂಟರ್ನೆಟ್‌ ಪ್ರವೇಶ ಪತ್ತೆಯಾಗಿಲ್ಲ, ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಮರುಸಂಪರ್ಕಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ." + "ಯಾವುದೇ ಇಂಟರ್ನೆಟ್‌ ಪ್ರವೇಶ ಪತ್ತೆಯಾಗಿಲ್ಲ, ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಮರುಸಂಪರ್ಕಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ." + "ಯಾವುದೇ ಇಂಟರ್ನೆಟ್ ಪ್ರವೇಶವಿಲ್ಲ." "%1$s ರಿಂದ ಉಳಿಸಲಾಗಿದೆ" "Wi‑Fi ಸಹಾಯಕದ ಮೂಲಕ ಸಂಪರ್ಕಿತಗೊಳಿಸಲಾಗಿದೆ" "%1$s ಮೂಲಕ ಸಂಪರ್ಕಗೊಂಡಿದೆ" @@ -93,7 +94,7 @@ "ಟೆಥರಿಂಗ್ & ಪೋರ್ಟಬಲ್ ಹಾಟ್‌ಸ್ಪಾಟ್" "ಎಲ್ಲ ಕೆಲಸದ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು" "ಅತಿಥಿ" - "ಅಜ್ಞಾತ" + "ಅಪರಿಚಿತ" "ಬಳಕೆದಾರ: %1$s" "ಕೆಲವು ಡೀಫಾಲ್ಟ್‌ಗಳನ್ನು ಹೊಂದಿಸಲಾಗಿದೆ" "ಡೀಫಾಲ್ಟ್‌ಗಳನ್ನು ಹೊಂದಿಸಲಾಗಿಲ್ಲ" @@ -233,8 +234,6 @@ "ಕ್ಲಿಪ್‌ನ ಗಡಿಗಳು, ಅಂಚುಗಳು, ಇತ್ಯಾದಿ ತೋರಿಸು." "RTL ಲೇಔಟ್‌ ಪರಿಮಿತಿ ಬಲಗೊಳಿಸಿ" "ಎಲ್ಲ ಸ್ಥಳಗಳಿಗಾಗಿ RTL ಗೆ ಸ್ಕ್ರೀನ್‌ ಲೇಔಟ್‌ ದಿಕ್ಕನ್ನು ಪ್ರಬಲಗೊಳಿಸಿ" - "CPU ಬಳಕೆಯನ್ನು ತೋರಿಸು" - "ಪ್ರಸ್ತುತ CPU ಬಳಕೆಯನ್ನು ತೋರಿಸುತ್ತಿರುವ ಪರದೆಯ ಓವರ್‌ಲೇ" "GPU ನೀಡುವಿಕೆ ಬಲಗೊಳಿಸು" "2d ಚಿತ್ರಕಲೆಗಾಗಿ GPU ಬಳಕೆ ಬಲಗೊಳಿಸಿ" "4x MSAA ಪ್ರಬಲಗೊಳಿಸಿ" @@ -312,7 +311,7 @@ "%1$s - %2$s" "%1$s - %2$s ವೈರ್‌‌ಲೆಸ್‌ನಿಂದ ಪೂರ್ಣವಾಗುವವರೆಗೆ" "%1$s - %2$s" - "ಅಜ್ಞಾತ" + "ಅಪರಿಚಿತ" "ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ" "AC ನಲ್ಲಿ ಚಾರ್ಜ್‌" "ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ" @@ -341,4 +340,5 @@ "ದೊಡ್ಡ" "ಕಸ್ಟಮ್ (%d)" "ಸಹಾಯ ಮತ್ತು ಪ್ರತಿಕ್ರಿಯೆ" + "ಮೆನು" diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml index 46176818121c549291b7ac90c5e0da4f8de32c0a..6910b375d7a024d72d8c2b60e1d1b31df0d06f0e 100644 --- a/packages/SettingsLib/res/values-ko/strings.xml +++ b/packages/SettingsLib/res/values-ko/strings.xml @@ -28,7 +28,8 @@ "Wi-Fi 연결 실패" "인증 문제" "범위 내에 없음" - "감지된 인터넷 액세스가 없으며 자동으로 다시 연결되지 않습니다." + "감지된 인터넷 액세스가 없으며 자동으로 다시 연결되지 않습니다." + "인터넷에 연결되어 있지 않습니다." "%1$s(으)로 저장됨" "Wi‑Fi 도우미를 통해 연결됨" "%1$s을(를) 통해 연결됨" @@ -233,8 +234,6 @@ "클립 경계, 여백 등을 표시" "RTL 레이아웃 방향 강제 적용" "모든 언어에 대해 화면 레이아웃 방향을 RTL로 강제 적용" - "CPU 사용량 표시" - "현재 CPU 사용량 오버레이 표시" "GPU 렌더링 강제 설정" "2D 드로잉용으로 GPU 강제 사용" "4x MSAA 강제 사용" @@ -341,4 +340,5 @@ "가장 크게" "맞춤(%d)" "고객센터" + "메뉴" diff --git a/packages/SettingsLib/res/values-ky-rKG/strings.xml b/packages/SettingsLib/res/values-ky-rKG/strings.xml index 96c1ec024aa6aa2d09a33449931ebafae8faa24c..711551b01c74535302f5a7d38f19c83cdde035d6 100644 --- a/packages/SettingsLib/res/values-ky-rKG/strings.xml +++ b/packages/SettingsLib/res/values-ky-rKG/strings.xml @@ -28,7 +28,8 @@ "WiFi туташуусу бузулду" "Аутентификация маселеси бар" "Тейлөө аймагында эмес" - "Интернетке кирүү мүмкүнчүлүгү табылган жок, андыктан автоматтык түрдө кайра туташпайт." + "Интернетке кирүү мүмкүнчүлүгү жок, андыктан автоматтык түрдө кайра туташпайт." + "Интернетке туташпай турат." "%1$s тарабынан сакталды" "Wi‑Fi жардамчысы аркылуу туташып турат" "%1$s аркылуу жеткиликтүү" @@ -233,8 +234,6 @@ "Клиптин чектерин, талааларын ж.б. көргөзүү" "Солдон оңго багытына мажбурлоо" "Экрандын жайгашуу багытын бардык тилдер үчүн Оңдон-солго кылуу" - "CPU колдонулушун көрсөтүү" - "Учурдагы CPU колдонулушун көрсөтүүчү экран катмары" "GPU иштетүүсүн мажбурлоо" "2d тартуу үчүн GPU\'ну колдонууга мажбурлоо" "4x MSAA мажбурлоо" @@ -341,4 +340,5 @@ "Эң чоң" "Ыңгайлаштырылган (%d)" "Жардам жана жооп пикир" + "Меню" diff --git a/packages/SettingsLib/res/values-lo-rLA/strings.xml b/packages/SettingsLib/res/values-lo-rLA/strings.xml index 24f0c16c4962421baf11afb1c6189a5e7dfc63cf..abf36e35891a7ace7a99c36288d9f08bb03f3246 100644 --- a/packages/SettingsLib/res/values-lo-rLA/strings.xml +++ b/packages/SettingsLib/res/values-lo-rLA/strings.xml @@ -28,7 +28,8 @@ "​ການ​ເຊື່ອມ​ຕໍ່ WiFi ລົ້ມ​ເຫຼວ" "ບັນຫາການພິສູດຢືນຢັນ" "ບໍ່ຢູ່ໃນໄລຍະທີ່ເຊື່ອມຕໍ່ໄດ້" - "​ບໍ່​ພົບ​ການ​ເຊື່ອມ​ຕໍ່​ອິນ​ເຕີ​ເນັດ​, ຈະ​ບໍ່​ຖືກ​ເຊື່ອມ​ຕໍ່​ໃໝ່​ໂດຍ​ອັດ​ຕະ​ໂນ​ມັດ." + "ບໍ່ພົບການເຊື່ອມຕໍ່ອິນເຕີເນັດ, ຈະບໍ່ເຊື່ອມຕໍ່ໃໝ່ໂດຍອັດຕະໂນມັດ." + "ບໍ່ມີການເຊື່ອມຕໍ່ອິນເຕີເນັດ." "ບັນທຶກ​​​ໂດຍ %1$s" "ເຊື່ອມ​ຕໍ່​ຜ່ານ Wi‑Fi ຕົວ​ຊ່ວຍ​ແລ້ວ" "​ເຊື່ອມຕໍ່​ຜ່ານ %1$s ​ແລ້ວ" @@ -233,8 +234,6 @@ "ສະແດງໜ້າປົກຄລິບ, ຂອບ ແລະອື່ນໆ." "ບັງ​ຄັບ​ໃຫ້ຮູບຮ່າງຂຽນຈາກຂວາຫາຊ້າຍ" "ບັງຄັບໃຫ້ຮູບຮ່າງໜ້າຈໍ ຂຽນຈາກຂວາໄປຊ້າຍ ສຳລັບທຸກພາສາ" - "ສະແດງການນຳໃຊ້ CPU" - "ການວາງຊ້ອນໜ້າຈໍທີ່ສະແດງການນຳໃຊ້ CPU ໃນປັດຈຸບັນ" "ບັງຄັບໃຊ້ GPU ປະມວນພາບ" "ບັງຄັບໃຊ້ GPU ເພື່ອການແຕ້ມພາບ 2 ມິຕິ" "ບັງຄັບໃຊ້ 4x MSAA" @@ -341,4 +340,5 @@ "ໃຫຍ່ທີ່ສຸດ" "ປັບແຕ່ງເອງ (%d)" "ຊ່ວຍເຫຼືອ & ຄຳຕິຊົມ" + "ເມນູ" diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml index 4b8890d04d33b2aff5358b7b41acf2c2cd8560a3..cab29de0f6a1e35e885562e596dc71a549553109 100644 --- a/packages/SettingsLib/res/values-lt/strings.xml +++ b/packages/SettingsLib/res/values-lt/strings.xml @@ -28,7 +28,8 @@ "„Wi-Fi“ ryšio triktis" "Autentifikavimo problema" "Ne diapazone" - "Neaptikta jokia prieiga prie interneto, nebus automatiškai iš naujo prisijungta." + "Neaptikta jokia prieiga prie interneto, nebus automatiškai iš naujo prisijungta." + "Nėra prieigos prie interneto." "Išsaugojo %1$s" "Prisijungta naudojant „Wi‑Fi“ pagelbiklį" "Prisijungta naudojant „%1$s“" @@ -233,8 +234,6 @@ "Rodyti iškarpų ribas, kraštines ir t. t." "Išdėst. iš dešin. į kairę" "Nust. visų lokalių ekran. išdėst. iš deš. į kairę" - "Rodyti centr. proc. naud." - "Ekrano perdanga rodo dabartinį centr. proc. naud." "Priverst. GPU atvaizd." "Priverstinai naudoti GPU atvaizduojant 2D formatą" "Priverst. vykdyti 4x MSAA" @@ -341,4 +340,5 @@ "Didžiausias" "Tinkintas (%d)" "Pagalba ir atsiliepimai" + "Meniu" diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml index 4d76adc3e291cd20861dcf47e849a6d05191c81f..90bf867403d02b690e6c5c10e51fa368383c0cd4 100644 --- a/packages/SettingsLib/res/values-lv/strings.xml +++ b/packages/SettingsLib/res/values-lv/strings.xml @@ -28,7 +28,8 @@ "Wi-Fi savienojuma kļūme" "Autentificēšanas problēma" "Nav diapazona ietvaros" - "Nevar noteikt interneta savienojumu. Savienojums netiks izveidots vēlreiz automātiski." + "Nevar noteikt interneta savienojumu. Savienojums netiks izveidots vēlreiz automātiski." + "Nav piekļuves internetam." "Saglabāja: %1$s" "Izveidots savienojums ar Wi‑Fi palīgu" "Savienots, izmantojot %1$s" @@ -233,8 +234,6 @@ "Rādīt klipu robežas, malas utt." "Virziens no labās uz kreiso (Obligāts) WL: 295" "Obl. izkārt. virz. no labās uz kr. pusi visām lok." - "Rādīt CPU lietojumu" - "Ekrāna pārklājums ar aktuālo CPU lietojumu" "Piespiedu GPU render." "Izmantot GPU atveidi divdimensiju zīmējumiem" "4x MSAA piespiedu palaiš." @@ -341,4 +340,5 @@ "Vislielākais" "Pielāgots (%d)" "Palīdzība un atsauksmes" + "Izvēlne" diff --git a/packages/SettingsLib/res/values-mk-rMK/strings.xml b/packages/SettingsLib/res/values-mk-rMK/strings.xml index 953360a7aa00d4fa15c6200f9673c42ea35d2c4e..725a39d0a3625eea54a34ae621993b590b3194be 100644 --- a/packages/SettingsLib/res/values-mk-rMK/strings.xml +++ b/packages/SettingsLib/res/values-mk-rMK/strings.xml @@ -28,7 +28,8 @@ "Поврзувањето преку Wi-Fi не успеа" "Проблем со автентикација" "Надвор од опсег" - "Не е откриен пристап до интернет, нема автоматски повторно да се поврзете." + "Не е откриен пристап до Интернет, нема автоматски повторно да се поврзете." + "Нема пристап до Интернет." "Зачувано од %1$s" "Поврзано преку помошник за Wi-Fismile" "Поврзано преку %1$s" @@ -233,8 +234,6 @@ "Прикажи граници на клип, маргини, итн." "Сила на RTL за насока на слој" "Присилно постави насока на распоред на екран во РТЛ за сите локални стандарди" - "Прикажи употреба на ЦПУ" - "Прекривка на екран прикаж. употреба на тековен ЦПУ" "Присили рендерирање на GPU" "Присилно користење на GPU за цртеж 2D" "Сила 4x MSAA" @@ -341,4 +340,5 @@ "Најголем" "Приспособен (%d)" "Помош и повратни информации" + "Мени" diff --git a/packages/SettingsLib/res/values-ml-rIN/strings.xml b/packages/SettingsLib/res/values-ml-rIN/strings.xml index 92c04487ace2e126de37bbb0944e3a3f1f196bbb..01565acd2cebfb4a38b6547ef6723a2f820779c9 100644 --- a/packages/SettingsLib/res/values-ml-rIN/strings.xml +++ b/packages/SettingsLib/res/values-ml-rIN/strings.xml @@ -28,7 +28,8 @@ "WiFi കണക്ഷൻ പരാജയം" "ആധികാരികമാക്കുന്നതിലെ പ്രശ്‌നം" "പരിധിയിലില്ല" - "ഇന്റർനെറ്റ് ആക്സസ്സൊന്നും കണ്ടെത്താത്തതിനാൽ സ്വയം വീണ്ടും കണക്‌റ്റുചെയ്യില്ല." + "ഇന്റർനെറ്റ് ആക്സസ്സൊന്നും കണ്ടെത്താത്തതിനാൽ സ്വയം വീണ്ടും കണക്‌റ്റുചെയ്യില്ല." + "ഇന്റർനെറ്റ് ആക്‌സസ്സ് ഇല്ല." "%1$s സംരക്ഷിച്ചത്" "വൈഫൈ അസിസ്റ്റന്റ് മുഖേന കണക്‌റ്റുചെയ്തു" "%1$s വഴി ബന്ധിപ്പിച്ചു" @@ -233,8 +234,6 @@ "ക്ലിപ്പ് ബൗണ്ടുകൾ, മാർജിനുകൾ തുടങ്ങിയവ ദൃശ്യമാക്കുക" "RTL ലേഔട്ട് ഡയറക്ഷൻ നിർബന്ധമാക്കുക" "എല്ലാ ഭാഷകൾക്കുമായി സ്‌ക്രീൻ ലേഔട്ട് ഡയറക്ഷൻ RTL-ലേക്ക് നിർബന്ധമാക്കുക" - "CPU ഉപയോഗം ദൃശ്യമാക്കുക" - "സ്ക്രീൻ ഓവർലേ നിലവിലെ CPU ഉപയോഗം ദൃശ്യമാക്കുന്നു" "GPU റെൻഡറിംഗ് ഫോഴ്സ്ചെയ്യുക" "2d ഡ്രോയിംഗിനായുള്ള നിരബന്ധിത GPU ഉപയോഗം" "4x MSAA നിർബന്ധമാക്കുക" @@ -341,4 +340,5 @@ "ഏറ്റവും വലുത്" "ഇഷ്ടാനുസൃതം ( %d )" "സഹായവും പ്രതികരണവും" + "മെനു" diff --git a/packages/SettingsLib/res/values-mn-rMN/strings.xml b/packages/SettingsLib/res/values-mn-rMN/strings.xml index 4c98c04c07d495bfbfb88e84ff3febaf81088697..5121f4460ac35748517baaaad0d9066de037a8e3 100644 --- a/packages/SettingsLib/res/values-mn-rMN/strings.xml +++ b/packages/SettingsLib/res/values-mn-rMN/strings.xml @@ -28,7 +28,8 @@ "WiFi холболт амжилтгүй" "Гэрчлэлийн асуудал" "Хүрээнд байхгүй" - "Интернэт холболт илэрсэнгүй, автоматаар дахин холболт хийгдэхгүй" + "Интернэт хандалт олдсонгүй тул автоматаар дахин холбогдохгүй." + "Интернэт хандалт алга" "%1$s хадгалсан" "Wi-Fi туслагчаар дамжуулан холбогдлоо" "%1$s-р холбогдсон" @@ -233,8 +234,6 @@ "Клипийн зах, хязгаар зэргийг харуулах" "RTL байрлалын чиглэлийг хүчээр тогтоох" "Бүх локалын хувьд дэлгэцийн байрлалын чиглэлийг хүчээр RTL болгох" - "CPU ашиглалтыг харуулах" - "Дэлгэцийн давхцалаар одоогийн CPU ашиглалтыг харуулж байна" "Хүчээр GPU ашиглах" "GPU-г 2d зурагт хүчээр ашиглах" "Хүчээр 4x MSAA ашиглах" @@ -341,4 +340,5 @@ "Хамгийн том" "Тогтмол утга (%d)" "Тусламж, санал хүсэлт" + "Цэс" diff --git a/packages/SettingsLib/res/values-mr-rIN/strings.xml b/packages/SettingsLib/res/values-mr-rIN/strings.xml index e3a7cc46cd44ad83ca38d48c1b20ab15e879121b..5ee18d54dc0961c82a2d2081d9dae2a8707aade6 100644 --- a/packages/SettingsLib/res/values-mr-rIN/strings.xml +++ b/packages/SettingsLib/res/values-mr-rIN/strings.xml @@ -28,7 +28,8 @@ "WiFi कनेक्शन अयशस्वी" "प्रमाणीकरण समस्या" "परिक्षेत्रामध्ये नाही" - "कोणताही इंटरनेट प्रवेश आढळला नाही, स्वयंचलितपणे रीकनेक्ट करणार नाही." + "कोणताही इंटरनेट प्रवेश आढळला नाही, स्वयंचलितपणे पुन्हा कनेक्ट करणार नाही." + "इंटरनेट प्रवेश नाही." "%1$s द्वारे जतन केले" "Wi‑Fi सहाय्यक द्वारे कनेक्ट केले" "%1$s द्वारे कनेक्‍ट केले" @@ -233,8 +234,6 @@ "क्लिप सीमा, समास इत्यादी दर्शवा." "RTL लेआउट दिशानिर्देशाची सक्ती करा" "सर्व लोकॅलसाठी RTL स्क्रीन लेआउट दिशानिर्देशाची सक्ती करा" - "CPU वापर दर्शवा" - "वर्तमान CPU वापर दर्शविणारे स्क्रीन आच्छादन" "GPU प्रस्तुतीस सक्ती करा" "2d रेखांकनासाठी GPU च्या वापराची सक्ती करा" "4x MSAA ची सक्ती करा" @@ -341,4 +340,5 @@ "सर्वात मोठा" "सानुकूल करा (%d)" "मदत आणि अभिप्राय" + "मेनू" diff --git a/packages/SettingsLib/res/values-ms-rMY/strings.xml b/packages/SettingsLib/res/values-ms-rMY/strings.xml index a1caa2a944194dbde88d3721beb3424a0cd671c7..fabfd637c6ed09949bee684529ab7e7735d03cbe 100644 --- a/packages/SettingsLib/res/values-ms-rMY/strings.xml +++ b/packages/SettingsLib/res/values-ms-rMY/strings.xml @@ -28,7 +28,8 @@ "Kegagalan Sambungan WiFi" "Masalah pengesahan" "Tidak dalam liputan" - "Tiada Akses Internet Dikesan, tidak akan menyambung secara automatik." + "Tiada Akses Internet Dikesan, tidak akan menyambung secara automatik." + "Tiada Akses Internet." "Diselamatkan oleh %1$s" "Disambungkan melalui Pembantu Wi-Fi" "Disambungkan melalui %1$s" @@ -233,8 +234,6 @@ "Tunjukkan batas klip, margin dll." "Paksa arah reka letak RTL" "Paksa arah reka letak skrin RTL bagi semua tempat peristiwa" - "Tunjukkan penggunaan CPU" - "Tindihan skrin menunjukkan penggunaan semasa CPU" "Paksa pemaparan GPU" "Paksa penggunaan GPU untuk lukisan 2d" "Paksa 4x MSAA" @@ -341,4 +340,5 @@ "Terbesar" "Tersuai (%d)" "Bantuan & maklum balas" + "Menu" diff --git a/packages/SettingsLib/res/values-my-rMM/strings.xml b/packages/SettingsLib/res/values-my-rMM/strings.xml index 6a1c3319048659d8fefce097e4f0c3f713663308..571a93133677129be29ca969486b7d25797b2e7a 100644 --- a/packages/SettingsLib/res/values-my-rMM/strings.xml +++ b/packages/SettingsLib/res/values-my-rMM/strings.xml @@ -28,7 +28,8 @@ "WiFi ချိတ်ဆက်မှု မအောင်မြင်ပါ" "စစ်မှန်ကြောင်းအတည်ပြုရန်၌ ပြသနာရှိခြင်း" "စက်ကွင်းထဲတွင် မဟုတ်ပါ" - "မည်သည့် အင်တာနက်မျှမရှိပါ၊ အလိုအလျောက် ပြန်လည်မချိတ်ဆက်ပါ။" + "အင်တာနက်ချိတ်ဆက်မှု ရှာမတွေ့ပါ၊ အလိုအလျောက် ပြန်လည်ချိတ်ဆက်မည် မဟုတ်ပါ။" + "အင်တာနက် ချိတ်ဆက်မှု မရှိပါ။" "%1$s မှသိမ်းဆည်းခဲ့သည်" "ကြိုးမဲ့ကူညီသူမှတဆင့် ချိတ်ဆက်၏" "%1$s မှတစ်ဆင့် ချိတ်ဆက်ထားသည်" @@ -233,8 +234,6 @@ "ဖြတ်ပိုင်းအနားသတ်များ၊ အနားများ စသဖြင့် ပြပါ။" "RTL ဖွဲ့စည်းပုံအညွှန်း မဖြစ်မနေလုပ်ပါ" "လိုကယ်လ်အားလုံးအတွက် မျက်နှာပြင် ဖွဲ့စည်းပုံအညွှန်း မဖြစ်မနေလုပ်ရန်" - "CPUအသုံးပြုမှုအား ပြသရန်" - "လက်ရှိCPUအသုံးပြုမှုအားလုံး မျက်နှာပြင်တွင်ပြသမှု" "GPUအား အတင်းအကျပ်ဖြစ်စေမည်" "GPUကို ၂ဖက်မြင်ပုံဆွဲခြင်းအတွက် မဖြစ်မနေအသုံးပြုစေရန်" "တွန်းအား ၄× MSAA" @@ -341,4 +340,5 @@ "အကြီးဆုံး" "စိတ်ကြိုက် (%d)" "အကူအညီနှင့် အကြံပြုချက်" + "မီနူး" diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index 5d8ae55fb592fb49bc22259142f5d1c65f556a8e..834c849a227f7fcc5d0bc26c003bcb2f0eff03f0 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -28,7 +28,8 @@ "Wi-Fi-tilkoblingsfeil" "Autentiseringsproblem" "Utenfor område" - "Ingen Internett-tilgang ble funnet. Kan ikke koble til på nytt automatisk." + "Fant ingen Internett-tilgang. Kan ikke automatisk koble til på nytt." + "Ingen Internett-tilgang." "Lagret av %1$s" "Koblet til via en Wi-Fi-assistent" "Tilkoblet via %1$s" @@ -233,8 +234,6 @@ "Vis kanter, marger osv." "Tving layoutretning for RTL" "Tving RTL-retning på skjermen for alle språk" - "Vis CPU-bruk" - "Skjermoverlegg viser gjeldende CPU-bruk" "Tving GPU-gjengivelse" "Tving bruk av GPU for 2D-tegning" "Tving 4x MSAA" @@ -341,4 +340,5 @@ "Størst" "Egendefinert (%d)" "Hjelp og tilbakemelding" + "Meny" diff --git a/packages/SettingsLib/res/values-ne-rNP/strings.xml b/packages/SettingsLib/res/values-ne-rNP/strings.xml index 15cc8ea87c727eb633ba099f06f7592bb1f4e215..01b39a0308fb90a8a168251cc56c089c1c23e083 100644 --- a/packages/SettingsLib/res/values-ne-rNP/strings.xml +++ b/packages/SettingsLib/res/values-ne-rNP/strings.xml @@ -28,7 +28,8 @@ "वाईफाई जडान असफल" "प्रमाणीकरण समस्या" "दायराभित्र छैन" - "कुनै इन्टरनेट पहुँच पाईएन, स्वचालित रूपमा पुन: जडान छैन।" + "इन्टरनेट माथिको पहुँच पत्ता लागेन, स्वतः पुनः जडान हुने छैन।" + "इन्टरनेट माथिको पहुँच छैन।" "%1$s द्वारा सुरक्षित गरियो" "Wi-Fi सहायक द्वारा जोडिएको" "%1$s मार्फत जडित" @@ -233,8 +234,6 @@ "क्लिप सीमा, मार्जिन, इत्यादि देखाउनुहोस्।" "RTL लेआउट दिशामा जबर्जस्ती गर्नुहोस्" "सबै लोकेलहरूको लागि RTLमा स्क्रिन लेआउट दिशामा जबर्जस्ती गर्नुहोस्" - "CPU उपयोग देखाउनुहोस्" - "स्क्रिन ओभरले वर्तमान CPU प्रयोग देखाउँदै" "GPU रेन्डर गर्न जोड गर्नुहोस्" "2d चित्र कोर्नका लागि GPU को प्रयोगलाई जोड दिनुहोस्" "4x MSAA जोड गर्नुहोस्" @@ -341,4 +340,5 @@ "सबैभन्दा ठूलो" "अनुकूलन (%d)" "मद्दत र प्रतिक्रिया" + "मेनु" diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index 12bdb4f30c06c214c41112188692874520f5ad86..feb78df79078f0739df1cb1dbcf305048f1a200c 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -28,7 +28,8 @@ "Wifi-verbinding mislukt" "Authenticatieprobleem" "Niet binnen bereik" - "Geen internettoegang gevonden. Er wordt niet automatisch opnieuw verbinding gemaakt." + "Geen internettoegang gevonden. Er wordt niet automatisch opnieuw verbinding gemaakt." + "Geen internettoegang." "Opgeslagen door %1$s" "Verbonden via wifi-assistent" "Verbonden via %1$s" @@ -233,8 +234,6 @@ "Clipgrenzen, marges en meer weergeven" "V.r.n.l.-indelingsrichting afdwingen" "Schermindelingsrichting geforceerd instellen op v.r.n.l. voor alle talen" - "CPU-gebruik weergeven" - "Schermoverlay met huidig CPU-gebruik" "GPU-rendering afdwingen" "Gebruik van GPU voor 2D-tekening forceren" "4x MSAA forceren" @@ -341,4 +340,5 @@ "Grootst" "Aangepast (%d)" "Help en feedback" + "Menu" diff --git a/packages/SettingsLib/res/values-pa-rIN/strings.xml b/packages/SettingsLib/res/values-pa-rIN/strings.xml index 21d11b00cd4bfb0ead9e7581d91f5055abe292e3..f21ee6df9385eb4152c735eb8e905722ef142230 100644 --- a/packages/SettingsLib/res/values-pa-rIN/strings.xml +++ b/packages/SettingsLib/res/values-pa-rIN/strings.xml @@ -28,7 +28,8 @@ "WiFi ਕਨੈਕਸ਼ਨ ਅਸਫਲਤਾ" "ਪ੍ਰਮਾਣੀਕਰਨ ਸਮੱਸਿਆ" "ਰੇਂਜ ਵਿੱਚ ਨਹੀਂ ਹੈ" - "ਕੋਈ ਇੰਟਰਨੈਟ ਪਹੁੰਚ ਨਹੀਂ ਮਿਲੀ, ਆਟੋਮੈਟਿਕਲੀ ਰੀਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾਏਗਾ।" + "ਕੋਈ ਇੰਟਰਨੈੱਟ ਪਹੁੰਚ ਨਹੀਂ ਮਿਲੀ, ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਮੁੜ-ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾਵੇਗਾ।" + "ਕੋਈ ਇੰਟਰਨੈੱਟ ਪਹੁੰਚ ਨਹੀਂ।" "%1$s ਵੱਲੋਂ ਸੁਰੱਖਿਅਤ ਕੀਤਾ" "Wi‑Fi ਸਹਾਇਕ ਰਾਹੀਂ ਕਨੈਕਟ ਕੀਤਾ" "%1$s ਰਾਹੀਂ ਕਨੈਕਟ ਕੀਤਾ" @@ -233,8 +234,6 @@ "ਕਲਿਪ ਬਾਊਂਡਸ, ਮਾਰਜਿਨ ਆਦਿ ਦਿਖਾਓ" "RTL ਲੇਆਉਟ ਦਿਸ਼ਾ ਤੇ ਜ਼ੋਰ ਪਾਓ" "ਸਾਰੇ ਸਥਾਨਾਂ ਲਈ RTL ਵੱਲ ਸਕ੍ਰੀਨ ਲੇਆਉਟ ਦਿਸ਼ਾ ਤੇ ਜ਼ੋਰ ਪਾਓ" - "CPU ਵਰਤੋਂ ਦਿਖਾਓ" - "ਸਕ੍ਰੀਨ ਓਵਰਲੇ ਵਰਤਮਾਨ CPU ਵਰਤੋਂ ਦਿਖਾ ਰਿਹਾ ਹੈ" "GPU ਪ੍ਰਗਟਾਅ ਤੇ ਜ਼ੋਰ ਪਾਓ" "2d ਡ੍ਰਾਇੰਗ ਲਈ GPU ਦੀ ਵਰਤੋਂ ਤੇ ਜ਼ੋਰ ਪਾਓ" "4x MSAA ਤੇ ਜ਼ੋਰ ਪਾਓ" @@ -341,4 +340,5 @@ "ਸਭ ਤੋਂ ਵੱਡਾ" "ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ (%d)" "ਮਦਦ ਅਤੇ ਪ੍ਰਤੀਕਰਮ" + "ਮੀਨੂ" diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml index d5116a2e3d7cc9fa4fa165f8273e5cfdccdc453f..bcdf81293e2d63facf5e35084999bcf4e738e1c2 100644 --- a/packages/SettingsLib/res/values-pl/strings.xml +++ b/packages/SettingsLib/res/values-pl/strings.xml @@ -28,7 +28,8 @@ "Błąd połączenia Wi-Fi" "Problem z uwierzytelnianiem" "Poza zasięgiem" - "Nie wykryto dostępu do internetu. Nie można automatycznie przywrócić połączenia." + "Nie wykryto dostępu do internetu. Nie można automatycznie przywrócić połączenia." + "Brak dostępu do internetu." "Zapisane przez: %1$s" "Połączono przez Asystenta Wi‑Fi" "Połączono przez %1$s" @@ -233,8 +234,6 @@ "Pokaż granice przycięcia, marginesy itd." "Układ od prawej do lewej" "Wymuś wszędzie układ ekranu od prawej do lewej" - "Pokaż użycie procesora" - "Nakładka na ekranie pokazująca użycie procesora" "Renderowanie na GPU" "Wymuszaj użycie GPU do rysowania 2D" "Wymuś 4x MSAA" @@ -341,4 +340,5 @@ "Największy" "Niestandardowe (%d)" "Pomoc i opinie" + "Menu" diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml index f0cfa23df3345737a232247b8875dec9505df5e9..ef4ec778ee04aafefaca5f81a832acef16b0309d 100644 --- a/packages/SettingsLib/res/values-pt-rBR/strings.xml +++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml @@ -28,7 +28,8 @@ "Falha de conexão Wi-Fi" "Problema de autenticação" "Fora do alcance" - "Nenhum acesso à Internet detectado. O dispositivo não conectará automaticamente." + "Nenhum acesso à Internet foi detectado. O dispositivo não será reconectado automaticamente." + "Sem acesso à Internet." "Salvas por %1$s" "Conectado via assistente de Wi‑Fi" "Conectado via %1$s" @@ -233,8 +234,6 @@ "Mostrar limites de corte, margens, etc." "Forçar dir. layout (RTL)" "Forçar direção do layout (RTL) p/ todas as local." - "Mostrar o uso da CPU" - "Sobreposição de tela que mostra o uso da CPU atual" "Forçar renderização GPU" "Forçar uso da GPU para desenho em 2D" "Forçar 4x MSAA" @@ -341,4 +340,5 @@ "Maior" "Personalizada (%d)" "Ajuda e feedback" + "Menu" diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index 40dfc74806b366e0308ef53ab6d994079fe2f2d0..b6e9b4f35a97f6feceb0681f2eafb6f3655722b8 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -28,7 +28,8 @@ "Falha de ligação Wi-Fi" "Problema de autenticação" "Fora do alcance" - "Nenhum acesso à Internet detetado; não será efetuada uma nova ligação automaticamente." + "Nenhum acesso à Internet detetado. Não será efetuada uma nova ligação automaticamente." + "Sem acesso à Internet." "Guardada por %1$s" "Ligado através do Assistente de Wi‑Fi" "Ligado através de %1$s" @@ -233,8 +234,6 @@ "Apresentar limites de clipes, margens, etc." "Forçar dir. do esq. RTL" "Forçar dir. do esq. do ecrã p. RTL tds os locais" - "Mostrar utilização da CPU" - "Sobrep. de ecrã que mostra a utiliz. atual da CPU" "Forçar composição GPU" "Forçar a utilização de GPU para desenho 2D" "Forçar 4x MSAA" @@ -341,4 +340,5 @@ "O maior" "Personalizado (%d)" "Ajuda e comentários" + "Menu" diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml index f0cfa23df3345737a232247b8875dec9505df5e9..ef4ec778ee04aafefaca5f81a832acef16b0309d 100644 --- a/packages/SettingsLib/res/values-pt/strings.xml +++ b/packages/SettingsLib/res/values-pt/strings.xml @@ -28,7 +28,8 @@ "Falha de conexão Wi-Fi" "Problema de autenticação" "Fora do alcance" - "Nenhum acesso à Internet detectado. O dispositivo não conectará automaticamente." + "Nenhum acesso à Internet foi detectado. O dispositivo não será reconectado automaticamente." + "Sem acesso à Internet." "Salvas por %1$s" "Conectado via assistente de Wi‑Fi" "Conectado via %1$s" @@ -233,8 +234,6 @@ "Mostrar limites de corte, margens, etc." "Forçar dir. layout (RTL)" "Forçar direção do layout (RTL) p/ todas as local." - "Mostrar o uso da CPU" - "Sobreposição de tela que mostra o uso da CPU atual" "Forçar renderização GPU" "Forçar uso da GPU para desenho em 2D" "Forçar 4x MSAA" @@ -341,4 +340,5 @@ "Maior" "Personalizada (%d)" "Ajuda e feedback" + "Menu" diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml index 6cc0f87e1b31d154b2c78b34f08dd3c6063b192c..a5ee78ae2c2cd8aa6fd03ac39a81f51953ec5145 100644 --- a/packages/SettingsLib/res/values-ro/strings.xml +++ b/packages/SettingsLib/res/values-ro/strings.xml @@ -28,7 +28,8 @@ "Eroare de conexiune Wi-Fi" "Problemă la autentificare" "În afara ariei de acoperire" - "Nu s-a detectat acces la internet, nu se va efectua reconectarea automată." + "Nu s-a detectat acces la internet, nu se va reconecta automat." + "Nu există acces la internet." "Salvată de %1$s" "Conexiune realizată printr-un asistent Wi-Fi" "Conectată prin %1$s" @@ -233,8 +234,6 @@ "Afișați limitele clipului, marginile etc." "Direcție aspect dreapta - stânga" "Direcție obligatorie aspect ecran dreapta - stânga" - "Afișați utiliz. procesor" - "Suprapunere care indică utilizare curentă procesor" "Forțați redarea cu GPU" "Forțați utilizarea GPU pentru desen în 2D" "Forțați MSAA 4x" @@ -341,4 +340,5 @@ "Cel mai mare" "Personalizat (%d)" "Ajutor și feedback" + "Meniu" diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml index ad4db89418b32a56ae03a4471f1e2c11b86da9a2..b24a705ba106616293a9e2eb6e81678bf1bf65e7 100644 --- a/packages/SettingsLib/res/values-ru/strings.xml +++ b/packages/SettingsLib/res/values-ru/strings.xml @@ -28,13 +28,14 @@ "Ошибка подключения Wi-Fi" "Ошибка аутентификации" "Недоступна" - "Подключение к Интернету отсутствует и не будет восстановлено автоматически." + "Отсутствует интернет-соединение. Повторное подключение к сети не будет выполняться автоматически." + "Отсутствует подключение к Интернету" "Кто сохранил: %1$s" "Установлено подключение через Ассистента Wi-Fi" "Подключено к %1$s" "Доступно через %1$s" "Подключено, без Интернета" - "Отключено" + "Нет подключения" "Отключение..." "Подключение..." "Подключено" @@ -233,8 +234,6 @@ "Показывать границы клипа, поля и т. д." "Написание справа налево" "Включить написание справа налево для всех языков" - "Показывать загрузку ЦП" - "Экран, показывающий текущую загрузку ЦП" "GPU-ускорение" "Всегда использовать GPU для двухмерного рисования" "Включить 4x MSAA" @@ -246,7 +245,7 @@ "Длительность анимации" "Эмуляция доп. экранов" "Приложения" - "Не сохранять действия" + "Не сохранять активности" "Удалять сводку действий после их завершения" "Лимит фоновых процессов" "Все ANR" @@ -341,4 +340,5 @@ "Максимальный" "Другой (%d)" "Справка/отзыв" + "Меню" diff --git a/packages/SettingsLib/res/values-si-rLK/strings.xml b/packages/SettingsLib/res/values-si-rLK/strings.xml index 5efb4001a6380aa358cebe1ce968aa8709082ca4..e3acfaee3fe86cccb9ebdd347a66718da8093e77 100644 --- a/packages/SettingsLib/res/values-si-rLK/strings.xml +++ b/packages/SettingsLib/res/values-si-rLK/strings.xml @@ -28,7 +28,8 @@ "WiFi සම්බන්ධතාව අසාර්ථකයි" "සත්‍යාපනයේ ගැටලුවකි" "පරාසයේ නැත" - "අන්තර්ජාල ප්‍රවේශය අනාවරණය වුයේ නැත, ස්වයංක්‍රිය නැවත සම්බන්ධ වීම වූ නැත" + "අන්තර්ජාල ප්‍රවේශය නැත, ස්වයංක්‍රිය නැවත සම්බන්ධ නොවනු ඇත." + "අන්තර්ජාල ප්‍රවේශය නැත." "%1$s විසින් සුරකින ලදී" "Wi‑Fi සහායක හරහා සම්බන්ධ කරන ලදි" "%1$s හරහා සම්බන්ධ විය" @@ -233,8 +234,6 @@ "ක්ලිප් සීමා, මායිම්, ආදිය පෙන්වන්න." "බල RTL පිරිසැලසුම් දිශාව" "සියලු පෙදෙසි සඳහා RTL වෙත බල තිර පිරිසැලසුම" - "CPU භාවිතය පෙන්වන්න" - "තීර උඩැතිරිය වත්මන් CPU භාවිතය පෙන්නුම් කරයි" "GPU විදහාපෑම බලකරන්න" "2d ඇඳීම් සඳහා GPU බලයෙන් භාවිතා කරන්න" "4x MSAA බල කරන්න" @@ -341,4 +340,5 @@ "විශාලතම" "අභිරුචි (%d)" "උදව් සහ ප්‍රතිපෝෂණ" + "මෙනුව" diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml index 7a7e3d49d12d57f790c83218d4e4893339017fbd..74a2b4693eb0b923871ee7a0383d738b43e1ff3c 100644 --- a/packages/SettingsLib/res/values-sk/strings.xml +++ b/packages/SettingsLib/res/values-sk/strings.xml @@ -28,7 +28,8 @@ "Zlyhanie pripojenia Wi-Fi" "Problém s overením totožnosti" "Mimo dosah" - "Nenašiel sa žiadny prístup k internetu, preto nedôjde k automatickému opätovnému pripojeniu" + "Nenašiel sa žiadny prístup k internetu, preto nedôjde k automatickému opätovnému pripojeniu." + "Žiadny prístup k internetu." "Uložil(a) %1$s" "Pripojené pomocou Asistenta Wi-Fi" "Pripojené prostredníctvom %1$s" @@ -173,8 +174,8 @@ "Zvýšiť úroveň denníkov Wi-Fi, zobrazovať podľa SSID RSSI pri výbere siete Wi-Fi" "Keď túto možnosť zapnete, Wi-Fi bude agresívnejšie odovzdávať dát. pripoj. na mob. sieť vtedy, keď bude slabý signál Wi-Fi" "Povoliť alebo zakázať funkciu Wifi Roam Scans na základe objemu prenosu údajov v rozhraní" - "Veľkosti vyrovnávacej pamäte denníka" - "Veľkosť na vyrovnávaciu pamäť nástroja denníkov" + "Vyrovnávacia pamäť nástroja denníkov" + "Veľkosť vyrovnávacej pamäte nástroja denníkov" "Vymazať trvalé úložisko zapisovača do denníka?" "Keď prestaneme monitorovať pomocou trvalého zapisovača do denníka, musíme vymazať jeho dáta, ktoré sa nachádzajú vo vašom zariadení." "Natrvalo ukladať dáta zapisovača do denníka na zariadení" @@ -186,8 +187,8 @@ "Kontrola atribútov zobrazenia" "Vždy ponechávať mobilné dáta aktívne, dokonca aj pri aktívnej sieti Wi‑Fi (na rýchle prepínanie sietí)" "Povoliť ladenie cez USB?" - "Ladenie prostredníctvom USB je určené iba na účely vývoja. Použite ho na kopírovanie dát medzi počítačom a zariadením, inštaláciu aplikácií do zariadenia bez upozornenia a čítanie údajov denníka." - "Chcete odvolať prístup k ladeniu cez USB zo všetkých počítačov, ktoré ste predtým autorizovali?" + "Ladenie cez USB je určené iba na účely vývoja. Možno ho použiť na kopírovanie dát medzi počítačom a zariadením, inštaláciu aplikácií do zariadenia bez upozornenia a čítanie dát denníka." + "Chcete všetkým v minulosti autorizovaným počítačom odvolať prístup k ladeniu cez USB?" "Povoliť nastavenia pre vývojárov?" "Tieto nastavenia sú určené len pre vývojárov. Môžu spôsobiť poruchu alebo nesprávne fungovanie zariadenia a nainštalovaných aplikácií." "Overovať aplikácie z USB" @@ -233,8 +234,6 @@ "Zobraziť vo výstrižku ohraničenie, okraje a pod." "Rozloženia sprava doľava" "Vynútiť pre všetky jazyky rozloženie obrazovky sprava doľava" - "Zobraziť využitie CPU" - "Prekryvná vrstva s aktuálnym využitím procesora" "Vykresľovat pomocou GPU" "Používať GPU na dvojrozmerné vykresľovanie" "Vynútiť 4x MSAA" @@ -341,4 +340,5 @@ "Najväčšie" "Vlastné (%d)" "Pomocník a spätná väzba" + "Ponuka" diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml index 10bff6e038a9fd80a6f7bd284166448b35cdba8d..788b97ce5714225eb7c299124ff32e3bf2911e88 100644 --- a/packages/SettingsLib/res/values-sl/strings.xml +++ b/packages/SettingsLib/res/values-sl/strings.xml @@ -28,7 +28,8 @@ "Povezava prek Wi-Fi-ja ni uspela" "Težava s preverjanjem pristnosti" "Ni v obsegu" - "Ni zaznanega dostopa do interneta; samodejna vnovična vzpostavitev povezave se ne bo izvedla." + "Ni zaznanega dostopa do interneta; samodejna vnovična vzpostavitev povezave se ne bo izvedla." + "Ni dostopa do interneta." "Shranil(-a): %1$s" "Povezava vzpostavljena prek pomočnika za Wi-Fi" "Vzpostavljena povezava prek: %1$s" @@ -233,8 +234,6 @@ "Pokaži meje obrezovanja, obrobe ipd." "Vsili od desne proti levi" "Vsili smer postavitve na zaslonu od desne proti levi za vse jezike" - "Prikaži uporabo CPE-ja" - "Prekrivanje zaslona prikazuje tren. uporabo CPE-ja" "Vsili upodabljanje z GPE-jem" "Za risanje 2D vsili uporabo grafičnega procesorja" "Vsili 4x MSAA" @@ -341,4 +340,5 @@ "Največje" "Po meri (%d)" "Pomoč in povratne informacije" + "Meni" diff --git a/packages/SettingsLib/res/values-sq-rAL/strings.xml b/packages/SettingsLib/res/values-sq-rAL/strings.xml index e4f0eaa29596601044355003c9187da0450687b7..d6419ddabc5ad271ba565bd4ee309bf579e9eb36 100644 --- a/packages/SettingsLib/res/values-sq-rAL/strings.xml +++ b/packages/SettingsLib/res/values-sq-rAL/strings.xml @@ -28,7 +28,8 @@ "Dështim i lidhjes WiFi" "Problem me vërtetimin" "Nuk është brenda rrezes" - "Nuk u diktua qasje në internet. Lidhja nuk do të realizohet automatikisht." + "Nuk u zbulua qasje në internet. Nuk do të lidhet përsëri automatikisht." + "Nuk ka qasje në internet." "E ruajtur nga %1$s" "I lidhur nëpërmjet ndihmësit të Wi‑Fi" "E lidhur përmes %1$s" @@ -233,8 +234,6 @@ "Shfaq konturet e klipit, hapësirat etj." "Detyro drejtimin e shkrimit nga e djathta në të majtë" "Ndrysho me detyrim drejtimin e planit të ekranit nga e djathta në të majtë për të gjitha vendet" - "Shfaq përdorimin e CPU-së" - "Mbivendosja e ekranit tregon përdorimin e CPU-së" "Detyro interpretimin e GPU-së" "Detyro përdorimin e GPU-së për vizatimin e dytë" "Detyro 4x MSAA" @@ -341,4 +340,5 @@ "Më i madhi" "I personalizuar (%d)" "Ndihma dhe komentet" + "Menyja" diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml index fba58c50211c3ff09b0ff6580eb9a6830ba804b5..f8b3b4bccd3c5346225c4634ef82649eeabb7c91 100644 --- a/packages/SettingsLib/res/values-sr/strings.xml +++ b/packages/SettingsLib/res/values-sr/strings.xml @@ -28,7 +28,8 @@ "Wi-Fi веза је отказала" "Проблем са потврдом аутентичности" "Није у опсегу" - "Приступ интернету није откривен, аутоматско повезивање није могуће." + "Приступ интернету није откривен, аутоматско повезивање није могуће." + "Нема приступа интернету." "Сачувао/ла је %1$s" "Повезано преко Wi‑Fi помоћника" "Веза је успостављена преко приступне тачке %1$s" @@ -233,8 +234,6 @@ "Прикажи границе клипа, маргине итд." "Наметни смер распореда здесна налево" "Наметни смер распореда екрана здесна налево за све локалитете" - "Прик. употребу процесора" - "Постав. елемент са тренутном употребом процесора" "Принудни приказ пом. GPU" "Принудно користи GPU за 2D цртање" "Наметни 4x MSAA" @@ -282,7 +281,7 @@ "Покрећите WebView приказиваче засебно" "Примена WebView-а" "Подесите примену WebView-а" - "Овај избор више није важећи. Покушајте поново." + "Овај избор више није важећи. Пробајте поново." "Конвертуј у шифровање датотека" "Конвертуј..." "Већ се користи шифровање датотека" @@ -341,4 +340,5 @@ "Највећи" "Прилагођени (%d)" "Помоћ и повратне информације" + "Мени" diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml index ecc728a81eecc768db5c084ecf54815cc32065c0..389e03a8288979933b517dc381361d2221057741 100644 --- a/packages/SettingsLib/res/values-sv/strings.xml +++ b/packages/SettingsLib/res/values-sv/strings.xml @@ -28,7 +28,8 @@ "Wi-Fi-anslutningsfel" "Autentiseringsproblem" "Utom räckhåll" - "Ingen internetåtkomst hittades. Det går inte att återansluta automatiskt." + "Ingen internetåtkomst hittades. Det går inte att återansluta automatiskt." + "Ingen internetåtkomst" "Sparades av %1$s" "Ansluten via Wi-Fi-assistent" "Anslutet via %1$s" @@ -233,8 +234,6 @@ "Visa gränser för videoklipp, marginaler m.m." "Tvinga fram RTL-layout" "Tvinga fram RTL-skärmlayout (hö–vä) för alla språk" - "Visa CPU-användning" - "Överlägg på skärmen med aktuell CPU-användning" "Framtvinga GPU-rendering" "Tvingad användning av GPU för 2D-ritning" "Force 4x MSAA" @@ -341,4 +340,5 @@ "Störst" "Anpassad (%d)" "Hjälp och feedback" + "Meny" diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index 435a1bdd99bef7470b3f1ae73ff5069638be65fb..ff6687cc78f4a1c823800b8f4bb066f0f2559e5a 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -28,7 +28,8 @@ "Haikuweza Kuunganisha kwenye WiFi" "Tatizo la uthibitishaji" "Haiko karibu" - "Hakuna Ufikiaji kwa Intaneti Uliogunduliwa, haitaweza kuunganisha kiotomatiki." + "Haikupata Muunganisho wa Intaneti. Haitaweza kuunganisha tena kiotomatiki." + "Hakuna Muunganisho wa Intaneti." "Ilihifadhiwa na %1$s" "Imeunganishwa kupitia Kisaidizi cha Wi-Fi" "Imeunganishwa kupitia %1$s" @@ -233,8 +234,6 @@ "Onyesha mipaka ya picha, kingo, nk." "Lazimisha uelekezaji wa muundo wa RTL" "Lazimisha uelekezaji wa muundo wa skrini kwa RTL kwa lugha zote" - "Onyesha matumizi ya CPU" - "Kuegeshwa kwa skrini ikionyesha matumizi ya sasa ya CPU" "Lazimisha kutungiliza GPU" "Lazimisha matumizi ya GPU kwa uchoraji wa 2d" "Lazimisha 4x MSAA" @@ -341,4 +340,5 @@ "Kubwa zaidi" "Kiwango maalum (%d)" "Usaidizi na maoni" + "Menyu" diff --git a/packages/SettingsLib/res/values-ta-rIN/strings.xml b/packages/SettingsLib/res/values-ta-rIN/strings.xml index 033955c77e91217ff37b52b6006ff1b7a9c6b7c3..86f58fc83e61672edd16d5ec35eaf9be03c05537 100644 --- a/packages/SettingsLib/res/values-ta-rIN/strings.xml +++ b/packages/SettingsLib/res/values-ta-rIN/strings.xml @@ -28,7 +28,8 @@ "வைஃபை இணைப்பில் தோல்வி" "அங்கீகரிப்புச் சிக்கல்" "தொடர்பு எல்லையில் இல்லை" - "இணைய அணுகல் இல்லை, மீண்டும் தானாக இணையாது." + "இணைய அணுகல் இல்லை, மீண்டும் தானாக இணையாது." + "இணைய அணுகல் இல்லை." "%1$s சேமித்தது" "வைஃபை அசிஸ்டண்ட் மூலம் இணைக்கப்பட்டது" "%1$s வழியாக இணைக்கப்பட்டது" @@ -233,8 +234,6 @@ "கிளிப் எல்லைகள், ஓரங்கள், மேலும் பலவற்றைக் காட்டு" "RTL தளவமைப்பின் திசையை வலியுறுத்து" "எல்லா மொழிகளுக்கும் திரையின் தளவமைப்பு திசையை RTL க்கு மாற்று" - "CPU பயன்பாட்டைக் காட்டு" - "தற்போதைய CPU பயன்பாட்டைக் காட்டும் திரை மேலடுக்கு" "GPU காட்சியாக்கத்தை வலியுறுத்து" "2d வரைபடத்திற்கு GPU பயன்பாட்டை வலியுறுத்து" "4x MSAA ஐ வலியுறுத்து" @@ -341,4 +340,5 @@ "மிகப் பெரியது" "தனிப்பயன் (%d)" "உதவி & கருத்து" + "மெனு" diff --git a/packages/SettingsLib/res/values-te-rIN/strings.xml b/packages/SettingsLib/res/values-te-rIN/strings.xml index 57581765ae4e269a3fabc171a4a74b43750211fc..13265760eaf9e607b909da902e8af83035fe9575 100644 --- a/packages/SettingsLib/res/values-te-rIN/strings.xml +++ b/packages/SettingsLib/res/values-te-rIN/strings.xml @@ -28,7 +28,8 @@ "WiFi కనెక్షన్ వైఫల్యం" "ప్రామాణీకరణ సమస్య" "పరిధిలో లేదు" - "ఇంటర్నెట్ ప్రాప్యత కనుగొనబడలేదు, స్వయంచాలకంగా మళ్లీ కనెక్ట్ చేయబడదు." + "ఇంటర్నెట్ ప్రాప్యత కనుగొనబడలేదు, స్వయంచాలకంగా మళ్లీ కనెక్ట్ చేయబడదు." + "ఇంటర్నెట్ ప్రాప్యత లేదు." "%1$s ద్వారా సేవ్ చేయబడింది" "Wi‑Fi సహాయకం ద్వారా కనెక్ట్ చేయబడింది" "%1$s ద్వారా కనెక్ట్ చేయబడింది" @@ -233,8 +234,6 @@ "క్లిప్ సరిహద్దులు, అంచులు మొ. చూపు" "RTL లేఅవుట్ దిశను నిర్భందం చేయండి" "అన్ని లొకేల్‌ల కోసం RTLకి స్క్రీన్ లేఅవుట్ దిశను నిర్భందించు" - "CPU వినియోగాన్ని చూపు" - "ప్రస్తుత CPU వినియోగాన్ని చూపేలా స్క్రీన్ అతివ్యాప్తి చేయబడుతుంది" "నిర్బంధంగా GPU భాషాంతరీకరణ" "2d డ్రాయింగ్ కోసం GPU నిర్భంద వినియోగం" "నిర్భందం 4x MSAA" @@ -341,4 +340,5 @@ "అతి పెద్దగా" "అనుకూలం (%d)" "సహాయం & అభిప్రాయం" + "మెను" diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml index 4849e19553210bef39d167c319db2c553194656a..5d302d08e89c96df92392618bfd1ef95b72e8e80 100644 --- a/packages/SettingsLib/res/values-th/strings.xml +++ b/packages/SettingsLib/res/values-th/strings.xml @@ -28,7 +28,8 @@ "การเชื่อมต่อ Wi-Fi ล้มเหลว" "ปัญหาในการตรวจสอบสิทธิ์" "ไม่อยู่ในพื้นที่ให้บริการ" - "ไม่พบการเข้าถึงอินเทอร์เน็ต ระบบจะไม่เชื่อมต่อใหม่โดยอัตโนมัติ" + "ไม่พบการเข้าถึงอินเทอร์เน็ต ระบบจะไม่เชื่อมต่อใหม่โดยอัตโนมัติ" + "ไม่สามารถเข้าถึงอินเทอร์เน็ต" "บันทึกโดย %1$s แล้ว" "เชื่อมต่อผ่านตัวช่วย Wi-Fi อยู่" "เชื่อมต่อผ่าน %1$s แล้ว" @@ -233,8 +234,6 @@ "แสดงหน้าปกคลิป ขอบ ฯลฯ" "บังคับทิศทางการจัดวาง RTL" "บังคับทิศทางการจัดวางหน้าจอเป็น RTL สำหรับทุกภาษา" - "แสดงการใช้ CPU" - "การวางซ้อนหน้าจอที่แสดงการใช้ CPU ในปัจจุบัน" "เร่งการแสดงผลของ GPU" "ต้องใช้ GPU สำหรับการวาดภาพ 2 มิติ" "บังคับใช้ 4x MSAA" @@ -341,4 +340,5 @@ "ใหญ่ที่สุด" "กำหนดเอง (%d)" "ความช่วยเหลือและความคิดเห็น" + "เมนู" diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml index 24f5499d449013c81552174b47d76323eaf49151..c2232ee76e96835a71eb8781cc83293855516a3c 100644 --- a/packages/SettingsLib/res/values-tl/strings.xml +++ b/packages/SettingsLib/res/values-tl/strings.xml @@ -28,7 +28,8 @@ "Pagkabigo ng Koneksyon sa WiFi" "Problema sa pagpapatotoo" "Wala sa sakop" - "Walang Natukoy na Access sa Internet, hindi awtomatikong muling kumonekta." + "Walang Na-detect na Access sa Internet, hindi awtomatikong muling kokonekta." + "Walang Access sa Internet." "Na-save ni %1$s" "Nakakonekta sa pamamagitan ng Wi‑Fi assistant" "Nakakonekta sa pamamagitan ng %1$s" @@ -146,7 +147,7 @@ "Hindi available ang mga setting ng VPN para sa user na ito" "Hindi available ang mga setting ng pagte-theter para sa user na ito" "Hindi available ang mga setting ng Access Point Name para sa user na ito" - "Pagde-debug ng USB" + "Pag-debug ng USB" "Debug mode kapag nakakonekta ang USB" "Bawiin ang mga pahintulot sa pag-debug ng USB" "Shortcut ng ulat sa bug" @@ -186,8 +187,8 @@ "I-enable ang pagsisiyasat sa attribute na view" "Palaging panatilihing aktibo ang mobile data, kahit na aktibo ang Wi‑Fi (para sa mabilis na paglipat ng network)." "Payagan ang pag-debug ng USB?" - "Ang pag-debug ng USB ay nilalayon para sa mga layuning pagpapabuti lamang. Gamitin ito upang kumopya ng data sa pagitan ng iyong computer at iyong device, mag-install ng apps sa iyong device nang walang notification, at magbasa ng data ng log." - "Bawiin ang access sa pagde-debug ng USB mula sa lahat ng computer na dati mong pinahintulutan?" + "Ang pag-debug ng USB ay para lang sa mga layuning pag-develop. Gamitin ito upang kumopya ng data sa pagitan ng iyong computer at iyong device, mag-install ng mga app sa iyong device nang walang notification, at magbasa ng data ng log." + "Bawiin ang access sa pag-debug ng USB mula sa lahat ng computer na dati mong pinahintulutan?" "Payagan ang mga setting ng pag-develop?" "Nilalayon ang mga setting na ito para sa paggamit sa pag-develop lamang. Maaaring magsanhi ang mga ito ng pagkasira o hindi paggana nang maayos ng iyong device at mga application na nandito." "I-verify ang mga app sa USB" @@ -233,8 +234,6 @@ "Ipakita ang mga hangganan ng clip, margin, atbp." "Force RTL layout dir." "Force screen layout dir. sa RTL sa lahat ng lokal" - "Ipakita paggamit ng CPU" - "Ipinapakita ng screen overlay ang paggamit ng CPU ngayon" "Ipilit ang pag-render ng GPU" "Sapilitang paggamit sa GPU para sa 2d na pagguhit" "Puwersahin ang 4x MSAA" @@ -341,4 +340,5 @@ "Pinakamalaki" "Custom (%d)" "Tulong at feedback" + "Menu" diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml index 950e3221ff7cbfbbd7ca1169844297be176d50cf..2541a3f6bc3165f808d740642ec426f45367241d 100644 --- a/packages/SettingsLib/res/values-tr/strings.xml +++ b/packages/SettingsLib/res/values-tr/strings.xml @@ -28,7 +28,8 @@ "Kablosuz Bağlantı Hatası" "Kimlik doğrulama sorunu" "Kapsama alanı dışında" - "İnternet Erişimi algılanmadı, otomatik olarak tekrar bağlanmayacak." + "İnternet Erişimi Algılanmadı, otomatik olarak tekrar bağlanmayacak." + "İnternet Erişimi Yok." "%1$s tarafından kaydedildi" "Kablosuz bağlantı yardımcısıyla bağlandı" "%1$s üzerinden bağlı" @@ -233,8 +234,6 @@ "Klip sınırlarını, kenar boşluklarını vb. göster" "Sağdan sola düzenini zorla" "Tüm yerel ayarlar için sağdan sola ekran düzenini zorlar" - "CPU kullanımını göster" - "Mevcut CPU kullanımını gösteren yer paylaşımı" "GPU oluşturmayı zorla" "2D çizimde GPU kullanımını zorla" "4x MSAA\'yı zorla" @@ -341,4 +340,5 @@ "En büyük" "Özel (%d)" "Yardım ve geri bildirim" + "Menü" diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml index 6b49b14084e996396f7b9e94b926135db156adc0..1829677eaf9d26ed34d27670cfff820c8fff9009 100644 --- a/packages/SettingsLib/res/values-uk/strings.xml +++ b/packages/SettingsLib/res/values-uk/strings.xml @@ -28,7 +28,8 @@ "Помилка з’єднання Wi-Fi" "Проблема з автентифікацією" "Не в діапазоні" - "Немає доступу до Інтернету. Спроба під’єднання не здійснюватиметься автоматично." + "Немає доступу до Інтернету. Спроба під’єднання не здійснюватиметься автоматично." + "Немає доступу до Інтернету." "Збережено додатком %1$s" "Під’єднано через Диспетчер Wi-Fi-з’єднання" "Під’єднано через %1$s" @@ -233,8 +234,6 @@ "Показувати межі роликів, поля тощо" "Макет письма справа наліво" "Застосовувати макет письма справа наліво для всіх мов" - "Показати використання ЦП" - "Показувати на екрані поточне використання ЦП" "Примусова візуалізація GPU" "Примусово використовувати GPU для 2D-малювання" "Примус. запустити 4x MSAA" @@ -341,4 +340,5 @@ "Найбільші елементи" "Спеціальний масштаб (%d)" "Довідка й відгуки" + "Меню" diff --git a/packages/SettingsLib/res/values-ur-rPK/strings.xml b/packages/SettingsLib/res/values-ur-rPK/strings.xml index 2ac8a6145797627a305e1cfc2268a5b2a1ee54bf..8bcf20b241d29da271af25e1adf89b48632ab8fc 100644 --- a/packages/SettingsLib/res/values-ur-rPK/strings.xml +++ b/packages/SettingsLib/res/values-ur-rPK/strings.xml @@ -28,7 +28,8 @@ "‏WiFi کنکشن کی ناکامی" "توثیق کا مسئلہ" "رینج میں نہیں ہے" - "انٹرنیٹ تک کسی رسائی کا پتہ نہیں چلا، خود بخود دوبارہ منسلک نہیں ہوگا۔" + "انٹرنیٹ تک کسی رسائی کا پتہ نہیں چلا، خودکار طور پر دوبارہ منسلک نہیں ہوگا۔" + "انٹرنیٹ تک کوئی رسائی نہیں۔" "%1$s کی جانب سے محفوظ کردہ" "‏Wi‑Fi اسسٹنٹ کے ذریعے منسلک ہے" "‏منسلک بذریعہ ‎%1$s" @@ -233,8 +234,6 @@ "کلپ باؤنڈز، حاشیے وغیرہ دکھائیں" "‏RTL لے آؤٹ سمت زبردستی نافذ کریں" "‏سبھی زبانوں کیلئے اسکرین لے آؤٹ کی سمت کو RTL پر مجبور کریں" - "‏CPU استعمال دکھائیں" - "‏موجودہ CPU استعمال دکھانے والا اسکرین اوورلے" "‏GPU رینڈرنگ زبردستی نافذ کریں" "‏2D ڈرائنگ کیلئے GPU کا استعمال زبردستی نافذ کریں" "‏4x MSAA زبردستی نافذ کریں" @@ -341,4 +340,5 @@ "سب سے بڑا" "حسب ضرورت (%d)" "مدد اور تاثرات" + "مینو" diff --git a/packages/SettingsLib/res/values-uz-rUZ/strings.xml b/packages/SettingsLib/res/values-uz-rUZ/strings.xml index 9022ad31dacf41cd265606e1ddab9bd11c56a010..a0c72a09e1843920afe4c0e3e13ca03f31ffe05a 100644 --- a/packages/SettingsLib/res/values-uz-rUZ/strings.xml +++ b/packages/SettingsLib/res/values-uz-rUZ/strings.xml @@ -28,7 +28,8 @@ "Wi-Fi ulanishini o‘rnatib bo‘lmadi" "Tasdiqdan o‘tishda muammo" "Aloqada emas" - "Internetga ulanish aniqlanmadi, avtomatik ravishda qayta ulana olmaydi." + "Internetga ulanish aniqlanmadi, avtomatik ravishda qayta ulana olmaydi." + "Internet aloqasi yo‘q." "%1$s tomonidan saqlangan" "Wi‑Fi yordamchisi orqali ulangan" "%1$s orqali ulangan" @@ -233,8 +234,6 @@ "Klip, maydon va h.k. chegaralarini ko‘rsatish" "O‘ngdan chapga qarab yozish" "Barcha tillarda o‘ngdan chapga qarab yozish" - "MP yuklanishini ko‘rsatish" - "Joriy MP yuklanishini ko‘rsatuvchi ekran" "GPU yordamida tezlatish" "Ikki o‘lchamli chizma uchun doim GPU ishlatilsin" "4x MSAAni yoqish" @@ -341,4 +340,5 @@ "Eng katta" "Moslashtirilgan (%d)" "Yordam va fikr-mulohaza" + "Menyu" diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml index c58f84993bb628aa280cb1469e7f963c2cd2b770..b99117768d33314573885e0366edf3301ac71e65 100644 --- a/packages/SettingsLib/res/values-vi/strings.xml +++ b/packages/SettingsLib/res/values-vi/strings.xml @@ -28,7 +28,8 @@ "Lỗi kết nối WiFi" "Sự cố xác thực" "Ngoài vùng phủ sóng" - "Không phát hiện thấy truy cập Internet nào, mạng sẽ không được tự động kết nối lại." + "Không phát hiện thấy kết nối Internet, mạng sẽ không tự động kết nối lại." + "Không có kết nối Internet." "Được lưu bởi %1$s" "Được kết nối qua trình hỗ trợ Wi‑Fi" "Được kết nối qua %1$s" @@ -233,8 +234,6 @@ "Hiển thị viền đoạn video, lề, v.v.." "Buộc hướng bố cục RTL" "Buộc hướng bố cục màn hình RTL cho tất cả ngôn ngữ" - "Hiển thị mức sử dụng CPU" - "Lớp phủ màn hình hiển thị mức sử dụng CPU hiện tại" "Bắt buộc kết xuất GPU" "Bắt buộc sử dụng GPU cho bản vẽ 2d" "Bắt buộc 4x MSAA" @@ -341,4 +340,5 @@ "Lớn nhất" "Tùy chỉnh (%d)" "Trợ giúp và phản hồi" + "Menu" diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index 18ae80e3d9b61f86b31f933aa9baf3d7d67f9a84..29c4c7313c6f6b4ad82201d0efc69565dd30387e 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -28,7 +28,8 @@ "WLAN 连接失败" "身份验证出现问题" "不在范围内" - "未检测到任何互联网连接,因此不会自动重新连接。" + "未检测到任何互联网连接,系统无法自动为您重新连接。" + "无法连接到互联网。" "已通过%1$s保存" "已连接(通过 WLAN 助手)" "已通过%1$s连接" @@ -186,7 +187,7 @@ "启用视图属性检查功能" "始终开启移动数据网络,即使 WLAN 网络已开启(便于快速切换网络)。" "是否允许USB调试?" - "USB调试仅适用于开发工作。该功能可用于在您的计算机和设备之间复制数据、在您的设备上安装应用而不发送通知以及读取日志数据。" + "USB 调试仅用于开发目的。该功能可用于在您的计算机和设备之间复制数据、在您的设备上安装应用(事先不发通知)以及读取日志数据。" "是否针对您之前授权的所有计算机撤消USB调试的访问权限?" "允许开发设置?" "这些设置仅适用于开发工作。一旦启用,会导致您的设备以及设备上的应用崩溃或出现异常。" @@ -233,8 +234,6 @@ "显示剪辑边界、边距等。" "强制使用从右到左的布局方向" "强制将所有语言区域的屏幕布局方向改为从右到左" - "显示 CPU 使用情况" - "屏幕叠加层显示当前 CPU 使用情况" "强制进行 GPU 渲染" "强制使用 GPU 进行 2D 绘图" "强制启用 4x MSAA" @@ -341,4 +340,5 @@ "最大" "自定义 (%d)" "帮助和反馈" + "菜单" diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml index 660071df70736202b2b99a337968bdcaeb25a9a6..c77b7864ace646b459905b2d5d67188780432b1b 100644 --- a/packages/SettingsLib/res/values-zh-rHK/strings.xml +++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml @@ -28,7 +28,8 @@ "WiFi 連線失敗" "驗證問題" "超出可用範圍" - "未能偵測到互聯網連線,因此不會自動重新連線。" + "無法偵測互聯網連線,未能自動重新連線。" + "無法偵測互聯網連線。" "%1$s 的儲存" "已透過 Wi-Fi 小幫手連線" "已透過 %1$s 連線" @@ -233,8 +234,6 @@ "顯示剪輯範圍、邊界等" "強制使用從右至左的版面配置方向" "強制將所有語言代碼的畫面配置方向改為從右至左" - "顯示 CPU 使用量" - "在螢幕上重疊顯示目前的 CPU 使用量" "強制使用 GPU 轉譯" "強制使用 GPU 進行 2D 繪圖" "強制 4x MSAA" @@ -341,4 +340,5 @@ "最大" "自訂 (%d)" "說明與意見反映" + "選單" diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml index bce6f244d1e4413ee618e6390269bf4d303f17be..fb180ff59659ab4f6089782b3b6212a3bf7bbcb1 100644 --- a/packages/SettingsLib/res/values-zh-rTW/strings.xml +++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml @@ -28,7 +28,8 @@ "WiFi 連線失敗" "驗證問題" "不在有效範圍內" - "未偵測到可用的網際網路連線,系統無法為您自動重新連線。" + "未偵測到可用的網際網路連線,系統無法為你自動重新連線。" + "沒有可用的網際網路連線。" "由%1$s儲存" "已透過 Wi‑Fi 小幫手連線" "已透過 %1$s 連線" @@ -233,8 +234,6 @@ "顯示剪輯範圍、邊界等。" "強制使用從右至左版面配置方向" "強制將所有語言代碼的畫面配置方向改為從右至左" - "顯示 CPU 使用量" - "在螢幕上方顯示目前的 CPU 使用量" "強制使用 GPU 轉譯" "強制使用 GPU 進行 2D 繪圖" "強制 4x MSAA" @@ -341,4 +340,5 @@ "最大" "自訂 (%d)" "說明與意見回饋" + "選單" diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml index 07c6fce2c3f9e2d095108fb6581b2e78c42a1b2e..2f9d4282386d9be93463118f94618740b79a79ae 100644 --- a/packages/SettingsLib/res/values-zu/strings.xml +++ b/packages/SettingsLib/res/values-zu/strings.xml @@ -28,7 +28,8 @@ "Ukwehlulekla koxhumo le-WiFi" "Inkinga yokufakazela ubuqiniso" "Ayikho ebubanzini" - "Ukufinyeela okungekhona kwe-inthanethi kutholakele, ngeke kuxhumeke ngokuzenzakalelayo." + "Ukufinyeela okungekhona kwe-inthanethi kutholakele, ngeke kuxhumeke ngokuzenzakalelayo." + "Akukho ukufinyelela kwe-intanethi." "Kulondolozwe ngu-%1$s" "Ixhunywe ngomsizi we-Wi-FI" "Kuxhumeke nge-%1$s" @@ -233,8 +234,6 @@ "Bonisa imikhawulo, imiphetho, njll, yesiqeshana." "Phoqelela isikhombisi-ndlela sesakhiwo se-RTL" "Phoqelela isikhombisi-ndlela sesikrini ku-RTL kuzo zonke izifunda" - "Bonisa ukusebenzisa i-CPU" - "Imbondela yesikrini ibonisa ukusetshenziswa kwe-CPU okwamanje" "Phoqa ukunikeza i-GPU" "Phoqelela ukusetshenziswa kwe-GPU ngomdwebo we-2d" "Phoqelela i-4x MSAA" @@ -341,4 +340,5 @@ "Okukhulu kakhulu" "Ngokwezifiso (%d)" "Usizo nempendulo" + "Imenyu" diff --git a/packages/SettingsLib/res/values/config.xml b/packages/SettingsLib/res/values/config.xml index 0cf4a411ec4e05ba8cbf12339f2f1b3eb280a4f8..0aa76a024d5ba02c469a9ee6a00b18d9227f1fb5 100755 --- a/packages/SettingsLib/res/values/config.xml +++ b/packages/SettingsLib/res/values/config.xml @@ -23,8 +23,8 @@ 2048 - - true + + false @@ -37,4 +37,7 @@ - + + + + \ No newline at end of file diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml index 99bd73331c202fe79d048021b4ca41db78c1c0c5..bc6a226e59eeff70e3c1b648e77e4cb62833f375 100644 --- a/packages/SettingsLib/res/values/strings.xml +++ b/packages/SettingsLib/res/values/strings.xml @@ -64,8 +64,10 @@ Authentication problem Not in range + + No Internet Access Detected, won\'t automatically reconnect. - No Internet Access Detected, won\'t automatically reconnect. + No Internet Access. Saved by %1$s @@ -586,11 +588,6 @@ Force screen layout direction to RTL for all locales - - Show CPU usage - - Screen overlay showing current CPU usage - Force GPU rendering @@ -869,4 +866,7 @@ Help & feedback + + Menu + diff --git a/packages/SettingsLib/src/com/android/settingslib/HelpUtils.java b/packages/SettingsLib/src/com/android/settingslib/HelpUtils.java index b5295da3cfaf0c3fc2ff5511145c65edc395c986..381f903a97016b28ec3a4bc7152ac1104839d17b 100644 --- a/packages/SettingsLib/src/com/android/settingslib/HelpUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/HelpUtils.java @@ -34,6 +34,8 @@ import android.util.TypedValue; import android.view.Menu; import android.view.MenuItem; import android.view.MenuItem.OnMenuItemClickListener; +import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.MetricsProto.MetricsEvent; import java.net.URISyntaxException; import java.util.Locale; @@ -112,6 +114,9 @@ public class HelpUtils { helpMenuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { + MetricsLogger.action(activity, + MetricsEvent.ACTION_SETTING_HELP_AND_FEEDBACK, + intent.getStringExtra(EXTRA_CONTEXT)); try { activity.startActivityForResult(intent, 0); } catch (ActivityNotFoundException exc) { diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java index a22a05125875034b84e6e5e6e452409cfe5c71ac..f0ec107865075635b25e40b7f60455e5aac28069 100644 --- a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java +++ b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java @@ -47,6 +47,7 @@ import android.util.Log; import android.util.SparseArray; import com.android.internal.util.ArrayUtils; +import com.android.settingslib.R; import java.io.File; import java.text.Collator; @@ -621,7 +622,7 @@ public class ApplicationsState { } if (filter != null) { - filter.init(); + filter.init(mContext); } List apps; @@ -1280,6 +1281,9 @@ public class ApplicationsState { public interface AppFilter { void init(); + default void init(Context context) { + init(); + } boolean filterApp(AppEntry info); } @@ -1398,6 +1402,33 @@ public class ApplicationsState { } }; + public static final AppFilter FILTER_NOT_HIDE = new AppFilter() { + private String[] mHidePackageNames; + + public void init(Context context) { + mHidePackageNames = context.getResources() + .getStringArray(R.array.config_hideWhenDisabled_packageNames); + } + + @Override + public void init() { + } + + @Override + public boolean filterApp(AppEntry entry) { + if (ArrayUtils.contains(mHidePackageNames, entry.info.packageName)) { + if (!entry.info.enabled) { + return false; + } else if (entry.info.enabledSetting == + PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED) { + return false; + } + } + + return true; + } + }; + public static class VolumeFilter implements AppFilter { private final String mVolumeUuid; @@ -1424,6 +1455,12 @@ public class ApplicationsState { mSecondFilter = second; } + @Override + public void init(Context context) { + mFirstFilter.init(context); + mSecondFilter.init(context); + } + @Override public void init() { mFirstFilter.init(); diff --git a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageMeasurement.java b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageMeasurement.java index 0e3e0d584e97dbd38e708d389194d72766de950f..5c577f8aa83cb9ee8ac3e629bab20b5e88cc21be 100644 --- a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageMeasurement.java +++ b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageMeasurement.java @@ -126,6 +126,13 @@ public class StorageMeasurement { * internal storage. Key is {@link UserHandle}. */ public SparseLongArray usersSize = new SparseLongArray(); + + @Override + public String toString() { + return "MeasurementDetails: [totalSize: " + totalSize + " availSize: " + availSize + + " cacheSize: " + cacheSize + " mediaSize: " + mediaSize + + " miscSize: " + miscSize + "usersSize: " + usersSize + "]"; + } } public interface MeasurementReceiver { @@ -435,7 +442,7 @@ public class StorageMeasurement { private static long getDirectorySize(IMediaContainerService imcs, File path) { try { final long size = imcs.calculateDirectorySize(path.toString()); - Log.d(TAG, "getDirectorySize(" + path + ") returned " + size); + if (LOGV) Log.v(TAG, "getDirectorySize(" + path + ") returned " + size); return size; } catch (Exception e) { Log.w(TAG, "Could not read memory from default container service for " + path, e); diff --git a/packages/SettingsLib/src/com/android/settingslib/display/DisplayDensityUtils.java b/packages/SettingsLib/src/com/android/settingslib/display/DisplayDensityUtils.java index 8a49de0d3354ab0171a993218a6e60717c13c152..b6e3d31c99d8b8d55ad5cf06de93820507ab814d 100644 --- a/packages/SettingsLib/src/com/android/settingslib/display/DisplayDensityUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/display/DisplayDensityUtils.java @@ -23,6 +23,7 @@ import android.content.res.Resources; import android.hardware.display.DisplayManager; import android.os.AsyncTask; import android.os.RemoteException; +import android.os.UserHandle; import android.util.DisplayMetrics; import android.util.Log; import android.util.MathUtils; @@ -209,39 +210,41 @@ public class DisplayDensityUtils { /** * Asynchronously applies display density changes to the specified display. + *

          + * The change will be applied to the user specified by the value of + * {@link UserHandle#myUserId()} at the time the method is called. * * @param displayId the identifier of the display to modify */ public static void clearForcedDisplayDensity(final int displayId) { - AsyncTask.execute(new Runnable() { - @Override - public void run() { - try { - final IWindowManager wm = WindowManagerGlobal.getWindowManagerService(); - wm.clearForcedDisplayDensity(displayId); - } catch (RemoteException exc) { - Log.w(LOG_TAG, "Unable to clear forced display density setting"); - } + final int userId = UserHandle.myUserId(); + AsyncTask.execute(() -> { + try { + final IWindowManager wm = WindowManagerGlobal.getWindowManagerService(); + wm.clearForcedDisplayDensityForUser(displayId, userId); + } catch (RemoteException exc) { + Log.w(LOG_TAG, "Unable to clear forced display density setting"); } }); } /** * Asynchronously applies display density changes to the specified display. + *

          + * The change will be applied to the user specified by the value of + * {@link UserHandle#myUserId()} at the time the method is called. * * @param displayId the identifier of the display to modify * @param density the density to force for the specified display */ public static void setForcedDisplayDensity(final int displayId, final int density) { - AsyncTask.execute(new Runnable() { - @Override - public void run() { - try { - final IWindowManager wm = WindowManagerGlobal.getWindowManagerService(); - wm.setForcedDisplayDensity(displayId, density); - } catch (RemoteException exc) { - Log.w(LOG_TAG, "Unable to save forced display density setting"); - } + final int userId = UserHandle.myUserId(); + AsyncTask.execute(() -> { + try { + final IWindowManager wm = WindowManagerGlobal.getWindowManagerService(); + wm.setForcedDisplayDensityForUser(displayId, density, userId); + } catch (RemoteException exc) { + Log.w(LOG_TAG, "Unable to save forced display density setting"); } }); } diff --git a/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java b/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java index 6658c14bd1cddb6d0a2c3b8d5f167f66bfc1d03c..e6e0243c53e177ad47df4a90a7872faebe1cac0c 100644 --- a/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java +++ b/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java @@ -28,8 +28,11 @@ import android.content.pm.PackageManager; import android.content.res.TypedArray; import android.os.AsyncTask; import android.os.Bundle; +import android.os.UserHandle; +import android.os.UserManager; import android.provider.Settings; import android.support.v4.widget.DrawerLayout; +import android.text.TextUtils; import android.util.ArraySet; import android.util.Log; import android.util.Pair; @@ -56,6 +59,7 @@ public class SettingsDrawerActivity extends Activity { protected static final boolean DEBUG_TIMING = false; private static final String TAG = "SettingsDrawerActivity"; + private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); public static final String EXTRA_SHOW_MENU = "show_drawer_menu"; @@ -73,6 +77,7 @@ public class SettingsDrawerActivity extends Activity { private FrameLayout mContentHeaderContainer; private DrawerLayout mDrawerLayout; private boolean mShowingMenu; + private UserManager mUserManager; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { @@ -108,8 +113,10 @@ public class SettingsDrawerActivity extends Activity { public void onItemClick(android.widget.AdapterView parent, View view, int position, long id) { onTileClicked(mDrawerAdapter.getTile(position)); - }; + } }); + + mUserManager = UserManager.get(this); if (DEBUG_TIMING) Log.d(TAG, "onCreate took " + (System.currentTimeMillis() - startTime) + " ms"); } @@ -138,8 +145,16 @@ public class SettingsDrawerActivity extends Activity { new CategoriesUpdater().execute(); } - if (getIntent() != null && getIntent().getBooleanExtra(EXTRA_SHOW_MENU, false)) { - showMenuIcon(); + final Intent intent = getIntent(); + if (intent != null) { + if (intent.hasExtra(EXTRA_SHOW_MENU)) { + if (intent.getBooleanExtra(EXTRA_SHOW_MENU, false)) { + // Intent explicitly set to show menu. + showMenuIcon(); + } + } else if (isTopLevelTile(intent)) { + showMenuIcon(); + } } } @@ -152,6 +167,30 @@ public class SettingsDrawerActivity extends Activity { super.onPause(); } + private boolean isTopLevelTile(Intent intent) { + final ComponentName componentName = intent.getComponent(); + if (componentName == null) { + return false; + } + // Look for a tile that has the same component as incoming intent + final List categories = getDashboardCategories(); + for (DashboardCategory category : categories) { + for (Tile tile : category.tiles) { + if (TextUtils.equals(tile.intent.getComponent().getClassName(), + componentName.getClassName())) { + if (DEBUG) { + Log.d(TAG, "intent is for top level tile: " + tile.title); + } + return true; + } + } + } + if (DEBUG) { + Log.d(TAG, "Intent is not for top level settings " + intent); + } + return false; + } + public void addCategoryListener(CategoryListener listener) { mCategoryListeners.add(listener); } @@ -226,6 +265,7 @@ public class SettingsDrawerActivity extends Activity { public void showMenuIcon() { mShowingMenu = true; getActionBar().setHomeAsUpIndicator(R.drawable.ic_menu); + getActionBar().setHomeActionContentDescription(R.string.content_description_menu_button); getActionBar().setDisplayHomeAsUpEnabled(true); } @@ -256,6 +296,7 @@ public class SettingsDrawerActivity extends Activity { return true; } try { + updateUserHandlesIfNeeded(tile); int numUserHandles = tile.userHandle.size(); if (numUserHandles > 1) { ProfileSelectDialog.show(getFragmentManager(), tile); @@ -277,6 +318,19 @@ public class SettingsDrawerActivity extends Activity { return true; } + private void updateUserHandlesIfNeeded(Tile tile) { + List userHandles = tile.userHandle; + + for (int i = userHandles.size() - 1; i >= 0; i--) { + if (mUserManager.getUserInfo(userHandles.get(i).getIdentifier()) == null) { + if (DEBUG) { + Log.d(TAG, "Delete the user: " + userHandles.get(i).getIdentifier()); + } + userHandles.remove(i); + } + } + } + protected void onTileClicked(Tile tile) { if (openTile(tile)) { finish(); diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java index 380fcd4c30bac879edf56fb57c3bb0ed792f5dbc..234ae712c49e0c0e1bfebf9c95ff392ce8529160 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java @@ -356,21 +356,26 @@ public class AccessPoint implements Comparable { } public DetailedState getDetailedState() { - return mNetworkInfo != null ? mNetworkInfo.getDetailedState() : null; + if (mNetworkInfo != null) { + return mNetworkInfo.getDetailedState(); + } + Log.w(TAG, "NetworkInfo is null, cannot return detailed state"); + return null; } public String getSavedNetworkSummary() { - if (mConfig != null) { + WifiConfiguration config = mConfig; + if (config != null) { PackageManager pm = mContext.getPackageManager(); String systemName = pm.getNameForUid(android.os.Process.SYSTEM_UID); - int userId = UserHandle.getUserId(mConfig.creatorUid); + int userId = UserHandle.getUserId(config.creatorUid); ApplicationInfo appInfo = null; - if (mConfig.creatorName != null && mConfig.creatorName.equals(systemName)) { + if (config.creatorName != null && config.creatorName.equals(systemName)) { appInfo = mContext.getApplicationInfo(); } else { try { IPackageManager ipm = AppGlobals.getPackageManager(); - appInfo = ipm.getApplicationInfo(mConfig.creatorName, 0 /* flags */, userId); + appInfo = ipm.getApplicationInfo(config.creatorName, 0 /* flags */, userId); } catch (RemoteException rex) { } } @@ -385,29 +390,36 @@ public class AccessPoint implements Comparable { } public String getSummary() { - return getSettingsSummary(); + return getSettingsSummary(mConfig); } public String getSettingsSummary() { + return getSettingsSummary(mConfig); + } + + private String getSettingsSummary(WifiConfiguration config) { // Update to new summary StringBuilder summary = new StringBuilder(); - if (isActive() && mConfig != null && mConfig.isPasspoint()) { + if (isActive() && config != null && config.isPasspoint()) { // This is the active connection on passpoint summary.append(getSummary(mContext, getDetailedState(), - false, mConfig.providerFriendlyName)); + false, config.providerFriendlyName)); } else if (isActive()) { // This is the active connection on non-passpoint network summary.append(getSummary(mContext, getDetailedState(), mInfo != null && mInfo.isEphemeral())); - } else if (mConfig != null && mConfig.isPasspoint()) { + } else if (config != null && config.isPasspoint()) { String format = mContext.getString(R.string.available_via_passpoint); - summary.append(String.format(format, mConfig.providerFriendlyName)); - } else if (mConfig != null && mConfig.hasNoInternetAccess()) { - summary.append(mContext.getString(R.string.wifi_no_internet)); - } else if (mConfig != null && !mConfig.getNetworkSelectionStatus().isNetworkEnabled()) { + summary.append(String.format(format, config.providerFriendlyName)); + } else if (config != null && config.hasNoInternetAccess()) { + int messageID = config.getNetworkSelectionStatus().isNetworkPermanentlyDisabled() + ? R.string.wifi_no_internet_no_reconnect + : R.string.wifi_no_internet; + summary.append(mContext.getString(messageID)); + } else if (config != null && !config.getNetworkSelectionStatus().isNetworkEnabled()) { WifiConfiguration.NetworkSelectionStatus networkStatus = - mConfig.getNetworkSelectionStatus(); + config.getNetworkSelectionStatus(); switch (networkStatus.getNetworkSelectionDisableReason()) { case WifiConfiguration.NetworkSelectionStatus.DISABLED_AUTHENTICATION_FAILURE: summary.append(mContext.getString(R.string.wifi_disabled_password_failure)); @@ -423,7 +435,7 @@ public class AccessPoint implements Comparable { } else if (mRssi == Integer.MAX_VALUE) { // Wifi out of range summary.append(mContext.getString(R.string.wifi_not_in_range)); } else { // In range, not disabled. - if (mConfig != null) { // Is saved network + if (config != null) { // Is saved network summary.append(mContext.getString(R.string.wifi_remembered)); } } @@ -435,11 +447,11 @@ public class AccessPoint implements Comparable { summary.append(" f=" + Integer.toString(mInfo.getFrequency())); } summary.append(" " + getVisibilityStatus()); - if (mConfig != null && !mConfig.getNetworkSelectionStatus().isNetworkEnabled()) { - summary.append(" (" + mConfig.getNetworkSelectionStatus().getNetworkStatusString()); - if (mConfig.getNetworkSelectionStatus().getDisableTime() > 0) { + if (config != null && !config.getNetworkSelectionStatus().isNetworkEnabled()) { + summary.append(" (" + config.getNetworkSelectionStatus().getNetworkStatusString()); + if (config.getNetworkSelectionStatus().getDisableTime() > 0) { long now = System.currentTimeMillis(); - long diff = (now - mConfig.getNetworkSelectionStatus().getDisableTime()) / 1000; + long diff = (now - config.getNetworkSelectionStatus().getDisableTime()) / 1000; long sec = diff%60; //seconds long min = (diff/60)%60; //minutes long hour = (min/60)%60; //hours @@ -451,9 +463,9 @@ public class AccessPoint implements Comparable { summary.append(")"); } - if (mConfig != null) { + if (config != null) { WifiConfiguration.NetworkSelectionStatus networkStatus = - mConfig.getNetworkSelectionStatus(); + config.getNetworkSelectionStatus(); for (int index = WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_ENABLE; index < WifiConfiguration.NetworkSelectionStatus .NETWORK_SELECTION_DISABLED_MAX; index++) { @@ -790,7 +802,10 @@ public class AccessPoint implements Comparable { return context.getString(R.string.wifi_connected_no_internet); } } - + if (state == null) { + Log.w(TAG, "state is null, returning empty summary"); + return ""; + } String[] formats = context.getResources().getStringArray((ssid == null) ? R.array.wifi_status : R.array.wifi_status_with_ssid); int index = state.ordinal(); diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java index 284827b579295afcb40e946ec7b58af1ef8a26ae..aae9cf6de7978f8d71a3df4b662b1a1fa0de1cfe 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java @@ -29,7 +29,6 @@ import android.text.TextUtils; import android.util.AttributeSet; import android.util.SparseArray; import android.widget.TextView; - import com.android.settingslib.R; public class AccessPointPreference extends Preference { @@ -44,13 +43,14 @@ public class AccessPointPreference extends Preference { private final StateListDrawable mWifiSld; private final int mBadgePadding; private final UserBadgeCache mBadgeCache; - private TextView mTitleView; + private boolean mForSavedNetworks = false; private AccessPoint mAccessPoint; private Drawable mBadge; private int mLevel; private CharSequence mContentDescription; + private int mDefaultIconResId; static final int[] WIFI_CONNECTION_STRENGTH = { R.string.accessibility_wifi_one_bar, @@ -85,6 +85,24 @@ public class AccessPointPreference extends Preference { refresh(); } + public AccessPointPreference(AccessPoint accessPoint, Context context, UserBadgeCache cache, + int iconResId, boolean forSavedNetworks) { + super(context); + mBadgeCache = cache; + mAccessPoint = accessPoint; + mForSavedNetworks = forSavedNetworks; + mAccessPoint.setTag(this); + mLevel = -1; + mDefaultIconResId = iconResId; + + mWifiSld = (StateListDrawable) context.getTheme() + .obtainStyledAttributes(wifi_signal_attributes).getDrawable(0); + + // Distance from the end of the title at which this AP's user badge should sit. + mBadgePadding = context.getResources() + .getDimensionPixelSize(R.dimen.wifi_preference_badge_padding); + } + public AccessPoint getAccessPoint() { return mAccessPoint; } @@ -112,7 +130,7 @@ public class AccessPointPreference extends Preference { protected void updateIcon(int level, Context context) { if (level == -1) { - setIcon(null); + safeSetDefaultIcon(); } else { if (getIcon() == null) { // To avoid a drawing race condition, we first set the state (SECURE/NONE) and then @@ -124,16 +142,24 @@ public class AccessPointPreference extends Preference { ? STATE_SECURED : STATE_NONE); Drawable drawable = mWifiSld.getCurrent(); - if (!mForSavedNetworks) { + if (!mForSavedNetworks && drawable != null) { setIcon(drawable); - } else { - setIcon(null); + return; } } + safeSetDefaultIcon(); } } } + private void safeSetDefaultIcon() { + if (mDefaultIconResId != 0) { + setIcon(mDefaultIconResId); + } else { + setIcon(null); + } + } + protected void updateBadge(Context context) { WifiConfiguration config = mAccessPoint.getConfig(); if (config != null) { diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml index 779dd4adbe2648514e1d3e7be19b0f1aa81fe59c..03977adfb3f9216356db53ba9634e650ed31c969 100644 --- a/packages/SettingsProvider/res/values/defaults.xml +++ b/packages/SettingsProvider/res/values/defaults.xml @@ -43,7 +43,7 @@ 100% true - false + true false false true diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java index e5d00c3a3ae22285041cfb90fe685797d730e1df..0c0ff00c967810cc0534fcc634bb9992131f350a 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java @@ -1497,7 +1497,6 @@ class DatabaseHelper extends SQLiteOpenHelper { Settings.Global.CALL_AUTO_RETRY, Settings.Global.DEBUG_APP, Settings.Global.WAIT_FOR_DEBUGGER, - Settings.Global.SHOW_PROCESSES, Settings.Global.ALWAYS_FINISH_ACTIVITIES, }; String[] secureToGlobal = { diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index f2cee181c3bee25561de936a7bcfb504ef07b1f0..cae6451ae6b9a34517ed05c3c75b385dd398c846 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -114,7 +114,7 @@ import java.util.regex.Pattern; public class SettingsProvider extends ContentProvider { private static final boolean DEBUG = false; - private static final boolean DROP_DATABASE_ON_MIGRATION = !Build.IS_DEBUGGABLE; + private static final boolean DROP_DATABASE_ON_MIGRATION = true; private static final String LOG_TAG = "SettingsProvider"; @@ -2107,7 +2107,7 @@ public class SettingsProvider extends ContentProvider { } private final class UpgradeController { - private static final int SETTINGS_VERSION = 130; + private static final int SETTINGS_VERSION = 131; private final int mUserId; @@ -2147,6 +2147,12 @@ public class SettingsProvider extends ContentProvider { // Now upgrade should work fine. onUpgradeLocked(mUserId, oldVersion, newVersion); + + // Make a note what happened, so we don't wonder why data was lost + String reason = "Settings rebuilt! Current version: " + + curVersion + " while expected: " + newVersion; + getGlobalSettingsLocked().insertSettingLocked( + Settings.Global.DATABASE_DOWNGRADE_REASON, reason, "android"); } // Set the global settings version if owner. @@ -2602,8 +2608,23 @@ public class SettingsProvider extends ContentProvider { currentVersion = 130; } + if (currentVersion == 130) { + // Split Ambient settings + final SettingsState secureSettings = getSecureSettingsLocked(userId); + boolean dozeExplicitlyDisabled = "0".equals(secureSettings. + getSettingLocked(Settings.Secure.DOZE_ENABLED).getValue()); + + if (dozeExplicitlyDisabled) { + secureSettings.insertSettingLocked(Settings.Secure.DOZE_PULSE_ON_PICK_UP, + "0", SettingsState.SYSTEM_PACKAGE_NAME); + secureSettings.insertSettingLocked(Settings.Secure.DOZE_PULSE_ON_DOUBLE_TAP, + "0", SettingsState.SYSTEM_PACKAGE_NAME); + } + currentVersion = 131; + } + if (currentVersion != newVersion) { - Slog.w("SettingsProvider", "warning: upgrading settings database to version " + Slog.wtf("SettingsProvider", "warning: upgrading settings database to version " + newVersion + " left it at " + currentVersion + " instead; this is probably a bug", new Throwable()); if (DEBUG) { diff --git a/packages/Shell/Android.mk b/packages/Shell/Android.mk index 73a044951bd50f4581e92438d95b9edb5d3725d6..81ab2ffc2a232a62c21fb57d86a836e3b8c7ceaf 100644 --- a/packages/Shell/Android.mk +++ b/packages/Shell/Android.mk @@ -12,6 +12,8 @@ LOCAL_PACKAGE_NAME := Shell LOCAL_CERTIFICATE := platform LOCAL_PRIVILEGED_MODULE := true +LOCAL_JACK_COVERAGE_INCLUDE_FILTER := com.android.shell.* + include $(BUILD_PACKAGE) include $(LOCAL_PATH)/tests/Android.mk diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index f1789ea03682ccac25ae25e58c97abb347773c56..227d0e944e6ea57897d89703eb18f8b98e185095 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -114,6 +114,8 @@ + + - - - @@ -220,19 +217,10 @@ - - - - - - - - - diff --git a/packages/SystemUI/res/drawable/car_ic_arrow.xml b/packages/SystemUI/res/drawable/car_ic_arrow.xml index 9d292cc0259a64ca83bd62fd6a9a10369fa5781b..2c5ad27fe292af4209708643f0d420d04193d1fd 100644 --- a/packages/SystemUI/res/drawable/car_ic_arrow.xml +++ b/packages/SystemUI/res/drawable/car_ic_arrow.xml @@ -21,7 +21,4 @@ - diff --git a/packages/SystemUI/res/drawable/ic_fullscreen_white_24dp.xml b/packages/SystemUI/res/drawable/ic_fullscreen_white_24dp.xml index 7ddb40c503a6ebae6d93d3ad804f6e10bf3fa921..314a25a6d5b21a9005054d435da63e2237ea280e 100644 --- a/packages/SystemUI/res/drawable/ic_fullscreen_white_24dp.xml +++ b/packages/SystemUI/res/drawable/ic_fullscreen_white_24dp.xml @@ -18,9 +18,6 @@ Copyright (C) 2016 The Android Open Source Project android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> - - diff --git a/packages/SystemUI/res/drawable/ic_ksh_key_backspace.xml b/packages/SystemUI/res/drawable/ic_ksh_key_backspace.xml index 6519673de87120f68f4ed28d4e7974b2afcffca1..1183203bc58d49b4aa01926125b6b8e0642c8563 100644 --- a/packages/SystemUI/res/drawable/ic_ksh_key_backspace.xml +++ b/packages/SystemUI/res/drawable/ic_ksh_key_backspace.xml @@ -19,7 +19,6 @@ android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> - - diff --git a/packages/SystemUI/res/drawable/ic_ksh_key_left.xml b/packages/SystemUI/res/drawable/ic_ksh_key_left.xml index 038187e86acbceef775eda77a1696e4d67283b4b..57d0423e9ce0fe1b32a44ee89eec8a2db1bc9922 100644 --- a/packages/SystemUI/res/drawable/ic_ksh_key_left.xml +++ b/packages/SystemUI/res/drawable/ic_ksh_key_left.xml @@ -21,5 +21,4 @@ android:viewportHeight="24"> - diff --git a/packages/SystemUI/res/drawable/ic_ksh_key_meta.xml b/packages/SystemUI/res/drawable/ic_ksh_key_meta.xml index 1e2195edaf21e057208bc05ce302a8ec344a06ad..be8fe8c57215cbd2d11c82c926c2a8ed13dabe4b 100644 --- a/packages/SystemUI/res/drawable/ic_ksh_key_meta.xml +++ b/packages/SystemUI/res/drawable/ic_ksh_key_meta.xml @@ -24,5 +24,4 @@ 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27 .28 v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z" /> - diff --git a/packages/SystemUI/res/drawable/ic_ksh_key_right.xml b/packages/SystemUI/res/drawable/ic_ksh_key_right.xml index f2d73150705a07b9a188efbb274e4d329d011f29..720d4e4b24fbdf5e2bdc77a73377c4e7ba4441f5 100644 --- a/packages/SystemUI/res/drawable/ic_ksh_key_right.xml +++ b/packages/SystemUI/res/drawable/ic_ksh_key_right.xml @@ -21,5 +21,4 @@ android:viewportHeight="24"> - diff --git a/packages/SystemUI/res/drawable/ic_ksh_key_up.xml b/packages/SystemUI/res/drawable/ic_ksh_key_up.xml index 36a83b1d1e821fa636e7a825069bd3fc23aa66c7..350c9949bc4b946eeb4bd5dd787402a8bb1d0502 100644 --- a/packages/SystemUI/res/drawable/ic_ksh_key_up.xml +++ b/packages/SystemUI/res/drawable/ic_ksh_key_up.xml @@ -21,5 +21,4 @@ android:viewportHeight="24"> - diff --git a/packages/SystemUI/res/drawable/ic_pause_white_24dp.xml b/packages/SystemUI/res/drawable/ic_pause_white_24dp.xml index d9a4f7bd91372f7afb4da2b886af6f62036fee3a..5b65f100490cdfad000d681a70511df9a57a8505 100644 --- a/packages/SystemUI/res/drawable/ic_pause_white_24dp.xml +++ b/packages/SystemUI/res/drawable/ic_pause_white_24dp.xml @@ -22,6 +22,4 @@ Copyright (C) 2016 The Android Open Source Project - diff --git a/packages/SystemUI/res/drawable/ic_play_arrow_white_24dp.xml b/packages/SystemUI/res/drawable/ic_play_arrow_white_24dp.xml index b8fa99e1dbae162f184e26ebfd33a22181a2ab31..ddc9e8dd17a0e3be039c3bcba80bfc40b358a2e4 100644 --- a/packages/SystemUI/res/drawable/ic_play_arrow_white_24dp.xml +++ b/packages/SystemUI/res/drawable/ic_play_arrow_white_24dp.xml @@ -22,6 +22,4 @@ Copyright (C) 2016 The Android Open Source Project - diff --git a/packages/SystemUI/res/drawable/ic_qs_data_disabled.xml b/packages/SystemUI/res/drawable/ic_qs_data_disabled.xml index b4144a3474fd9a5b419fc553d018c49facf706bd..d11b6f461870519e53b7f9502c31338a9d4f9879 100644 --- a/packages/SystemUI/res/drawable/ic_qs_data_disabled.xml +++ b/packages/SystemUI/res/drawable/ic_qs_data_disabled.xml @@ -14,8 +14,9 @@ limitations under the License. --> - - diff --git a/packages/SystemUI/res/drawable/stat_sys_data_disabled.xml b/packages/SystemUI/res/drawable/stat_sys_data_disabled.xml index 4e2a0245ab2a2b790f019eb11cad7b3a19b99cae..694019e9886788167242ba77c09888b1e67b17fc 100644 --- a/packages/SystemUI/res/drawable/stat_sys_data_disabled.xml +++ b/packages/SystemUI/res/drawable/stat_sys_data_disabled.xml @@ -14,9 +14,9 @@ limitations under the License. --> + + + \ No newline at end of file diff --git a/packages/SystemUI/res/layout/notification_guts.xml b/packages/SystemUI/res/layout/notification_guts.xml index 1250221668c9cf0c54b0a5490143220a8366d259..3097dbe7c9f6b6cccb1744ae5016e3250466fe06 100644 --- a/packages/SystemUI/res/layout/notification_guts.xml +++ b/packages/SystemUI/res/layout/notification_guts.xml @@ -91,6 +91,16 @@ style="@style/TextAppearance.NotificationGuts.Radio" android:buttonTint="@color/notification_guts_buttons" /> + + + android:imeOptions="actionNone|flagNoExtractUi|flagNoFullscreen" /> + + "4G-data is laat wag" "Sellulêre data is onderbreek" "Data is onderbreek" - "Omdat die gestelde dataperk bereik is, het die toestel datagebruik vir die res van hierdie siklus onderbreek.\n\nAs dit hervat word, kan dit tot heffings deur jou diensverskaffer lei." + "Jy het die datalimiet wat jy gestel het, bereik. Jy gebruik nie meer sellulêre data nie.\n\nAs jy voortgaan, kan heffings vir datagebruik geld." "Hervat" "Geen internetverbinding nie" "Wi-Fi gekoppel" @@ -404,6 +404,7 @@ "Toestel kan gemonitor word" "Profiel kan gemonitor word" "Netwerk kan dalk gemonitor word" + "Netwerk kan dalk gemonitor word" "Toestelmonitering" "Profielmonitering" "Netwerkmonitering" @@ -416,6 +417,7 @@ "VPN" "Jy is gekoppel aan %1$s, wat jou netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor." "Jy is gekoppel aan %1$s, wat jou persoonlike netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor." + "Jy is gekoppel aan %1$s, wat jou persoonlike netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor." "Jou werkprofiel word deur %1$s bestuur. Dit is gekoppel aan %2$s, wat jou werknetwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor.\n\nKontak jou administrateur vir meer inligting." "Jou werkprofiel word deur %1$s bestuur. Dit is gekoppel aan %2$s, wat jou werknetwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor.\n\nJy is ook gekoppel aan %3$s, wat jou persoonlike netwerkaktiwiteit kan monitor." "Jou toestel word bestuur deur %1$s\n\nJou administrateur kan instelings, korporatiewe toegang, programme, data wat met jou toestel geassosieer word en jou toestel se ligginginligting monitor en bestuur.\n\nJy is gekoppel aan %2$s, wat jou netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor.\n\nVir meer inligting, kontak jou administrateur." @@ -492,8 +494,6 @@ "Wys horlosiesekondes op die statusbalk. Sal batterylewe dalk beïnvloed." "Herrangskik Kitsinstellings" "Wys helderheid in Kitsinstellings" - "Aktiveer die verdeling van die skerm deur op te swiep" - "Aktiveer gebaar om skerm te verdeel deur van die Oorsig-knoppie af op te swiep" "Eksperimenteel" "Skakel Bluetooth aan?" "Jy moet Bluetooth aanskakel om jou sleutelbord aan jou tablet te koppel." @@ -651,4 +651,5 @@ "Maak %s-instellings oop." "Wysig volgorde van instellings." "Bladsy %1$d van %2$d" + "Kennisgewings kan nie stilgemaak of geblokkeer word nie" diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index bd4afe177b3ea7bf51dbdf602539d6b746e78d3e..98f09f4e5d5120e29e477a4f35f09460cfd5d16a 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -238,7 +238,7 @@ "4ጂ ውሂብ ላፍታ ቆሟል" "የተንቀሳቃሽ ስልክ ውሂብ ላፍታ ቆሟል" "ውሂብ ላፍታ ቆሟል" - "የእርስዎ የተዋቀረው የውሂብ ገደብ ላይ ስለተደረሰ፣ የዚህን ዑደት አጠቃቀም ለማስታወስ መሣሪያው ላፍታ ቆሟል።\n\nከቆመበት ማስቀጠሉ ከእርስዎ የአገልግሎት አቅራቢ ክፍያን ሊያስጠይቅዎት ይችላል።" + "እርስዎ ያስቀመጡት የውሂብ ገደብ ላይ ተደርሷል። ከእንግዲህ ተንቀሳቃሽ ውሂብ እየተጠቀሙ አይደለም ያሉት።\n\nከቆመበት ከቀጠሉ የውሂብ አጠቃቀም ክፍያዎች ተፈጻሚ ሊሆኑ ይችላሉ።" "ከቆመበት ቀጥል" "ምንም በይነመረብ ተያያዥ የለም።" "Wi-Fi ተያይዟል" @@ -404,6 +404,7 @@ "መሣሪያው ክትትል የሚደረግበት ሊሆን ይችላል" "መገለጫ ክትትል ሊደረግበት ይችላል" "አውታረ መረብ በክትትል እየተደረገበት ሊሆን ይችላል" + "አውታረ መረብ ክትትል የሚደረግበት ሊሆን ይችላል" "የመሣሪያ ክትትል" "መገለጫን መከታተል" "የአውታረ መረብ ክትትል" @@ -416,6 +417,7 @@ "VPN" "እርስዎ ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው %1$s ጋር ተገናኝተዋል።" "እርስዎ ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የግል የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው %1$s ጋር ተገናኝተዋል።" + "እርስዎ ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የግል የአውታረ መረብ እንቅስቃሴዎን ከሚከታተለው ከ%1$s ጋር ተገናኝተዋል።" "የስራ መገለጫዎ በ%1$s ነው እየተዳደረ ያለው። ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው %2$s ጋር ተገናኝተዋል።\n\nተጨማሪ መረጃ ለማግኘት አስተዳዳሪዎን ያነጋግሩ።" "የስራ መገለጫዎ በ%1$s ነው እየተዳደረ ያለው። ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው %2$s ጋር ተገናኝተዋል።\n\nእንዲሁም የግል አውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው %3$s ጋርም ተገናኝተዋል።" "የእርስዎ መሣሪያ በ%1$s ነው የሚተዳደረው።\n\nየእርስዎ አስተዳዳሪ ቅንብሮችን፣ የኮርፖሬት መዳረሻን፣ መተግበሪያዎችን፣ ከመሣሪያዎ ጋር የተጎዳኘ ውሂብን እና የመሣሪያዎ የአካባቢ መረጃን መከታተል እና ማቀናበር ይችላል።\n\nእርስዎ ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችን ጨምሮ የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው %2$s ጋር ተገናኝተዋል።\n\nተጨማሪ መረጃ ለማግኘት አስተዳዳሪዎን ያነጋግሩ።" @@ -492,8 +494,6 @@ "የሰዓት ሰከንዶችን በሁኔታ አሞሌ ውስጥ አሳይ። በባትሪ ዕድሜ ላይ ተጽዕኖ ሊኖርው ይችል ይሆናል።" "ፈጣን ቅንብሮችን ዳግም ያደራጁ" "በፈጣን ቅንብሮች ውስጥ ብሩህነትን አሳይ" - "የተከፈለ ማያ ገጽ ወደ ላይ የማንሸራተት ጣት ምልክትን ያንቁ" - "ከአጠቃላይ እይታ አዝራሩ ወደ ላይ በማንሸራተት ወደ የተከፈለ ማያ ገጽ የሚገቡበትን የጣት ምልክት ያንቁ" "የሙከራ" "ብሉቱዝ ይብራ?" "የቁልፍ ሰሌዳዎን ከእርስዎ ጡባዊ ጋር ለማገናኘት በመጀመሪያ ብሉቱዝን ማብራት አለብዎት።" @@ -651,4 +651,5 @@ "የ%s ቅንብሮችን ክፈት።" "የቅንብሮድ ቅደም-ተከተል አርትዕ።" "ገጽ %1$d%2$d" + "ማሳወቂያዎች ላይ ድምጸ-ከል ማድረግ ወይም ማገድ አይቻልም" diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index eca668e2e22d82ecadd7eb8ef61e837bebb64f5c..c954e41107c8287639315e0eb65652fc2f2b40c8 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -242,7 +242,7 @@ "تم إيقاف بيانات شبكة الجيل الرابع مؤقتًا" "تم إيقاف بيانات شبكة الجوّال مؤقتًا" "تم إيقاف البيانات مؤقتًا" - "نظرًا لأنك بلغت الحد الأقصى المحدد للبيانات، فقد أوقف الجهاز استخدام البيانات مؤقتًا في بقية هذه الدورة.\n\nومن الممكن أن يؤدي الاستئناف إلى تحصيل رسوم من قِبل مشغِّل شبكة الجوّال." + "تم الوصول إلى حد البيانات الذي عيَّنته، ولم يعد بإمكانك استخدام بيانات شبكة الجوّال.\n\nعند الاستئناف، قد يتم تحصيل رسوم مقابل استخدام البيانات." "استئناف" "لا يوجد اتصال إنترنت" "‏Wi-Fi متصل" @@ -412,6 +412,7 @@ "ربما تتم مراقبة الجهاز" "ربما تتم مراقبة الملف الشخصي" "قد تكون الشبكة خاضعة للمراقبة" + "قد تكون الشبكة خاضعة للمراقبة" "مراقبة الأجهزة" "مراقبة الملف الشخصي" "مراقبة الشبكات" @@ -424,6 +425,7 @@ "شبكة ظاهرية خاصة" "أنت متصل بـ %1$s، الذي يمكنه مراقبة أنشطتك على الشبكة، بما في ذلك الرسائل الإلكترونية والتطبيقات ومواقع الويب." "أنت متصل بـ %1$s، الذي يمكنه مراقبة أنشطتك الشخصية على الشبكة، بما في ذلك الرسائل الإلكترونية والتطبيقات ومواقع الويب." + "أنت متصل بـ %1$s، الذي يمكنه مراقبة أنشطتك الشخصية على الشبكة، بما في ذلك الرسائل الإلكترونية والتطبيقات ومواقع الويب." "تتم إدارة ملفك الشخصي للعمل عن طريق %1$s. وهذا الملف الشخصي للعمل متصل بـ %2$s، الذي يمكنه مراقبة أنشطتك على شبكة العمل، بما في ذلك الرسائل الإلكترونية والتطبيقات ومواقع الويب.\n\nللمزيد من المعلومات، اتصل بالمشرف." "تتم إدارة ملفك الشخصي للعمل عن طريق %1$s. وهذا الملف الشخصي للعمل متصل بـ %2$s، الذي يمكنه مراقبة أنشطتك على شبكة العمل، بما في ذلك الرسائل الإلكترونية والتطبيقات ومواقع الويب.\n\nأنت متصل أيضًا بـ %3$s، الذي يمكنه مراقبة أنشطتك الشخصية على الشبكة." "تتم إدارة جهازك عن طريق %1$s.\n\nيمكن للمشرف مراقبة وإدارة كل من الإعدادات والوصول إلى الشركة والتطبيقات والبيانات المرتبطة بجهازك ومعلومات الموقع لجهازك.\n\nأنت متصل بـ %2$s، الذي يمكنه مراقبة أنشطتك على الشبكة، بما في ذلك الرسائل الإلكترونية والتطبيقات ومواقع الويب.\n\nللمزيد من المعلومات، اتصل بالمشرف." @@ -500,8 +502,6 @@ "عرض ثواني الساعة في شريط الحالة. قد يؤثر ذلك في عمر البطارية." "إعادة ترتيب الإعدادات السريعة" "عرض السطوع في الإعدادات السريعة" - "تمكين إيماءة تقسيم الشاشة بالتمرير السريع لأعلى" - "تمكين الإيماء لإدخال تقسيم الشاشة من خلال التمرير السريع لأعلى من زر النظرة العامة" "إعدادات تجريبية" "تشغيل البلوتوث؟" "لتوصيل لوحة المفاتيح بالجهاز اللوحي، يلزمك تشغيل بلوتوث أولاً." @@ -659,4 +659,5 @@ "فتح إعدادات %s." "تعديل ترتيب الإعدادات." "الصفحة %1$d من %2$d" + "لا يمكن كتم صوت الإشعارات أو حظرها" diff --git a/packages/SystemUI/res/values-az-rAZ/strings.xml b/packages/SystemUI/res/values-az-rAZ/strings.xml index 3d9cc4ab307d0eac89ba3a8b8e63f91c2914fefb..d2f93d2fc7c7a586f922a5dc13843fbc76cedbf2 100644 --- a/packages/SystemUI/res/values-az-rAZ/strings.xml +++ b/packages/SystemUI/res/values-az-rAZ/strings.xml @@ -238,7 +238,7 @@ "4G məlumatlarına fasilə verildi" "Mobil məlumatlara fasilə verildi" "Məlumatlara fasilə verildi" - "Məlumatlar dəsti limitinizi keçdiyiniz üçün cihaz bu dövrənin qalan hissəsi üçün məlumatların istifadəsinə fasilə verib.\n\nDavam etmək operaturunuzdan xərclərə səbəb ola bilər." + "Daha limitini keçdiniz. Artıq mobil data istifadə etmirsiniz.\n\nDavam etsəniz, data istifadəsi üçün ödəniş tətbiq oluna bilər." "Davam et" "İnternet bağlantısı yoxdur" "Wi-Fi qoşulub" @@ -404,6 +404,7 @@ "Cihaz nəzarət altında ola bilər" "Profil izlənə bilər" "Şəbəkə nəzərdən keçirilə bilər" + "Şəbəkə nəzərdən keçirilə bilər" "Cihaza nəzarət" "Profil izlənməsi" "Şəbəkə monitorinqi" @@ -416,6 +417,7 @@ "VPN (Virtual Şəxsi Şəbəkələr)" "%1$s tətbiqinə qoşulmusunuz və o, e-məktublar, tətbiq və veb saytlar daxil olmaqla şəbəkə fəaliyyətinizə nəzarət edə bilər." "%1$s tətbiqinə qoşulmusunuz və o, e-məktublar, tətbiq və veb saytlar daxil olmaqla şəxsi şəbəkə fəaliyyətinizə nəzarət edə bilər." + "%1$s tətbiqinə qoşulmusunuz və o, e-məktublar, tətbiq və veb saytlar daxil olmaqla şəxsi şəbəkə fəaliyyətinizə nəzarət edə bilər." "İş profiliniz %1$s tərəfindən idarə olunur. %2$s tətbiqinə qoşuludur və iş şəbəkə fəaliyyətinizə nəzarət edə bilər, bura e-məktubıar, tətbiq və veb saytlar daxildir.\n\nƏtraflı məlumat üçün administratorunuz ilə əlaqə saxlayın." "İş profiliniz %1$s tərəfindən idarə olunur. %2$s tətbiqinə qoşuludur və iş şəbəkə fəaliyyətinizi idarə edə bilər, bura e-məktubıar, tətbiq və veb saytlar daxildir\n\nSiz, həmçinin, %3$s tətbiqinə də qoşulsunuz və o, şəxsi şəbəkə fəaliyyətinizə nəzarət edə bilər." "Sizin cihaz tərəfindən idarə olunur %1$s . \n\n Sizin administrator nəzarət və parametrləri, korporativ giriş, apps, sizin cihaz ilə bağlı məlumat və cihaz yer məlumat idarə edə bilərsiniz. \n\n Siz bağlı olduğunuz %2$s , E-poçt, apps, və web o cümlədən, şəbəkə fəaliyyətinə nəzarət edə bilər. \n\n Daha ətraflı məlumat üçün, administratora müraciət." @@ -492,8 +494,6 @@ "Saatın saniyəsini status panelində göstərin. Batareyaya təsir edə bilər." "Sürətli Ayarları yenidən tənzimləyin" "Sürətli ayarlarda parlaqlılığı göstərin" - "Bölünmüş ekran sürüşdürməsi aktiv edin" - "Jestlərin icmal düyməsindən yuxarı sürüşdürərək bölünmüş ekrana daxil olmasını aktiv edin" "Eksperimental" "Bluetooth aktivləşsin?" "Tabletinizlə klaviaturaya bağlanmaq üçün ilk olaraq Bluetooth\'u aktivləşdirməlisiniz." @@ -651,4 +651,5 @@ "%s ayarlarını açın." "Ayarların sıralanmasını redaktə edin." "%2$d səhifədən %1$d səhifə" + "Bildirişlər susdurula və ya blok edilə bilməz" diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index f95045c0021ccf22c77457e07ab9cb3490da6e71..19d58d5207808c8f19743b6215c776134f713d3e 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -239,7 +239,7 @@ "4G podaci su pauzirani" "Mobilni podaci su pauzirani" "Podaci su pauzirani" - "Zbog toga što ste dostigli podešeno ograničenje za podatke, uređaj je pauzirao korišćenje podataka tokom ostatka ovog ciklusa.\n\nAko nastavite, mobilni operater može da vam naplati dodatne troškove." + "Ograničenje potrošnje podataka koje ste podesili je dostignuto. Više ne koristite mobilne podatke.\n\nAko nastavite, možda će biti naplaćeni troškovi za potrošnju podataka." "Nastavi" "Nema internet veze" "Wi-Fi je povezan" @@ -406,6 +406,7 @@ "Uređaj se možda nadgleda" "Profil se možda nadgleda" "Mreža se možda nadgleda" + "Mreža se možda nadgleda" "Nadgledanje uređaja" "Nadgledanje profila" "Nadgledanje mreže" @@ -418,6 +419,7 @@ "VPN" "Povezani ste sa aplikacijom %1$s, koja može da nadgleda aktivnosti na mreži, uključujući imejlove, aplikacije i veb-sajtove." "Povezani ste sa aplikacijom %1$s, koja može da nadgleda aktivnosti na ličnoj mreži, uključujući imejlove, aplikacije i veb-sajtove." + "Povezani ste sa aplikacijom %1$s, koja može da nadgleda aktivnosti na ličnoj mreži, uključujući imejlove, aplikacije i veb-sajtove." "Profilom za Work upravlja %1$s. Povezan je sa aplikacijom %2$s, koja može da nadgleda aktivnosti na poslovnoj mreži, uključujući imejlove, aplikacije i veb-sajtove.\n\nViše informacija potražite od administratora." "Profilom za Work upravlja %1$s. Povezan je sa aplikacijom %2$s, koja može da nadgleda aktivnosti na poslovnoj mreži, uključujući imejlove, aplikacije i veb-sajtove.\n\nPovezani ste i sa aplikacijom %3$s, koja može da nadgleda aktivnosti na ličnoj mreži." "Uređajem upravlja %1$s.\n\nAdministrator može da nadgleda podešavanja, korporativni pristup, aplikacije, podatke povezane sa uređajem i informacije o lokaciji uređaja, kao i da upravlja njima.\n\nPovezani ste sa aplikacijom %2$s, koja može da nadgleda aktivnosti na mreži, uključujući imejlove, aplikacije i veb-sajtove.\n\nViše informacija potražite od administratora." @@ -494,8 +496,6 @@ "Sekunde na satu se prikazuju na statusnoj traci. To može da utiče na trajanje baterije." "Preuredi Brza podešavanja" "Prikaži osvetljenost u Brzim podešavanjima" - "Omogući pokret za prevlačenje nagore za podeljeni ekran" - "Omogućava pokret za prelazak na podeljeni ekran prevlačenjem nagore od dugmeta Pregled" "Eksperimentalno" "Želite li da uključite Bluetooth?" "Da biste povezali tastaturu sa tabletom, prvo morate da uključite Bluetooth." @@ -653,4 +653,5 @@ "Otvori podešavanja za %s." "Izmeni redosled podešavanja." "%1$d. strana od %2$d" + "Zvuk obaveštenja ne može da se isključi niti ona mogu da se blokiraju" diff --git a/packages/SystemUI/res/values-be-rBY/strings.xml b/packages/SystemUI/res/values-be-rBY/strings.xml index 325d70652cd3f41b7042857eb9222ef6fabc210d..7538a9a06f4eb8dc0381aa0ee04dea20b0bc3664 100644 --- a/packages/SystemUI/res/values-be-rBY/strings.xml +++ b/packages/SystemUI/res/values-be-rBY/strings.xml @@ -242,7 +242,7 @@ "Перадача даных 4G прыпынена" "Мабільная перадача даных прыпынена" "Перадача даных прыпынена" - "Быў дасягнуты ліміт перадачы даных, таму прылада прыпыніла перадачу даных на астатнюю частку гэтага цыкла.\n\nУзнаўленне перадачы можа прывесці да спагнання платы вашым аператарам." + "Ліміт даных, які вы задалі, быў дасягнуты. Вы больш не выкарыстоўваеце сотавую перадачу даных.\n\nКалі вы ўзновіце карыстанне, можа спаганяцца плата за выкарыстанне трафіка." "Узнавіць" "Няма падключэння да Iнтэрнэту" "Wi-Fi падключаны" @@ -410,6 +410,7 @@ "За прыладай могуць назіраць" "За профілем могуць назіраць" "За сеткай могуць назіраць" + "За сеткай могуць назіраць" "Маніторынг прылад" "Маніторынг профіляў" "Маніторынг сеткі" @@ -422,6 +423,7 @@ "VPN" "Вы падлучаны да праграмы %1$s, якая можа сачыць за вашай сеткавай актыўнасцю, уключаючы электронную пошту, праграмы і вэб-сайты." "Вы падлучаны да праграмы %1$s, якая сачыць за вашай асабістай сеткавай актыўнасцю, уключаючы электронную пошту, праграмы і вэб-сайты." + "Вы падключаны да праграмы %1$s, якая можа сачыць за вашай асабістай сеткавай дзейнасцю, уключаючы электронную пошту, праграмы і вэб-сайты." "Ваш працоўны профіль знаходзіцца пад кіраваннем %1$s. Ён падлучаны да праграмы %2$s, якая можа сачыць за вашай сеткавай актыўнасцю, уключаючы электронную пошту, праграмы і вэб-сайты.\n\nДля атрымання дадатковай інфармацыі звярніцеся да адміністратара." "Ваш працоўны профіль знаходзіцца пад кіраваннем %1$s. Ён падлучаны да праграмы %2$s, якая можа сачыць за вашай сеткавай актыўнасцю, уключаючы электронную пошту, праграмы і вэб-сайты.\n\nВы таксама падлучаны да праграмы %3$s, якая можа сачыць за вашай асабістай сеткавай актыўнасцю." "Ваша прылада знаходзіцца пад кіраваннем %1$s.\n\nВаш адміністратар можа сачыць і кіраваць наладамі, доступам да карпаратыўных рэсурсаў, праграмамі, данымі, звязанымі з вашай прыладай, і звесткамі пра месцазнаходжанне прылады.\n\nВы падлучаны да праграмы %2$s, якая можа сачыць за вашай сеткавай актыўнасцю, уключаючы электронную пошту, праграмы і вэб-сайты.\n\nДля атрымання дадатковай інфармацыі звярніцеся да адміністратара." @@ -498,8 +500,6 @@ "Паказваць секунды гадзінніка на панэлі стану. Можа паўплываць на рэсурс акумулятара." "Змяніць парадак Хуткіх налад" "Паказваць яркасць у Хуткіх наладах" - "Уключ. пераход да рэжыму дзялення экрана правядзеннем уверх" - "Уключыць пераход да рэжыму дзялення экрана правядзеннем пальцам уверх ад кнопкі «Агляд»" "Эксперыментальныя" "Уключыць Bluetooth?" "Для падлучэння клавіятуры да планшэта трэба спачатку ўключыць Bluetooth." @@ -657,4 +657,5 @@ "Адкрыць налады %s." "Змяніць парадак налад." "Старонка %1$d з %2$d" + "Гук паведамленняў нельга адключыць, і іх нельга заблакіраваць" diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index c5817eeeeadce3841a470b967bea5830c28733bd..b1841429807d19d326ea1344dd8c41cea042b7cc 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -238,7 +238,7 @@ "Данните от 4G са поставени на пауза" "Мобилните данни са поставени на пауза" "Данните са поставени на пауза" - "Тъй като зададеното от вас ограничение за данни бе достигнато, устройството постави преноса им на пауза за остатъка от този цикъл.\n\nВъзобновяването може да доведе до таксуване от оператора ви." + "Достигнахте зададеното от вас ограничение за данните. Вече не използвате мобилната мрежа.\n\nАко възобновите връзката с нея, може да бъдете таксувани за пренос на данни." "Възобновяване" "Няма връзка с интернет" "Wi-Fi: Има връзка" @@ -404,6 +404,7 @@ "Устройството може да се наблюдава" "Възможно е потребителският профил да се наблюдава" "Мрежата може да се наблюдава" + "Мрежата може да се наблюдава" "Наблюдение на устройството" "Наблюдаване на потр. профил" "Наблюдение на мрежата" @@ -416,6 +417,7 @@ "VPN" "Установена е връзка с приложението %1$s, което може да наблюдава активността ви в мрежата, включително имейли, приложения и уебсайтове." "Установена е връзка с приложението %1$s, което може да наблюдава личната ви активност в мрежата, включително имейли, приложения и уебсайтове." + "Установена е връзка с приложението %1$s, което може да наблюдава личната ви активност в мрежата, включително имейли, приложения и уебсайтове." "Служебният ви потребителски профил се управлява от %1$s. Той е свързан с приложението %2$s, което може да наблюдава служебната ви активност в мрежата, включително имейли, приложения и уебсайтове.\n\nЗа още информация се свържете с администратора си." "Служебният ви потребителски профил се управлява от %1$s. Той е свързан с приложението %2$s, което може да наблюдава служебната ви активност в мрежата, включително имейли, приложения и уебсайтове.\n\nУстановена е връзка и с приложението %3$s, което може да наблюдава личната ви активност в мрежата." "Устройството ви се управлява от %1$s.\n\nАдминистраторът ви може да наблюдава и управлява настройките, корпоративния достъп, приложенията и данните, свързани с устройството ви, включително информацията за местоположението му.\n\nУстановена е връзка с приложението %2$s, което може да наблюдава активността ви в мрежата, включително имейли, приложения и уебсайтове.\n\nЗа още информация се свържете с администратора си." @@ -492,8 +494,6 @@ "Показване на секундите на часовника в лентата на състоянието. Може да се отрази на живота на батерията." "Пренареждане на бързите настройки" "Показване на яркостта от бързите настройки" - "Разделяне на екрана с прекарване на пръст нагоре: Активиране" - "Активиране на жеста за влизане в режим на разделен екран чрез прокарване на пръст нагоре от бутона за общ преглед" "Експериментални" "Да се включи ли Bluetooth?" "За да свържете клавиатурата с таблета си, първо трябва да включите Bluetooth." @@ -651,4 +651,5 @@ "Отваряне на настройките за %s." "Редактиране на подредбата на настройките." "Страница %1$d от %2$d" + "Известията не могат да бъдат заглушавани, нито блокирани" diff --git a/packages/SystemUI/res/values-bn-rBD/strings.xml b/packages/SystemUI/res/values-bn-rBD/strings.xml index 40076e6d2c3f37f68b1aa1df6bfa4e243a6d4a97..2cd7b04501072167c5971a45f1532da6cbee864d 100644 --- a/packages/SystemUI/res/values-bn-rBD/strings.xml +++ b/packages/SystemUI/res/values-bn-rBD/strings.xml @@ -238,7 +238,7 @@ "4G ডেটা বিরতি দেওয়া হয়েছে" "সেলুলার ডেটা বিরতি দেওয়া হয়েছে" "ডেট বিরতি দেওয়া হয়েছে" - "আপনার সেট ডেটার সীমা অবধি পৌঁছনোর কারনে ডিভাইস এই চক্রের অবশিষ্টাংশের জন্য ডেটা ব্যবহারে বিরতি দেওয়া হয়েছে৷ \n\nপুনরায় চালু করা হলে পরিষেবা প্রদানকারীর দ্বারা চার্জের করা হতে পারে৷" + "আপনার সেটা করা ডেটা সীমা ছাড়িয়ে গেছে৷ আপনি আর সেলুলার ডেটা ব্যবহার করতে পারবেন না৷\n\nআপনি যদি আবার ব্যবহার করতে শুরু করেন তাহলে ডেটা ব্যবহারের জন্য চার্জ লাগতে পারে৷" "পুনঃসূচনা করুন" "কোনো ইন্টারনেট সংযোগ নেই" "ওয়াই-ফাই সংযুক্ত হয়েছে" @@ -404,6 +404,7 @@ "ডিভাইসটি নিরীক্ষণ করা হতে পারে" "প্রোফাইল পর্যবেক্ষণ করা হতে পারে" "নেটওয়ার্ক নিরীক্ষণ করা হতে পারে" + "নেটওয়ার্ক নিরীক্ষণ করা হতে পারে" "ডিভাইস নিরীক্ষণ" "প্রোফাইল দেখরেখ করা" "নেটওয়ার্ক নিরীক্ষণ" @@ -416,6 +417,7 @@ "VPN" "আপনি %1$s -এ সংযুক্ত হয়েছেন, যা ইমেল, অ্যাপ্লিকেশান এবং ওয়েবসাইটগুলি সমেত আপনার নেটওয়ার্ক কার্যকলাপ নিরীক্ষণ করতে পারে৷" "আপনি %1$s -এ সংযুক্ত হয়েছেন, যা ইমেল, অ্যাপ্লিকেশান এবং ওয়েবসাইটগুলি সমেত আপনার ব্যক্তিগত নেটওয়ার্ক কার্যকলাপ নিরীক্ষণ করতে পারে৷" + "আপনি %1$s এর সাথে সংযুক্ত হয়েছেন, যা ইমেল, অ্যাপ এবং ওয়েবসাইটগুলি সহ আপনার ব্যক্তিগত নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করবে৷" "%1$s আপনার কাজের প্রোফাইল পরিচালনা করে৷ এটি %2$s -এ সংযুক্ত রয়েছে যা আপনার ইমেল, অ্যাপ্লিকেশান ও ওয়েবসাইটগুলি সহ আপনার কাজের নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করতে পারে৷\n\nআরো তথ্যের জন্য, আপনার প্রশাসকের সাথে যোগাযোগ করুন৷" "%1$s আপনার কাজের প্রোফাইল পরিচালনা করে৷ এটি %2$s -এ সংযুক্ত রয়েছে যা আপনার ইমেল, অ্যাপ্লিকেশান ও ওয়েবসাইটগুলি সহ আপনার কাজের নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করতে পারে৷\n\nএছাড়াও আপনি %3$s এর সাথে সংযুক্ত রয়েছেন যা আপনার ব্যক্তিগত নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করতে পারে৷" "%1$s আপনার ডিভাইস পরিচালনা করে৷\n\nআপনার প্রশাসক আপনার ডিভাইসের সাথে সম্পর্কিত সেটিংস, কর্পোরেট অ্যাক্সেস, অ্যাপ্লিকেশান ডেটা এবং ডিভাইসের অবস্থান সম্পর্কিত তথ্য নিরীক্ষণ ও পরিচালনা করতে পারেন৷\n\nআপনি %2$s এর সাথে সংযুক্ত রয়েছেন যা ইমেল, অ্যাপ্লিকেশান ও ওয়েবসাইটগুলি সহ আপনার নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করতে পারে৷\n\nআরো তথ্যের জন্য, আপনার প্রশাসকের সাথে যোগাযোগ করুন৷" @@ -492,8 +494,6 @@ "স্থিতি দন্ডে ঘড়ির সেকেন্ড দেখায়৷ ব্যাটারি লাইফকে প্রভাবিত করতে পারে৷" "দ্রুত সেটিংসে পুনরায় সাজান" "দ্রুত সেটিংসে উজ্জ্বলতা দেখান" - "উপরের দিকে সোয়াইপ করে বিভক্ত-স্ক্রীনে প্রবেশ করার অঙ্গভঙ্গি সক্ষম করুন" - "\'এক নজরে\' বোতাম থেকে উপরের দিকে সোয়াইপ করে, বিভক্ত-স্ক্রীনে প্রবেশ করতে অঙ্গভঙ্গি সক্ষম করুন" "পরীক্ষামূলক" "ব্লুটুথ চালু করবেন?" "আপনার ট্যাবলেটের সাথে আপনার কীবোর্ড সংযুক্ত করতে, আপনাকে প্রথমে ব্লুটুথ চালু করতে হবে।" @@ -651,4 +651,5 @@ "%s সেটিংস খুলুন৷" "ক্রম বা সেটিংস সম্পাদনা করুন৷" "%2$dটির মধ্যে %1$d নং পৃষ্ঠা" + "বিজ্ঞপ্তিগুলিকে নীরব বা অবরুদ্ধ করা যাবে না" diff --git a/packages/SystemUI/res/values-bs-rBA-land/strings.xml b/packages/SystemUI/res/values-bs-rBA-land/strings.xml index bdc652af8f1a2d3fb8e99edc2dddc6a3a109559c..56a4ad276d086905ac6e5aea14662a470f69f1bf 100644 --- a/packages/SystemUI/res/values-bs-rBA-land/strings.xml +++ b/packages/SystemUI/res/values-bs-rBA-land/strings.xml @@ -19,5 +19,5 @@ - "Ekran je sada zaključan u pejzažnom prikazu." + "Ekran je sada zaključan u vodoravnom prikazu." diff --git a/packages/SystemUI/res/values-bs-rBA/strings.xml b/packages/SystemUI/res/values-bs-rBA/strings.xml index dcba67bbb6554014666b56f5ae0dcfa422f87bc6..3fc98fd0d0b42a7e6d8c7d8b71a2077892d1889f 100644 --- a/packages/SystemUI/res/values-bs-rBA/strings.xml +++ b/packages/SystemUI/res/values-bs-rBA/strings.xml @@ -239,7 +239,7 @@ "4G prijenos podataka je pauzirano" "Mobilni podaci su pauzirani" "Prijenos podataka je pauziran" - "Dostigli ste postavljeno ograničenje prijenosa podataka pa je uređaj zaustavio prijenos podataka za preostali dio ovog ciklusa.\n\nAko nastavite, operater vam može naplatiti dodatne troškove." + "Dostigli ste ograničenje za prijenos podataka koje ste postavili. Više ne koristite mobilne podatke.\n\nUkoliko nastavite koristiti mobilne podatke, mogući su troškovi za prijenos podataka." "Nastavi" "Nema internet veze" "Wi-Fi veza aktivna" @@ -314,7 +314,7 @@ "Obavještenja" "Svjetiljka" "Mobilni podaci" - "Korištenje podataka" + "Prijenos podataka" "Preostala količina podataka" "Prekoračeno" "Iskorišteno %s" @@ -406,6 +406,7 @@ "Uređaj može biti nadziran" "Profil može biti nadziran" "Mreža može biti nadzirana" + "Mreža može biti nadzirana" "Praćenje uređaja" "Praćenje profila" "Praćenje mreže" @@ -418,6 +419,7 @@ "VPN" "Povezani ste sa aplikacijom %1$s, koja može pratiti vašu aktivnost na mreži, uključujući e-mailove, aplikacije i web-lokacije." "Povezani ste sa aplikacijom %1$s, koja može pratiti vašu aktivnost na privatnoj mreži, uključujući e-mailove, aplikacije i web-lokacije." + "Povezani ste na aplikaciju %1$s, koja može pratiti vaše privatne aktivnosti na mreži, uključujući e-poštu, aplikacije i web stranice." "Profilom za posao upravlja %1$s. Povezan je sa aplikacijom %2$s, koja može pratiti vašu aktivnost na radnoj mreži, uključujući e-poštu, aplikacije i web-lokacije.\n\nZa više informacija kontaktirajte svog administratora." "Profilom za posao upravlja %1$s. Povezan je sa aplikacijom %2$s, koja može pratiti vašu aktivnost na radnoj mreži, uključujući e-poštu, aplikacije i web-lokacije.\n\nPovezani ste i sa aplikacijom %3$s, koja može pratiti vašu aktivnost na privatnoj mreži." "Vašim uređajem upravlja %1$s.\n\nVaš administrator može pratiti postavke, korporativni pristup, aplikacije, podatke povezane sa vašim uređajem i informacije o lokaciji uređaja, kao i upravljati njima.\n\nPovezani ste sa aplikacijom %2$s, koja može pratiti vašu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije.\n\nZa više informacija kontaktirajte svog administratora." @@ -496,8 +498,6 @@ "Prikaži sekunde na statusnoj traci. Može skratiti trajanje baterije." "Preuredi \"Brze postavke\"" "Prikaži osvjetljenje u opciji \"Brze postavke\"" - "Omogućiti potez za podjelu ekrana prevlačenjem prema gore" - "Uključite pokrete prstima da biste ušli u podijeljeni ekran tako što ćete od dugmeta Pregled prevući prstom prema gore" "Eksperimentalno" "Želiti li uključiti Bluetooth?" "Da povežete tastaturu sa tabletom, prvo morate uključiti Bluetooth." @@ -655,4 +655,5 @@ "Otvori postavke za: %s." "Urediti raspored postavki." "Stranica %1$d od %2$d" + "Obavještenja nije moguće prigušiti ili blokirati" diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 3354f92638b0153a4014598bed26fd7b138029d1..483f766f4f46234673dc66a489450277ac6df68c 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -238,7 +238,7 @@ "Les dades 4G estan aturades" "Les dades mòbils estan aturades" "Les dades estan aturades" - "Com que has arribat al límit de dades establert, s\'ha aturat l\'ús de dades del dispositiu per a la resta d\'aquest cicle.\n\nSi el reprens, l\'operador de telefonia mòbil pot aplicar càrrecs." + "S\'ha assolit el límit de dades establert. Ja no estàs utilitzant dades mòbils. \n\n Si reprens l\'ús de les dades, es poden aplicar càrrecs." "Reprèn" "No hi ha connexió a Internet" "Wi-Fi: connectada" @@ -404,6 +404,7 @@ "És possible que el dispositiu estigui supervisat." "El perfil es pot supervisar" "És possible que la xarxa estigui supervisada." + "És possible que la xarxa estigui supervisada" "Supervisió del dispositiu" "Supervisió del perfil" "Supervisió de la xarxa" @@ -416,6 +417,7 @@ "VPN" "Estàs connectat a %1$s, que pot supervisar la teva activitat a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web." "Estàs connectat a %1$s, que pot supervisar la teva activitat personal a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web." + "Estàs connectat a %1$s, que pot supervisar la teva activitat personal a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web." "%1$s gestiona el teu perfil professional. Aquest perfil està connectat a %2$s, que pot supervisar la teva activitat professional a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web.\n\nPer obtenir més informació, contacta amb l\'administrador." "%1$s gestiona el teu perfil professional. Aquest perfil està connectat a %2$s, que pot supervisar la teva activitat professional a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web.\n\nA més, estàs connectat a %3$s, que també pot supervisar la teva activitat personal a la xarxa." "%1$s gestiona el dispositiu.\n\nL\'administrador pot supervisar i gestionar el següent: configuració, accés corporatiu, aplicacions i dades associades amb el dispositiu, inclosa la informació d\'ubicació.\n\nEstàs connectat a %2$s, que pot supervisar l\'activitat a la xarxa, com ara els correus, les aplicacions i els llocs web.\n\nPer obtenir més informació, contacta amb l\'administrador." @@ -492,8 +494,6 @@ "Mostra els segons del rellotge a la barra d\'estat. Això pot afectar la durada de la bateria." "Reorganitza Configuració ràpida" "Mostra la brillantor a Configuració ràpida" - "Activa el gest per dividir la pantalla en lliscar cap amunt" - "Activa el gest per entrar al mode de pantalla dividida en lliscar cap amunt des del botó Visió general" "Experimental" "Vols activar el Bluetooth?" "Per connectar el teclat amb la tauleta, primer has d\'activar el Bluetooth." @@ -651,4 +651,5 @@ "Obre la configuració per a %s." "Edita l\'ordre de la configuració." "Pàgina %1$d (%2$d en total)" + "Les notificacions no es poden silenciar ni bloquejar" diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index d64e5d9eb8069b3dbebc91272321c151b9419fb0..6adcde3d34e2b8e64e0a1e6f05747e327c164007 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -242,7 +242,7 @@ "Data 4G jsou pozastavena" "Mobilní data jsou pozastavena" "Data jsou pozastavena" - "Protože jste dosáhli nastaveného limitu dat, zařízení využití dat pro zbytek tohoto cyklu pozastavilo.\n\nObnovení může vést k poplatkům od operátora." + "Byl dosažen limit dat. Používání mobilních dat bylo vypnuto.\n\nPokud jej obnovíte, mohou vám být účtovány poplatky za využití dat." "Pokračovat" "Žádné přip. k internetu" "Wi-Fi: připojeno" @@ -410,6 +410,7 @@ "Zařízení může být sledováno" "Profil může být monitorován" "Síť může být sledována" + "Síť může být monitorována" "Sledování zařízení" "Monitoring profilu" "Sledování sítě" @@ -422,6 +423,7 @@ "VPN" "Jste připojeni k aplikaci %1$s, která může sledovat vaši aktivitu v síti, včetně e-mailů, aplikací a webů." "Jste připojeni k aplikaci %1$s, která může sledovat vaši osobní aktivitu v síti, včetně e-mailů, aplikací a webů." + "Jste připojeni k aplikaci %1$s, která může sledovat vaši osobní aktivitu v síti, včetně e-mailů, aplikací a webů." "Váš pracovní profil spravuje organizace %1$s. Je připojen k aplikaci %2$s, která může sledovat vaši aktivitu v síti, včetně e-mailů, aplikací a webů.\n\nO další informace požádejte svého administrátora." "Váš pracovní profil spravuje organizace %1$s. Je připojen k aplikaci %2$s, která může sledovat vaši aktivitu v síti, včetně e-mailů, aplikací a webů.\n\nTaké jste připojeni k aplikaci %3$s, která může sledovat vaši osobní aktivitu v síti." "Toto zařízení spravuje organizace %1$s.\n\nAdministrátor může sledovat a spravovat nastavení, firemní přístup, aplikace, data přidružená k tomuto zařízení a informace o jeho poloze.\n\nJste připojeni k aplikaci %2$s, která může sledovat vaši osobní aktivitu v síti, včetně e-mailů, aplikací a webů.\n\nO další informace požádejte svého administrátora." @@ -498,8 +500,6 @@ "Na stavovém řádku se bude zobrazovat sekundová ručička. Může být ovlivněna výdrž baterie." "Změnit uspořádání Rychlého nastavení" "Zobrazit jas v Rychlém nastavení" - "Aktivovat rozdělenou obrazovku přejetím prstem nahoru" - "Umožňuje aktivovat rozdělenou obrazovku přejetím prstem nahoru od tlačítka Přehled." "Experimentální" "Zapnout Bluetooth?" "Chcete-li klávesnici připojit k tabletu, nejdříve musíte zapnout Bluetooth." @@ -657,4 +657,5 @@ "Otevřít nastavení aplikace %s." "Upravit pořadí nastavení." "Stránka %1$d%2$d" + "Oznámení nelze ztlumit ani blokovat" diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index da8daa4da468d5c27e5c9458774dc3126fbf3ee0..7de602a2f1f0913d7d17ecfb21938212aea976ee 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -238,7 +238,7 @@ "4G-data er sat på pause" "Mobildata er sat på pause" "Data er sat på pause" - "Eftersom din fastsatte datagrænse blev nået, har enheden sat dataforbruget på pause i den resterende del af cyklussen.\n\nHvis du genaktiverer dataforbruget, kan det medføre gebyrer fra dit mobilselskab." + "Du har nået den angivne datagrænse. Du vil ikke længere bruge mobildata.\n\nHvis du fortsætter, vil du muligvis blive opkrævet betaling for dit dataforbrug." "Genoptag" "Ingen internetforb." "Wi-Fi er forbundet" @@ -304,7 +304,7 @@ "Byt om på farver" "Farvekorrigeringstilstand" "Flere indstillinger" - "Udført" + "Udfør" "Tilsluttet" "Opretter forbindelse…" "Netdeling" @@ -404,6 +404,7 @@ "Enheden kan være overvåget" "Profilen kan overvåges" "Netværket kan være overvåget" + "Netværket kan være overvåget" "Overvågning af enhed" "Profilovervågning" "Overvågning af netværk" @@ -416,6 +417,7 @@ "VPN" "Du har forbindelse til %1$s, som kan overvåge din netværksaktivitet, bl.a. e-mails, apps og websites." "Du har forbindelse til %1$s, som kan overvåge din private netværksaktivitet, bl.a. e-mails, apps og websites." + "Du har forbindelse til %1$s, som kan overvåge din private netværksaktivitet, bl.a. e-mails, apps og websites." "Din arbejdsprofil administreres af %1$s. Den er forbundet til %2$s, som kan overvåge din arbejdsrelaterede netværksaktivitet, bl.a. e-mails, apps og websites.\n\nKontakt din administrator for at få flere oplysninger." "Din arbejdsprofil administreres af %1$s. Den er forbundet til %2$s, som kan overvåge din arbejdsrelaterede netværksaktivitet, bl.a. e-mails, apps og websites.\n\nDu er også forbundet til %3$s, som kan overvåge din private netværksaktivitet." "Din enhed administreres af %1$s.\n\nDin administrator kan overvåge og administrere indstillinger, virksomhedens adgang, data tilknyttet din enhed og enhedens stedoplysninger.\n\nDu er forbundet til %2$s, som kan overvåge din netværksaktivitet, bl.a. e-mails, apps og websites.\n\nKontakt din administrator for at få flere oplysninger." @@ -492,8 +494,6 @@ "Vis sekunder i statuslinjen. Dette kan påvirke batteriets levetid." "Omarranger Hurtige indstillinger" "Vis lysstyrke i Hurtige indstillinger" - "Aktivér bevægelsen Stryg opad for at dele skærmen" - "Aktivér bevægelse for at dele skærmen ved at stryge opad fra knappen Oversigt" "Eksperimentel" "Vil du slå Bluetooth til?" "Bluetooth skal være slået til, før du kan knytte dit tastatur til din tablet." @@ -521,7 +521,7 @@ "Se altid smugkig. Ingen afbrydelse af fuld skærm." "Se altid smugkig, og tillad afbrydelse af fuld skærm." "Flere indstillinger" - "Færdig" + "Udfør" "Kontrolelementer til underretninger for %1$s" "Batteriforbrug" "Batterisparefunktionen er ikke tilgængelig under opladning" @@ -651,4 +651,5 @@ "Åbn %s-indstillinger." "Rediger rækkefølgen af indstillinger." "Side %1$d af %2$d" + "Underretninger kan ikke ignoreres eller blokeres" diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 46078d9c2516b4f1bd5002a5d73eb8e87ab5a4e3..fc6d9a07303f6478c0caf25a2a690c82ea66ef4f 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -240,7 +240,7 @@ "4G-Daten pausiert" "Mobilfunkdaten pausiert" "Daten pausiert" - "Da dein festgelegtes Datenlimit erreicht wurde, hat das Gerät die Datennutzung für den Rest dieses Zeitraums pausiert.\n\nWenn du die Nutzung fortsetzt, entstehen möglicherweise Kosten bei deinem Mobilfunkanbieter." + "Das von dir festgelegte Datenlimit wurde erreicht. Die mobile Datennutzung wurde deaktiviert.\n\nWenn du weiterhin mobile Daten nutzt, können Gebühren anfallen." "Fortsetzen" "Keine Internetverbindung" "WLAN verbunden" @@ -271,7 +271,7 @@ "Bluetooth" "Bluetooth (%d Geräte)" "Bluetooth aus" - "Keine Pairing-Geräte verfügbar" + "Keine gekoppelten Geräte verfügbar" "Helligkeit" "Automatisch drehen" "Bildschirm automatisch drehen" @@ -406,6 +406,7 @@ "Aktivität auf dem Gerät kann vom Eigentümer protokolliert werden" "Profil wird möglicherweise überwacht." "Das Netzwerk wird möglicherweise überwacht." + "Das Netzwerk wird möglicherweise überwacht" "Geräteüberwachung" "Profilüberwachung" "Netzwerküberwachung" @@ -418,6 +419,7 @@ "VPN" "Du bist mit der App %1$s verbunden, die deine Netzwerkaktivität überwachen kann, einschließlich E-Mails, Apps und Websites." "Du bist mit der App %1$s verbunden, die deine persönliche Netzwerkaktivität überwachen kann, einschließlich E-Mails, Apps und Websites." + "Du bist mit der App \"%1$s\" verbunden. Diese kann deine persönlichen Netzwerkaktivitäten erfassen, einschließlich E-Mails, Apps und Websites." "Dein Arbeitsprofil wird von %1$s verwaltet. Das Profil ist mit der App %2$s verbunden, die deine geschäftlichen Netzwerkaktivitäten überwachen kann, einschließlich E-Mails, Apps und Websites.\n\nWeitere Informationen erhältst du von deinem Administrator." "Dein Arbeitsprofil wird von %1$s verwaltet. Das Profil ist mit der App %2$s verbunden, die deine geschäftliche Netzwerkaktivität überwachen kann, einschließlich E-Mails, Apps und Websites.\n\nDu bist außerdem mit der App %3$s verbunden, die deine persönliche Netzwerkaktivität überwachen kann." "Dein Gerät wird von %1$s verwaltet.\n\nDein Administrator kann die zu deinem Gerät gehörigen Einstellungen, Unternehmenszugriffsrechte, Apps und Daten überwachen und verwalten, einschließlich der Standortinformationen deines Geräts.\n\nDu bist außerdem mit der App %2$s verbunden, die deine persönliche Netzwerkaktivität überwachen kann, einschließlich E-Mails, Apps und Websites.\n\nWeitere Informationen erhältst du bei deinem Administrator." @@ -494,8 +496,6 @@ "Uhrsekunden in der Statusleiste anzeigen. Kann sich auf die Akkulaufzeit auswirken." "Schnelleinstellungen neu anordnen" "Helligkeit in den Schnelleinstellungen anzeigen" - "Teilen des Bildschirms durch Wischen nach oben aktivieren" - "Aktiviert die Bewegung zum Teilen des Bildschirms, bei der von der Schaltfläche \"Übersicht\" nach oben gewischt wird" "Experimentell" "Bluetooth aktivieren?" "Zum Verbinden von Tastatur und Tablet muss Bluetooth aktiviert sein." @@ -653,4 +653,5 @@ "Einstellungen für %s öffnen." "Reihenfolge der Einstellungen bearbeiten." "Seite %1$d von %2$d" + "Benachrichtigungen können nicht stummgeschaltet oder blockiert werden" diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 0a327ab249101ca28ed5a2b066c58de819ac735a..a9b8bb506afe337df3b64f97d2f53935d6e6873b 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -163,7 +163,7 @@ "Φόρτιση μπαταρίας, %d τοις εκατό." "Ρυθμίσεις συστήματος." "Ειδοποιήσεις." - "Εκκαθάριση ειδοποίησης." + "Διαγραφή ειδοποίησης." "Το GPS ενεργοποιήθηκε." "Προσδιορισμός GPS." "Το TeleTypewriter ενεργοποιήθηκε." @@ -238,14 +238,14 @@ "Τα δεδομένα 4G τέθηκαν σε παύση" "Τα δεδομένα κινητής τηλεφωνίας τέθηκαν σε παύση" "Τα δεδομένα τέθηκαν σε παύση" - "Επειδή συμπληρώθηκε το όριο των δεδομένων που ορίστηκε για τη συσκευή σας, η χρήση δεδομένων τέθηκε σε παύση για το υπόλοιπο αυτού του κύκλου.\n\nΗ εκ νέου ενεργοποίησή τους ενδέχεται να επιφέρει χρεώσεις από την εταιρεία κινητής τηλεφωνίας σας." + "Το όριο δεδομένων που ορίσατε έχει εξαντληθεί. Δεν χρησιμοποιείτε πλέον δεδομένα κινητής τηλεφωνίας.\n\nΑν συνεχίσετε, ενδέχεται να ισχύσουν χρεώσεις για τη χρήση δεδομένων." "Συνέχιση" "Χωρ. σύνδ. στο Διαδ." "Wi-Fi συνδεδεμένο" "Αναζήτηση για GPS" "Ρύθμιση τοποθεσίας με GPS" "Τα αιτήματα τοποθεσίας έχουν ενεργοποιηθεί" - "Εκκαθάριση όλων των ειδοποιήσεων." + "Διαγραφή όλων των ειδοποιήσεων." "+ %s" %s επιπλέον ειδοποιήσεις εντός της ομάδας. @@ -323,7 +323,7 @@ "Ο Νυχτερινός φωτισμός είναι ενεργοποιημένος. Πατήστε για απενεργοποίηση." "Ο Νυχτερινός φωτισμός είναι απενεργοποιημένος. Πατήστε για ενεργοποίηση." "Δεν υπάρχουν πρόσφατα στοιχεία" - "Έχει γίνει εκκαθάριση όλων των στοιχείων" + "Έχει γίνει διαγραφή όλων των στοιχείων" "Πληροφορίες εφαρμογής" "καρφίτσωμα οθόνης" "αναζήτηση" @@ -404,6 +404,7 @@ "Η συσκευή μπορεί να παρακολουθείται" "Το προφίλ ενδέχεται να παρακολουθείται" "Το δίκτυο ενδέχεται να παρακολουθείται" + "Το δίκτυο ενδέχεται να παρακολουθείται" "Παρακολούθηση συσκευής" "Παρακολούθηση προφίλ" "Παρακολούθηση δικτύου" @@ -416,6 +417,7 @@ "VPN" "Έχετε συνδεθεί στην εφαρμογή %1$s, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του δικτύου σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστότοπων." "Έχετε συνδεθεί στην εφαρμογή %1$s, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του προσωπικού σας δικτύου, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστότοπων." + "Έχετε συνδεθεί στην εφαρμογή %1$s, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του προσωπικού σας δικτύου, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστοτόπων." "Η διαχείριση του προφίλ εργασίας γίνεται από τον οργανισμό %1$s. Είναι συνδεδεμένο στην εφαρμογή %2$s, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του δικτύου εργασίας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστότοπων.\n\nΓια περισσότερες πληροφορίες, επικοινωνήστε με το διαχειριστή." "Η διαχείριση του προφίλ εργασίας γίνεται από τον οργανισμό %1$s. Είναι συνδεδεμένο στην εφαρμογή %2$s, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του δικτύου εργασίας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστότοπων.\n\nΕπίσης, είστε συνδεδεμένοι στην εφαρμογή %3$s, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του προσωπικού σας δικτύου." "Η διαχείριση της συσκευής γίνεται από %1$s.\n\nΟ διαχειριστής μπορεί να παρακολουθεί και να διαχειρίζεται ρυθμίσεις, εταιρική πρόσβαση, εφαρμογές, δεδομένα σχετικά με τη συσκευή και πληρ. τοποθεσίας της συσκευής.\n\nΕίστε συνδεδ. σε %2$s που μπορεί να παρακολουθεί τη δραστηρ. του δικτύου εργασίας, όπως μηνύματα ηλεκτρ. ταχυδρομείου, εφαρμογές και ιστότοπους.\n\nΓια περισ. πληροφορίες, επικοινωνήστε με το διαχειριστή." @@ -436,7 +438,7 @@ "Θα εμφανιστεί ξανά την επόμενη φορά που θα το ενεργοποιήσετε στις ρυθμίσεις." "Απόκρυψη" "Η εφαρμογή %1$s θέλει να γίνει το παράθυρο διαλόγου ελέγχου έντασης" - "Να επιτραπεί" + "Να επιτρέπεται" "Απόρριψη" "Η εφαρμογή %1$s αποτελεί το παράθυρο διαλόγου ελέγχου έντασης" "Πατήστε για να επαναφέρετε την αρχική μορφή της εικόνας." @@ -492,8 +494,6 @@ "Εμφάνιση δευτερολέπτων ρολογιού στη γραμμή κατάστασης. Ενδέχεται να επηρεάσει τη διάρκεια ζωής της μπαταρίας." "Αναδιάταξη Γρήγορων ρυθμίσεων" "Εμφάνιση φωτεινότητας στις Γρήγορες ρυθμίσεις" - "Ενεργοποίηση κίνησης ολίσθησης επάνω για διαχωρισμό οθόνης" - "Ενεργοποίηση κίνησης για μετάβαση σε διαχωρισμό οθόνης μέσω ολίσθησης επάνω από το κουμπί \"Επισκόπηση\"" "Σε πειραματικό στάδιο" "Ενεργοποίηση Bluetooth;" "Για να συνδέσετε το πληκτρολόγιο με το tablet σας, θα πρέπει πρώτα να ενεργοποιήσετε το Bluetooth." @@ -651,4 +651,5 @@ "Άνοιγμα ρυθμίσεων %s." "Επεξεργασία σειράς ρυθμίσεων." "Σελίδα %1$d από %2$d" + "Δεν είναι δυνατή η σίγαση ή ο αποκλεισμός των ειδοποιήσεων" diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 9443ad90c342507efb3fd2a89cd1acc78a81c927..bed0f5c431a478d6f861082e555165a02073dda7 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -238,7 +238,7 @@ "4G data is paused" "Mobile data is paused" "Data is paused" - "Because your set data limit was reached, the device has paused data usage for the remainder of this cycle.\n\nResuming may lead to charges from your operator." + "The data limit you have set has been reached. You are no longer using mobile data.\n\nIf you resume, charges may apply for data usage." "Resume" "No Internet connection" "Wi-Fi connected" @@ -404,6 +404,7 @@ "Device may be monitored" "Profile may be monitored" "Network may be monitored" + "Network may be monitored" "Device monitoring" "Profile monitoring" "Network monitoring" @@ -416,6 +417,7 @@ "VPN" "You\'re connected to %1$s, which can monitor your network activity including emails, apps and websites." "You\'re connected to %1$s, which can monitor your personal network activity, including emails, apps and websites." + "You\'re connected to %1$s, which can monitor your personal network activity, including emails, apps and websites." "Your work profile is managed by %1$s. It is connected to %2$s, which can monitor your work network activity, including emails, apps and websites.\n\nFor more information, contact your administrator." "Your work profile is managed by %1$s. It is connected to %2$s, which can monitor your work network activity, including emails, apps and websites.\n\nYou\'re also connected to %3$s, which can monitor your personal network activity." "Your device is managed by %1$s.\n\nYour administrator can monitor and manage settings, corporate access, apps, data associated with your device, and your device\'s location information.\n\nYou\'re connected to %2$s, which can monitor your network activity, including emails, apps, and websites.\n\nFor more information, contact your administrator." @@ -492,8 +494,6 @@ "Show clock seconds in the status bar. May impact battery life." "Rearrange Quick Settings" "Show brightness in Quick Settings" - "Enable split-screen swipe-up gesture" - "Enable gesture to enter split-screen by swiping up from the Overview button" "Experimental" "Turn on Bluetooth?" "To connect your keyboard with your tablet, you first have to turn on Bluetooth." @@ -651,4 +651,5 @@ "Open %s settings." "Edit order of settings." "Page %1$d of %2$d" + "Notifications can\'t be silenced or blocked" diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 9443ad90c342507efb3fd2a89cd1acc78a81c927..bed0f5c431a478d6f861082e555165a02073dda7 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -238,7 +238,7 @@ "4G data is paused" "Mobile data is paused" "Data is paused" - "Because your set data limit was reached, the device has paused data usage for the remainder of this cycle.\n\nResuming may lead to charges from your operator." + "The data limit you have set has been reached. You are no longer using mobile data.\n\nIf you resume, charges may apply for data usage." "Resume" "No Internet connection" "Wi-Fi connected" @@ -404,6 +404,7 @@ "Device may be monitored" "Profile may be monitored" "Network may be monitored" + "Network may be monitored" "Device monitoring" "Profile monitoring" "Network monitoring" @@ -416,6 +417,7 @@ "VPN" "You\'re connected to %1$s, which can monitor your network activity including emails, apps and websites." "You\'re connected to %1$s, which can monitor your personal network activity, including emails, apps and websites." + "You\'re connected to %1$s, which can monitor your personal network activity, including emails, apps and websites." "Your work profile is managed by %1$s. It is connected to %2$s, which can monitor your work network activity, including emails, apps and websites.\n\nFor more information, contact your administrator." "Your work profile is managed by %1$s. It is connected to %2$s, which can monitor your work network activity, including emails, apps and websites.\n\nYou\'re also connected to %3$s, which can monitor your personal network activity." "Your device is managed by %1$s.\n\nYour administrator can monitor and manage settings, corporate access, apps, data associated with your device, and your device\'s location information.\n\nYou\'re connected to %2$s, which can monitor your network activity, including emails, apps, and websites.\n\nFor more information, contact your administrator." @@ -492,8 +494,6 @@ "Show clock seconds in the status bar. May impact battery life." "Rearrange Quick Settings" "Show brightness in Quick Settings" - "Enable split-screen swipe-up gesture" - "Enable gesture to enter split-screen by swiping up from the Overview button" "Experimental" "Turn on Bluetooth?" "To connect your keyboard with your tablet, you first have to turn on Bluetooth." @@ -651,4 +651,5 @@ "Open %s settings." "Edit order of settings." "Page %1$d of %2$d" + "Notifications can\'t be silenced or blocked" diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 9443ad90c342507efb3fd2a89cd1acc78a81c927..bed0f5c431a478d6f861082e555165a02073dda7 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -238,7 +238,7 @@ "4G data is paused" "Mobile data is paused" "Data is paused" - "Because your set data limit was reached, the device has paused data usage for the remainder of this cycle.\n\nResuming may lead to charges from your operator." + "The data limit you have set has been reached. You are no longer using mobile data.\n\nIf you resume, charges may apply for data usage." "Resume" "No Internet connection" "Wi-Fi connected" @@ -404,6 +404,7 @@ "Device may be monitored" "Profile may be monitored" "Network may be monitored" + "Network may be monitored" "Device monitoring" "Profile monitoring" "Network monitoring" @@ -416,6 +417,7 @@ "VPN" "You\'re connected to %1$s, which can monitor your network activity including emails, apps and websites." "You\'re connected to %1$s, which can monitor your personal network activity, including emails, apps and websites." + "You\'re connected to %1$s, which can monitor your personal network activity, including emails, apps and websites." "Your work profile is managed by %1$s. It is connected to %2$s, which can monitor your work network activity, including emails, apps and websites.\n\nFor more information, contact your administrator." "Your work profile is managed by %1$s. It is connected to %2$s, which can monitor your work network activity, including emails, apps and websites.\n\nYou\'re also connected to %3$s, which can monitor your personal network activity." "Your device is managed by %1$s.\n\nYour administrator can monitor and manage settings, corporate access, apps, data associated with your device, and your device\'s location information.\n\nYou\'re connected to %2$s, which can monitor your network activity, including emails, apps, and websites.\n\nFor more information, contact your administrator." @@ -492,8 +494,6 @@ "Show clock seconds in the status bar. May impact battery life." "Rearrange Quick Settings" "Show brightness in Quick Settings" - "Enable split-screen swipe-up gesture" - "Enable gesture to enter split-screen by swiping up from the Overview button" "Experimental" "Turn on Bluetooth?" "To connect your keyboard with your tablet, you first have to turn on Bluetooth." @@ -651,4 +651,5 @@ "Open %s settings." "Edit order of settings." "Page %1$d of %2$d" + "Notifications can\'t be silenced or blocked" diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 602d6b2dfd71cfef084282f1fa76dc977dcd05fc..485d2e0ffa1728be04122e65b480bbee7f893b66 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -240,7 +240,7 @@ "Datos 4G pausados" "Datos móviles pausados" "Datos pausados" - "Debido que se alcanzó el límite de datos establecido, el dispositivo pausó el uso de datos para el resto de este ciclo.\n\nLa reanudación podría tener como resultado cargos del proveedor." + "Se alcanzó el límite de datos que estableciste. Ya no estás usando datos móviles.\n\nSi reanudas el uso de datos, es posible que se apliquen cargos." "Reanudar" "Sin conexión a Internet" "Wi-Fi conectado" @@ -406,6 +406,7 @@ "Es posible que el dispositivo esté supervisado." "Es posible que se supervise el perfil." "Es posible que la red esté supervisada." + "Es posible que la red esté supervisada" "Supervisión del dispositivo" "Supervisión del perfil" "Supervisión de red" @@ -418,6 +419,7 @@ "VPN" "Tienes conexión a la aplicación %1$s, que puede supervisar la actividad de la red, incluidos los correos electrónicos, las aplicaciones y los sitios web." "Tienes conexión a la aplicación %1$s, que puede supervisar la actividad de la red personal, incluidos los correos electrónicos, las aplicaciones y los sitios web." + "Te conectaste a %1$s, que puede supervisar la actividad de tu red personal, incluidos los correos electrónicos, las apps y los sitios web." "%1$s administra tu perfil de trabajo. Tiene conexión a %2$s, que puede supervisar la actividad de tu red de trabajo, incluidos los correos electrónicos, las aplicaciones y los sitios web.\n\nPara obtener más información, comunícate con el administrador." "%1$s administra tu perfil de trabajo. Tiene conexión a %2$s, que puede supervisar la actividad de tu red de trabajo, incluidos los correos electrónicos, las aplicaciones y los sitios web.\n\nTambién tienes conexión a %3$s, que puede supervisar la actividad de la red personal." "%1$s administra tu dispositivo.\n\nEl administrador puede supervisar y administrar la configuración, el acceso corporativo, las aplicaciones, los datos asociados al dispositivo y la información de la ubicación.\n\nTienes conexión a %2$s, que puede supervisar la actividad de la red, incluidos los correos electrónicos, las aplicaciones y los sitios web.\n\nPara obtener más información, comunícate con el administrador." @@ -494,8 +496,6 @@ "Muestra los segundos del reloj en la barra de estado. Puede afectar la duración de la batería." "Reorganizar la Configuración rápida" "Mostrar el brillo en la Configuración rápida" - "Habilitar gesto de dedo hacia arriba para dividir pantalla" - "Habilita el gesto de deslizar el dedo hacia arriba desde el botón Recientes para acceder al modo de pantalla dividida" "Experimental" "¿Activar Bluetooth?" "Para conectar el teclado con la tablet, primero debes activar Bluetooth." @@ -653,4 +653,5 @@ "Abrir configuración de %s" "Editar orden de configuración" "Página %1$d de %2$d" + "Las notificaciones no se pueden silenciar ni bloquear" diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index ba11d6fb9e5d302047cab94d76b2083e10fad3ac..0e0f412459f5cfa22938d6ed969d6acf06123f9f 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -233,14 +233,14 @@ "Modo de trabajo activado." "Modo de trabajo desactivado." "Modo de trabajo activado." - "Economizador de Datos desactivado." - "Economizador de Datos activado." + "Ahorro de datos desactivado." + "Ahorro de datos activado." "Brillo de la pantalla" "Datos 2G-3G pausados" "Datos 4G pausados" "Datos móviles pausados" "Datos pausados" - "Has alcanzado el límite de datos establecido, por lo que el dispositivo ha pausado el uso de datos para el resto de este ciclo.\n\nSi lo reanudas, el operador puede facturar cargos." + "Se ha alcanzado el límite de datos establecido. Ya no estás utilizando datos móviles.\n\nSi vuelves a activar el uso de datos, es posible que se apliquen cargos." "Reanudar" "Sin conexión a Internet" "Con conexión Wi-Fi" @@ -406,6 +406,7 @@ "Es posible que este dispositivo esté supervisado" "Es posible que se supervise el perfil" "Puede que la red esté supervisada" + "Puede que la red esté supervisada" "Supervisión de dispositivo" "Supervisión del perfil" "Supervisión de red" @@ -418,6 +419,7 @@ "VPN" "Estás conectado a %1$s, que puede controlar tu actividad de red, como correos electrónicos, aplicaciones y sitios web." "Estas conectado a %1$s, que puede controlar tu actividad de red personal, como correos electrónicos, aplicaciones y sitios web." + "Estas conectado a %1$s, que puede controlar tu actividad de red personal, como correos electrónicos, aplicaciones y sitios web." "El administrador de tu perfil de trabajo es %1$s y está conectado a %2$s, que puede controlar tu actividad de red del trabajo, como correos electrónicos, aplicaciones y sitios web.\n\nPara obtener más información, ponte en contacto con el administrador." "El administrador de tu perfil de trabajo es %1$s y está conectado a %2$s, que puede controlar tu actividad de red, como correos electrónicos, aplicaciones y sitios web.\n\nTú también estás conectado a %3$s, que puede controlar tu actividad de red personal." "El administrador de tu dispositivo es %1$s.\n\nTu administrador puede supervisar y administrar los ajustes, el acceso corporativo, las aplicaciones, los datos asociados al dispositivo e información de su ubicación.\n\nEstás conectado a %2$s, que puede supervisar tu actividad de red, como correos electrónicos, aplicaciones y sitios web.\n\nPara obtener más información, ponte en contacto con tu administrador." @@ -494,8 +496,6 @@ "Muestra los segundos del reloj en la barra de estado. Puede afectar a la duración de la batería." "Reorganizar Ajustes rápidos" "Mostrar brillo en Ajustes rápidos" - "Habilitar deslizar dedo hacia arriba para dividir pantalla" - "Habilita el gesto de deslizar el dedo hacia arriba desde el botón Aplicaciones recientes para acceder al modo de pantalla dividida" "Experimental" "¿Activar Bluetooth?" "Para poder conectar tu teclado a tu tablet, debes activar el Bluetooth." @@ -580,9 +580,9 @@ "Auriculares" "Auriculares conectados" "Auriculares conectados" - "Economizador de Datos" - "Economizador de Datos activado" - "Economizador de Datos desactivado" + "Ahorro de datos" + "Ahorro de datos activado" + "Ahorro de datos desactivado" "Sí" "No" "Barra de navegación" @@ -653,4 +653,5 @@ "Abrir ajustes de %s." "Cambiar el orden de los ajustes." "Página %1$d de %2$d" + "Las notificaciones no se pueden silenciar ni bloquear" diff --git a/packages/SystemUI/res/values-et-rEE/strings.xml b/packages/SystemUI/res/values-et-rEE/strings.xml index bfc55e9724d1c4db4e15bc6ef200b46560e14e83..0cdf8d20a18eb00b39537546bfdcb2a2e7139b16 100644 --- a/packages/SystemUI/res/values-et-rEE/strings.xml +++ b/packages/SystemUI/res/values-et-rEE/strings.xml @@ -47,7 +47,7 @@ "Pööra ekraani automaatselt" "SUMMUTA" "AUTO" - "Teatised" + "Märguanded" "Bluetooth on jagatud" "Seadista sisestusmeetodeid" "Füüsiline klaviatuur" @@ -164,7 +164,7 @@ "Süsteemiseaded" - "Teatised" + "Märguanded" "Märguande eemaldamine." "GPS on lubatud." "GPS-signaali otsimine." @@ -240,7 +240,7 @@ "4G andmekasutus on peatatud" "Mobiilse andmeside kasutus on peatatud" "Andmekasutus on peatatud" - "Kuna jõudsite andmemahu määratud piirini, peatas seade andmekasutuse ülejäänud tsükliks.\n\nJätkamisel võivad lisanduda operaatoritasud." + "Olete jõudnud enda määratud andmemahupiiranguni. Te ei kasuta enam mobiilset andmesidet.\n\nKui jätkate, võivad rakenduda andmekasutustasud." "Jätka" "Interneti-ühendus puudub" "WiFi on ühendatud" @@ -406,6 +406,7 @@ "Seadet võidakse jälgida" "Profiili võidakse jälgida" "Võrku võidakse jälgida" + "Võrku võidakse jälgida" "Seadme jälgimine" "Profiili jälgimine" "Võrgu jälgimine" @@ -418,6 +419,7 @@ "VPN" "Teie seade on ühendatud rakendusega %1$s, mis võib jälgida teie võrgutegevusi, sh meile, rakendusi ja veebisaite." "Teie seade on ühendatud rakendusega %1$s, mis võib jälgida teie isiklikke võrgutegevusi, sh meile, rakendusi ja veebisaite." + "Olete ühendatud rakendusega %1$s, mis võib jälgida teie isiklikke võrgutegevusi, sh meile, rakendusi ja veebisaite." "Teie tööprofiili haldab organisatsioon %1$s. See on ühendatud rakendusega %2$s, mis võib jälgida teie töökoha võrgutegevusi, sh meile, rakendusi ja veebisaite.\n\nLisateabe saamiseks võtke ühendust administraatoriga." "Teie tööprofiili haldab organisatsioon %1$s. See on ühendatud rakendusega %2$s, mis võib jälgida teie töökoha võrgutegevusi, sh meile, rakendusi ja veebisaite.\n\nTeie seade on ühendatud ka rakendusega %3$s, mis võib jälgida teie isiklikke võrgutegevusi." "Teie seadet haldab organisatsioon %1$s.\n\nAdministraator saab jälgida ja hallata seadeid, ettevõttesisest juurdepääsu, rakendusi, seadmega seotud andmeid ja seadme asukohateavet.\n\nOlete ühendatud rakendusega %2$s, mis saab jälgida teie võrgutegevusi, sh meile, rakendusi ja veebisaite.\n\nLisateabe saamiseks võtke ühendust administraatoriga." @@ -494,8 +496,6 @@ "Olekuribal kella sekundite kuvamine. See võib mõjutada aku kasutusaega." "Korralda kiirseaded ümber" "Kuva kiirseadetes heledus" - "Luba ülespühkimise liigutus ekraani poolitamiseks" - "Lubab žesti, mis poolitab ekraani, kui kasutaja pühib üles nupul Ülevaade." "Eksperimentaalne" "Kas lülitada Bluetooth sisse?" "Klaviatuuri ühendamiseks tahvelarvutiga peate esmalt Bluetoothi sisse lülitama." @@ -653,4 +653,5 @@ "Ava teenuse %s seaded." "Muuda seadete järjestust." "Leht %1$d/%2$d" + "Märguandeid ei saa vaigistada ega blokeerida" diff --git a/packages/SystemUI/res/values-eu-rES/strings.xml b/packages/SystemUI/res/values-eu-rES/strings.xml index a340b3d3f90ffec7d30e784eb6bedbdc5522038b..94941104f021465af1c797bad5353ffa5b322494 100644 --- a/packages/SystemUI/res/values-eu-rES/strings.xml +++ b/packages/SystemUI/res/values-eu-rES/strings.xml @@ -240,7 +240,7 @@ "4G datuen erabilera eten da" "Sare mugikorreko datuen erabilera eten da" "Datuen erabilera eten da" - "Zehaztuta duzun datuen erabilera-mugara iritsi zarenez, gailuak datuen erabilera eten du zikloa amaitzen den arte.\n\nDatuak erabiltzen jarraitzen baduzu, gastu gehiago ordaindu beharko dizkiozu agian operadoreari." + "Gainditu egin da ezarri duzun datu-muga. Datu-konexioa erabiltzeari utzi diozu.\n\nBerriro hasten bazara erabiltzen, baliteke datuen erabileraren kostua ordaindu behar izatea." "Jarraitu erabiltzen" "Ez duzu Interneteko konexiorik" "Wi-Fi konektatuta" @@ -406,6 +406,7 @@ "Baliteke gailua kontrolatuta egotea" "Baliteke profila kontrolatuta egotea" "Baliteke sarea kontrolatuta egotea" + "Baliteke sarea kontrolatuta egotea" "Gailuen kontrola" "Profila kontrolatzeko aukera" "Sareen kontrola" @@ -418,6 +419,7 @@ "VPN konexioa" "%1$s aplikaziora konektatuta zaude. Aplikazio horrek sarean egiten dituzun jarduerak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne." "%1$s aplikaziora konektatuta zaude. Aplikazio horrek sarean egiten dituzun jarduera pertsonalak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne." + "%1$s aplikaziora konektatuta zaude. Aplikazio horrek sarean egiten dituzun jarduera pertsonalak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne." "%1$s da laneko profilaren kudeatzailea, eta profila %2$s aplikaziora konektatuta dago. Aplikazio horrek sarean egiten dituzun laneko jarduerak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne.\n\nInformazio gehiago lortzeko, jarri administratzailearekin harremanetan." "%1$s da laneko profilaren kudeatzailea, eta profila %2$s aplikaziora konektatuta dago. Aplikazio horrek sarean egiten dituzun laneko jarduerak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne.\n\nHorrez gain, sarean egiten dituzun jarduera pertsonalak kontrola ditzakeen %3$s aplikaziora konektatuta zaude." "%1$s da gailuaren kudeatzailea.\n\nAdministratzaileak ezarpenak, enpresako sarbidea, aplikazioak, gailuarekin lotutako datuak eta gailuaren kokapenari buruzko informazioa kontrola eta kudea ditzake.\n\n%2$s aplikaziora konektatuta zaude. Aplikazio horrek sarean egiten dituzun jarduerak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne.\n\nInformazio gehiago lortzeko, jarri administratzailearekin harremanetan." @@ -494,8 +496,6 @@ "Erakutsi erlojuko segundoak egoera-barran. Baliteke bateria gehiago erabiltzea." "Berrantolatu ezarpen bizkorrak" "Erakutsi distira Ezarpen bizkorretan" - "Gaitu pantaila zatitzeko keinua hatza gora pasatuta" - "Sakatu Ikuspegi nagusia botoia eta gaitu hatza gora pasatuta pantaila zatitzeko keinua" "Esperimentala" "Bluetooth eginbidea aktibatu nahi duzu?" "Teklatua tabletara konektatzeko, Bluetooth eginbidea aktibatu behar duzu." @@ -653,4 +653,5 @@ "Ireki %s ezarpenak." "Editatu ezarpenen ordena." "%1$d/%2$d orria" + "Jakinarazpenak ezin dira ezkutatu edo blokeatu" diff --git a/packages/SystemUI/res/values-fa-land/strings.xml b/packages/SystemUI/res/values-fa-land/strings.xml index adc2b118894f9e9d32443366a2a5453fdac2d4c7..fe67cf0a7d41eb169ab023b1a164ea69f8e5fa95 100644 --- a/packages/SystemUI/res/values-fa-land/strings.xml +++ b/packages/SystemUI/res/values-fa-land/strings.xml @@ -19,5 +19,5 @@ - "صفحه اکنون در جهت افقی قفل است." + "صفحه اکنون در حالت افقی قفل است." diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 58a5d936a68f3323a0a638b18e1fa91bf4b7f1ba..abb7e1ee51f38b92aa8a0cd875d1f89f2c2fe510 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -238,7 +238,7 @@ "‏داده 4G موقتاً متوقف شده است" "داده شبکه همراه موقتاً متوقف شده است" "داده موقتاً متوقف شده است" - "چون به محدودیت داده تنظیم شده رسیده‌اید، دستگاه مصرف داده را برای باقیمانده این دوره موقتاً متوقف کرده است.\n\nاگر ادامه دهید شاید موجب کسر هزینه از طرف شرکت مخابراتی شما شود." + "به حداکثر محدودیت داده‌ای که تنظیم کردید رسیدید. دیگر از داده شبکه تلفن همراه استفاده نمی‌کنید.\n\nدر صورت ازسرگیری، ممکن است مصرف داده هزینه‌هایی دربرداشته باشد." "از سر‌گیری" "اتصال اینترنتی ندارید" "‏Wi-Fi متصل شد" @@ -254,10 +254,10 @@ "تنظیمات اعلان" "تنظیمات %s" "صفحه به صورت خودکار می‌چرخد." - "صفحه اکنون در جهت افقی قفل است." + "صفحه اکنون در حالت افقی قفل است." "صفحه اکنون در جهت عمودی قفل است." "صفحه اکنون به صورت خودکار می‌چرخد." - "صفحه اکنون روی جهت افقی قفل شده است." + "صفحه اکنون در حالت افقی قفل است." "صفحه اکنون روی جهت عمودی قفل شده است." "ویترین دسر" "محافظ صفحه" @@ -347,8 +347,8 @@ "لغزاندن به چپ برای %s." "صداها و لرزش‌هایی به جز هشدارها، یادآوری‌ها، رویدادها و تماس‌گیرنده‌هایی که مشخص می‌کنید، مزاحم شما نمی‌شوند." "سفارشی کردن" - "این کار «همه» صداها و لرزش‌ها از جمله هشدارها، موسیقی، ویدیوها و بازی‌ها را مسدود می‌کند. همچنان می‌توانید تماس تلفنی برقرار کنید." - "این کار «همه» صداها و لرزش‌ها از جمله هشدارها، موسیقی، ویدیوها و بازی‌ها را مسدود می‌کند." + "این کار «همه» صداها و لرزش‌ها از جمله هشدارها، موسیقی، ویدئوها و بازی‌ها را مسدود می‌کند. همچنان می‌توانید تماس تلفنی برقرار کنید." + "این کار «همه» صداها و لرزش‌ها از جمله هشدارها، موسیقی، ویدئوها و بازی‌ها را مسدود می‌کند." "+%d" "اعلان‌های کمتر فوری در زیر" "دوباره ضربه بزنید تا باز شود" @@ -404,6 +404,7 @@ "ممکن است دستگاه کنترل شود" "شاید نمایه کنترل شود" "ممکن است شبکه کنترل شود" + "ممکن است شبکه کنترل شود" "کنترل دستگاه" "کنترل نمایه" "کنترل شبکه" @@ -416,6 +417,7 @@ "VPN" "شما به %1$s وصل شده‌اید، که می‌تواند فعالیت شبکه شما از جمله رایانامه‌، برنامه‌ و وب‌سایت‌ها را کنترل کند." "شما به %1$s وصل شده‌اید، که می‌تواند فعالیت شبکه شخصی شما از جمله رایانامه‌، برنامه‌ و وب‌سایت‌ها را کنترل کند." + "به %1$s وصل شده‌اید، که می‌تواند فعالیت شبکه شخصی شما را (ازجمله رایانامه‌‌ها، برنامه‌‌ها و وب‌سایت‌ها) کنترل کند." "نمایه کاری‌تان توسط %1$s مدیریت می‌شود. این به %2$s وصل است که فعالیت شبکه کاری‌تان از جمله رایانامه، برنامه و وب‌سایت‌ها را کنترل می‌کند.\n\nبرای دریافت اطلاعات بیشتر، با سرپرستتان تماس بگیرید." "نمایه کاری شما توسط %1$s مدیریت می‌شود. این به %2$s متصل است که می‌تواند فعالیت شبکه کاری‌تان از جمله رایانامه، برنامه و وب‌سایت‌ها را کنترل کند.\n\nشما همچنین به %3$s متصل هستید که می‌تواند فعالیت شبکه شخصی‌تان را کنترل کند." "دستگاهتان توسط %1$s مدیریت می‌شود.\n\nسرپرستتان می‌تواند تنظیمات، دسترسی شرکت، برنامه‌ها، داده‌های مرتبط با دستگاهتان و اطلاعات مکان دستگاهتان را کنترل و مدیریت کند.\n\nشما به %2$s وصل هستید که می‌تواند فعالیت شبکه شما را کنترل کند، از جمله رایانامه‌، برنامه‌ و وب‌سایت‌ها.\n\nبرای دریافت اطلاعات بیشتر، با سرپرستتان تماس بگیرید." @@ -482,7 +484,7 @@ "نمایه کاری" "برای بعضی افراد سرگرم‌کننده است اما نه برای همه" "‏«تنظیم‌کننده واسط کاربری سیستم» روش‌های بیشتری برای تنظیم دقیق و سفارشی کردن واسط کاربری Android در اختیار شما قرار می‌دهد. ممکن است این ویژگی‌های آزمایشی تغییر کنند، خراب شوند یا در نسخه‌های آینده جود نداشته باشند. با احتیاط ادامه دهید." - "ممکن است این ویژگی‌های آزمایشی تغییر کنند، خراب شوند یا در نسخه‌های آینده وجود نداشته باشند. با احتیاط ادامه دهید." + "ممکن است این قابلیت‌های آزمایشی تغییر کنند، خراب شوند یا در نسخه‌های آینده وجود نداشته باشد. بااحتیاط ادامه دهید." "متوجه شدم" "تبریک می‌گوییم! «تنظیم‌کننده واسط کاربری سیستم» به «تنظیمات» اضافه شد" "حذف از تنظیمات" @@ -492,8 +494,6 @@ "ثانیه‌های ساعت را در نوار وضعیت نشان می‌دهد. ممکن است بر ماندگاری باتری تأثیر بگذارد." "ترتیب مجدد در تنظیمات سریع" "نمایش روشنایی در تنظیمات سریع" - "فعال کردن تقسیم صفحه با اشاره بالا کشیدن" - "اشاره ورود به تقسیم صفحه با بالا کشیدن صفحه از دکمه نمای کلی را فعال می‌کند" "آزمایشی" "بلوتوث روشن شود؟" "برای مرتبط کردن صفحه‌کلید با رایانه لوحی، ابتدا باید بلوتوث را روشن کنید." @@ -651,4 +651,5 @@ "باز کردن تنظیمات %s." "ویرایش ترتیب تنظیمات." "صفحه %1$d از %2$d" + "نمی‌توان اعلان‌ها را بی‌صدا یا مسدود کرد" diff --git a/packages/SystemUI/res/values-fa/strings_tv.xml b/packages/SystemUI/res/values-fa/strings_tv.xml index 2894abba3b929a2a8a1a8f0416d2ea495a0c463e..b97a64650dfc5bbeb2a0f6dd605bcf2f460ab7b1 100644 --- a/packages/SystemUI/res/values-fa/strings_tv.xml +++ b/packages/SystemUI/res/values-fa/strings_tv.xml @@ -25,7 +25,7 @@ "مکث" "‏کنترل PIP ‏با نگه‌داشتن ""HOME" "تصویر در تصویر" - "تا زمانی که ویدیوی دیگری را پخش کنید، این صفحه حالت ویدیو در ویدیوی شما را حفظ می‌کند. برای کنترل آن، دکمه ""صفحه اصلی"" را فشار دهید و نگه دارید." + "تا زمانی که ویدئوی دیگری را پخش کنید، این صفحه حالت ویدئو در ویدئوی شما را حفظ می‌کند. برای کنترل آن، دکمه ""صفحه اصلی"" را فشار دهید و نگه دارید." "متوجه شدم" "رد کردن" diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 5ff50be1aa230ffc4e12b3cae4a46f8f2d93e85f..910ac29b7b057e7e067921efb42e12d8feb74302 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -238,7 +238,7 @@ "4G-tiedonsiirto keskeytettiin" "Mobiilitiedonsiirto keskeytettiin" "Tiedonsiirto keskeytettiin" - "Määrittämäsi tiedonsiirtorajoitus saavutettiin, ja laite keskeytti tiedonsiirron tämän kauden loppuajaksi.\n\nOperaattorisi voi veloittaa sinulta lisämaksun, jos jatkat tiedonsiirtoa." + "Määrittämäsi datankäyttöraja on täynnä. Mobiilidata poistettiin käytöstä.\n\nOperaattorisi voi veloittaa sinua, jos jatkat mobiilidatan käyttöä." "Jatka" "Ei internetyhteyttä" "Wi-Fi yhdistetty" @@ -404,6 +404,7 @@ "Laitetta voidaan valvoa" "Profiilia saatetaan valvoa" "Verkkoa saatetaan valvoa" + "Verkkoa saatetaan valvoa" "Laitteiden valvonta" "Profiilin valvonta" "Verkon valvonta" @@ -416,6 +417,7 @@ "VPN" "Olet muodostanut yhteyden sovellukseen %1$s, joka voi valvoa toimintaasi verkossa. Sovellus voi seurata esimerkiksi avaamiasi sähköposteja, sovelluksia ja verkkosivustoja." "Olet muodostanut yhteyden sovellukseen %1$s, joka voi valvoa henkilökohtaista toimintaasi verkossa. Sovellus voi seurata esimerkiksi avaamiasi sähköposteja, sovelluksia ja verkkosivustoja." + "Olet muodostanut yhteyden sovellukseen %1$s, joka voi valvoa henkilökohtaista toimintaasi verkossa. Sovellus voi esimerkiksi seurata avaamiasi sähköposteja, sovelluksia ja verkkosivustoja." "Työprofiiliasi hallinnoi %1$s. Se on yhteydessä sovellukseen %2$s, joka voi valvoa työhön liittyvää toimintaasi verkossa. Sovellus voi seurata esimerkiksi avaamiasi sähköposteja, sovelluksia ja verkkosivustoja.\n\nSaat lisätietoja järjestelmänvalvojaltasi." "Työprofiiliasi hallinnoi %1$s. Se on yhteydessä sovellukseen %2$s, joka voi valvoa työhön liittyvää toimintaasi verkossa. Sovellus voi seurata esimerkiksi avaamiasi sähköposteja, sovelluksia ja verkkosivustoja.\n\nLisäksi olet yhteydessä sovellukseen %3$s, joka voi valvoa henkilökohtaista toimintaasi verkossa." "Laitettasi hallinnoi %1$s.\n\nJärjestelmänvalvojasi voi valvoa ja hallinnoida laitteesi asetuksia, yrityskäyttöä, sovelluksia, laitteeseesi liittyviä tietoja ja laitteen sijaintitietoja.\n\nOlet yhteydessä sovellukseen %2$s, joka voi valvoa toimintaasi verkossa. Sovellus voi seurata esimerkiksi avaamiasi sähköposteja, sovelluksia ja verkkosivustoja.\n\nLisätietoja saat järjestelmänvalvojaltasi." @@ -492,8 +494,6 @@ "Näytä sekunnit tilapalkin kellossa. Tämä voi vaikuttaa akun kestoon." "Järjestä pika-asetukset uudelleen" "Näytä kirkkaus pika-asetuksissa" - "Siirry jaetun näytön tilaan pyyhkäisemällä ylöspäin" - "Voit siirtyä jaetun näytön tilaan pyyhkäisemällä Viimeisimmät-painikkeesta ylöspäin." "Kokeellinen" "Otetaanko Bluetooth käyttöön?" "Jotta voit yhdistää näppäimistön tablettiisi, sinun on ensin otettava Bluetooth käyttöön." @@ -651,4 +651,5 @@ "Avaa kohteen %s asetukset." "Muokkaa asetusten järjestystä." "Sivu %1$d/%2$d" + "Ilmoituksia ei voi mykistää tai estää" diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 7d50feef5cd81d9afe381577316fc42279cc2a6f..8c5e46f747a07a4d57382937ca7a0dd26fcc763b 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -240,7 +240,7 @@ "Données 4G désactivées" "Données cellulaires désactivées" "Données désactivées" - "Vous avez atteint le quota de données maximal. La consommation des données a donc été interrompue pour la fin de la période de facturation en cours.\n\nSi vous réactivez les données, votre fournisseur de services risque de vous facturer des frais supplémentaires." + "La limite de données que vous avez définie a été atteinte. Vous n\'utilisez plus les données cellulaires.\n\nSi vous rétablissez la connexion de données cellulaires, des frais peuvent s\'appliquer." "Reprendre" "Aucune connexion Internet" "Connecté au Wi-Fi" @@ -406,6 +406,7 @@ "Il est possible que cet appareil soit surveillé." "le profil peut être contrôlé" "Le réseau peut être surveillé" + "Le réseau peut être surveillé" "Surveillance d\'appareils" "Contrôle de profil" "Surveillance réseau" @@ -418,6 +419,7 @@ "RPV" "Vous êtes connecté à %1$s. Cette application peut contrôler votre activité sur le réseau, y compris les courriels, les applications et les sites Web." "Vous êtes connecté à %1$s. Cette application peut contrôler votre activité personnelle sur le réseau, y compris les courriels, les applications et les sites Web." + "Vous êtes connecté à %1$s. Cette application peut contrôler votre activité personnelle sur le réseau, y compris les courriels, les applications et les sites Web." "Votre profil professionnel est géré par %1$s. Il est connecté à %2$s. Cette application peut contrôler votre activité sur le réseau, y compris les courriels, les applications et les sites Web.\n\nPour en savoir plus, communiquez avec votre administrateur." "Votre profil professionnel est géré par %1$s. Il est connecté à %2$s. Cette application peut contrôler votre activité sur le réseau, y compris les courriels, les applications et les sites Web.\n\nVous êtes également connecté à %3$s. Cette application peut contrôler votre activité personnelle sur le réseau." "Votre appareil est géré par %1$s.\n\nVotre administrateur peut contrôler et gérer les paramètres, l\'accès aux contenus de l\'entreprise, les applications, les données associées à cet appareil et ses données de localisation.\n\nVous êtes connecté à %2$s, qui peut contrôler votre activité réseau, y compris les courriels, les applications et les sites Web.\n\nPour en savoir plus, communiquez avec votre administrateur." @@ -494,8 +496,6 @@ "Afficher les secondes sur l\'horloge dans la barre d\'état. Cela peut réduire l\'autonomie de la pile." "Réorganiser les paramètres rapides" "Afficher la luminosité dans les paramètres rapides" - "Activer le geste d\'écran partagé en balayant vers le haut" - "Activer le geste permettant d\'utiliser l\'écran partagé en balayant l\'écran vers le haut à partir du bouton « Aperçu »" "Fonctions expérimentales" "Activer Bluetooth?" "Pour connecter votre clavier à votre tablette, vous devez d\'abord activer la connectivité Bluetooth." @@ -653,4 +653,5 @@ "Ouvrir les paramètres %s." "Modifier l\'ordre des paramètres." "Page %1$d sur %2$d" + "Impossible de désactiver ou de bloquer les notifications" diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 447255ba85d204b1d26ba44d5b9348ca02a44a7b..4b58a6d376df86589bbbbad91170a48a5f657969 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -240,7 +240,7 @@ "Données 4G désactivées" "Données mobiles désactivées" "Données désactivées" - "Vous avez atteint le quota de données maximal. La consommation des données a donc été interrompue pour la fin de la période de facturation en cours.\n\nSi vous réactivez les données, votre opérateur risque de vous facturer des frais supplémentaires." + "La limite de consommation des données que vous avez définie a été atteinte. Vous n\'utilisez plus les données mobiles.\n\nSi vous les réactivez, des frais pourront être facturés." "Réactiver" "Aucune connexion Internet" "Connecté au Wi-Fi" @@ -406,6 +406,7 @@ "Il est possible que cet appareil soit surveillé." "Le profil peut être contrôlé." "Il est possible que le réseau soit surveillé." + "Il est possible que le réseau soit surveillé." "Contrôle des appareils" "Contrôle du profil" "Contrôle du réseau" @@ -418,6 +419,7 @@ "VPN" "Vous êtes connecté à %1$s. Cette application peut contrôler votre activité sur le réseau, y compris l\'activité relative aux e-mails, aux applications et aux sites Web." "Vous êtes connecté à %1$s. Cette application peut contrôler votre activité personnelle sur le réseau, y compris votre activité relative aux e-mails, aux applications et aux sites Web." + "Vous êtes connecté à %1$s. Cette application peut contrôler votre activité personnelle sur le réseau, y compris les e-mails, les applications et les sites Web." "Votre profil professionnel est géré par %1$s. Il est connecté à %2$s. Cette application peut contrôler l\'activité de ce profil sur le réseau, y compris l\'activité relative aux e-mails, aux applications et aux sites Web.\n\nPour en savoir plus, contactez votre administrateur." "Votre profil professionnel est géré par %1$s. Il est connecté à %2$s. Cette application peut contrôler l\'activité de ce profil sur le réseau, y compris l\'activité relative aux e-mails, aux applications et aux sites Web.\n\nVous êtes également connecté à %3$s. Cette application peut surveiller votre activité personnelle sur le réseau." "Votre appareil géré par %1$s.\n\nVotre administrateur peut contrôler et gérer les paramètres, l\'accès aux contenus de l\'entreprise, les applications, les données associées à cet appareil et les informations de localisation de celui-ci.\n\nVous êtes connecté à %2$s qui peut contrôler votre activité sur le réseau (e-mails, applications et sites Web).\n\nPour en savoir plus, contactez votre administrateur." @@ -446,7 +448,7 @@ "Appeler" "Système" - "Faire sonner" + "Sonnerie" "Multimédia" "Alarme" @@ -494,8 +496,6 @@ "Afficher les secondes dans la barre d\'état. Cela risque de réduire l\'autonomie de la batterie." "Réorganiser la fenêtre de configuration rapide" "Afficher la luminosité dans fenêtre de configuration rapide" - "Activer l\'écran partagé en balayant vers le haut" - "Activer le geste permettant d\'utiliser l\'écran partagé en balayant l\'écran vers le haut à partir du bouton \"Aperçu\"" "Paramètres expérimentaux" "Activer le Bluetooth ?" "Pour connecter un clavier à votre tablette, vous devez avoir activé le Bluetooth." @@ -653,4 +653,5 @@ "Ouvrir les paramètres %s." "Modifier l\'ordre des paramètres." "Page %1$d sur %2$d" + "Impossible d\'ignorer ou de bloquer les notifications" diff --git a/packages/SystemUI/res/values-gl-rES/strings.xml b/packages/SystemUI/res/values-gl-rES/strings.xml index 6d0e366332a03e321502b5ee750252337451e847..449c747814d5c2b02092cce440b899ed32e71232 100644 --- a/packages/SystemUI/res/values-gl-rES/strings.xml +++ b/packages/SystemUI/res/values-gl-rES/strings.xml @@ -240,7 +240,7 @@ "Os datos 4G están en pausa" "Os datos de móbiles están en pausa" "Os datos están en pausa" - "Como acadaches o límite de datos definido, o dispositivo puxo en pausa o uso de datos para o resto do ciclo.\n\nSe retomas o uso, poden aplicarse cargos do operador." + "Alcanzouse o límite de datos establecido e xa non utilizas datos móbiles.\n\nSe continúas, é posible que se apliquen cargos por uso de datos." "Retomar" "Sen Internet" "Wi-Fi conectada" @@ -406,6 +406,7 @@ "É posible que se supervise o dispositivo" "O perfil pódese supervisar" "É posible que se supervise a rede" + "É posible que se supervise a rede" "Supervisión de dispositivos" "Supervisión do perfil" "Supervisión de rede" @@ -418,6 +419,7 @@ "VPN" "Estás conectado a %1$s, que pode supervisar a túa actividade na rede, incluídos os correos electrónicos, as aplicacións e os sitios web." "Estás conectado a %1$s, que pode supervisar a túa actividade persoal na rede, incluídos os correos electrónicos, as aplicacións e os sitios web." + "Estás conectado a %1$s, que pode supervisar a túa actividade persoal na rede, incluídos os correos electrónicos, as aplicacións e os sitios web." "O teu perfil de traballo está xestionado por %1$s. Está conectado a %2$s, que pode supervisar a túa actividade na rede, incluídos os correos electrónicos, as aplicacións e os sitios web.\n\nPara obter máis información, ponte en contacto co teu administrador." "O teu perfil de traballo está xestionado por %1$s. Está conectado a %2$s, que pode supervisar a túa actividade na rede, incluídos os correos electrónicos, as aplicacións e os sitios web.\n\nTamén estás conectado a %3$s, que pode supervisar a túa actividade persoal na rede." "O dispositivo está xestionado por %1$s.\n\nO teu administrador pode supervisar e xestionar a configuración, o acceso corporativo, as aplicacións, os datos asociados co dispositivo e a información de localización do dispositivo.\n\nEstás conectado a %2$s, que pode supervisar a túa actividade na rede: os correos electrónicos, as aplicacións e os sitios web.\n\nPara obter máis información, contacta co teu administrador." @@ -494,8 +496,6 @@ "Mostra os segundos do reloxo na barra de estado. Pode influír na duración da batería." "Reorganizar Configuración rápida" "Mostrar brillo en Configuración rápida" - "Activar pantalla dividida pasando o dedo cara arriba" - "Activa o xesto de pasar o dedo cara arriba desde o botón Visión xeral para acceder ao modo de pantalla dividida" "Experimental" "Queres activar o Bluetooth?" "Para conectar o teu teclado coa tableta, primeiro tes que activar o Bluetooth." @@ -653,4 +653,5 @@ "Abrir a configuración de %s." "Editar a orde das opcións de configuración." "Páxina %1$d de %2$d" + "As notificacións non se poden silenciar nin bloquear" diff --git a/packages/SystemUI/res/values-gu-rIN/strings.xml b/packages/SystemUI/res/values-gu-rIN/strings.xml index 0663b41af0dd5d4dfe96e20aa020a65428dc6529..5287576dfdee1473b16f7acefdd6d3521008a4f7 100644 --- a/packages/SystemUI/res/values-gu-rIN/strings.xml +++ b/packages/SystemUI/res/values-gu-rIN/strings.xml @@ -238,7 +238,7 @@ "4G ડેટા થોભાવ્યો છે" "સેલ્યુલર ડેટા થોભાવ્યો છે" "ડેટા થોભાવ્યો છે" - "તમે સેટ કરેલ ડેટા મર્યાદા સુધી પહોંચી ગયા હોવાથી, ઉપકરણે આ ચક્રના શેષ માટે ડેટા વપરાશ થોભાવ્યો છે.\n\nફરીથી શરૂ કરવું તમારા કેરીઅર તરફથી શુલ્ક તરફ દોરી શકે છે." + "તમારા દ્વારા સેટ કરેલ ડેટા મર્યાદા પર તમે પહોંચી ગયાં છો. તમે હવે સેલ્યુલર ડેટાનો ઉપયોગ કરી રહ્યાં નથી.\n\nજો તમે ફરી શરૂ કરો છો, તો ડેટા વપરાશ માટે શુલ્ક લાગુ થઈ શકે છે." "ફરી શરૂ કરો" "કોઈ ઇન્ટરનેટ કનેક્શન નથી" "Wi-Fi કનેક્ટ કર્યું" @@ -404,6 +404,7 @@ "ઉપકરણ મૉનિટર કરી શકાય છે" "પ્રોફાઇલ મૉનિટર કરી શકાય છે" "નેટવર્ક મૉનિટર કરી શકાય છે" + "નેટવર્ક મૉનિટર કરવામાં આવી શકે છે" "ઉપકરણ નિરીક્ષણ" "પ્રોફાઇલ નિરીક્ષણ" "નેટવર્ક મૉનિટરિંગ" @@ -416,6 +417,7 @@ "VPN" "તમે %1$s સાથે કનેક્ટ થયાં છો, જે ઇમેઇલ્સ, ઍપ્લિકેશનો અને વેબસાઇટ્સ સહિતની તમારી નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે." "તમે %1$s સાથે કનેક્ટ થયાં છો, જે ઇમેઇલ્સ, ઍપ્લિકેશનો અને વેબસાઇટ્સ સહિતની તમારી વ્યક્તિગત નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે." + "તમે %1$s સાથે કનેક્ટ થયાં છો, જે ઇમેઇલ્સ, ઍપ્લિકેશનો અને વેબસાઇટ્સ સહિત તમારી વ્યક્તિગત નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે." "તમારી કાર્ય પ્રોફાઇલ %1$s દ્વારા સંચાલિત થાય છે. તે %2$s સાથે કનેક્ટ થયેલ છે, જે ઇમેઇલ્સ, ઍપ્લિકેશનો અને વેબસાઇટ્સ સહિતની તમારી કાર્ય નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે.\n\nવધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો." "તમારી કાર્ય પ્રોફાઇલ %1$s દ્વારા સંચાલિત થાય છે. તે %2$s સાથે કનેક્ટ થયેલ છે, જે ઇમેઇલ્સ, ઍપ્લિકેશનો અને વેબસાઇટ્સ સહિતની તમારી કાર્ય નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે.\n\nતમે %3$s સાથે પણ કનેક્ટ થયેલ છો, જે તમારી વ્યક્તિગત નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે." "તમારું ઉપકરણ %1$s દ્વારા સંચાલિત થાય છે.\n\nતમારા વ્યવસ્થાપક, સેટિંગ્સ, કોર્પોરેટ ઍક્સેસ, ઍપ્લિકેશનો, તમારા ઉપકરણ સાથે સંકળાયેલ ડેટા અને તમારા ઉપકરણની સ્થાન માહિતીને મૉનિટર કરી અને સંચાલિત કરી શકે છે.\n\nતમે %2$s સાથે કનેક્ટ થયાં છો, જે ઇમેઇલ્સ, ઍપ્લિકેશનો અને વેબસાઇટ્સ સહિતની તમારી નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે.\n\nવધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો." @@ -492,8 +494,6 @@ "ઘડિયાળ સેકન્ડ સ્થિતિ બારમાં બતાવો. બૅટરીની આવરદા પર અસર કરી શકે છે." "ઝડપી સેટિંગ્સને ફરીથી ગોઠવો" "ઝડપી સેટિંગ્સમાં તેજ બતાવો" - "સ્પ્લિટ-સ્ક્રીન સ્વાઇપ-અપ હાવભાવ સક્ષમ કરો" - "વિહંગાવલોકન બટનમાંથી સ્વાઇપ કરીને સ્પ્લિટ-સ્ક્રીનમાં દાખલ થવા માટે હાવભાવ સક્ષમ કરો" "પ્રાયોગિક" "Bluetooth ચાલુ કરવુ છે?" "તમારા ટેબ્લેટ સાથે કીબોર્ડ કનેક્ટ કરવા માટે, તમારે પહેલાં Bluetooth ચાલુ કરવાની જરૂર પડશે." @@ -651,4 +651,5 @@ "%s સેટિંગ્સ ખોલો." "સેટિંગ્સનો ક્રમ સંપાદિત કરો." "%2$d માંથી %1$d પૃષ્ઠ" + "સૂચનાઓ શાંત અથવા અવરોધિત કરી શકાતી નથી" diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 29245568808134fcafec1cb3af19bb22c67d7638..5c24fe2cf3a915ec04bc62ae6b27b7be1a821b85 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -238,7 +238,7 @@ "4G डेटा रोक दिया गया है" "सेल्युलर डेटा रोक दिया गया है" "डेटा रोक दिया गया है" - "चूंकि आपके निर्धारित डेटा की सीमा, सीमा पर पहुंच गई थी, इसलिए डिवाइस ने इस चक्र के रिमाइंडर के लिए डेटा उपयोग को रोक दिया है.\n\nफिर से शुरू करने से आपके वाहक की ओर से शुल्क लगाया जाता है." + "आपकी सेट की हुई डेटा सीमा समाप्त हो गई है. अब आप सेल्युलर डेटा का उपयोग नहीं कर रहे हैं.\n\nयदि आप फिर से शुरू करते हैं, तो डेटा उपयोग के लिए शुल्क लग सकता है." "फिर से शुरू करें" "कोई इंटरनेट कनेक्शन नहीं" "वाई-फ़ाई कनेक्‍ट किया गया" @@ -404,6 +404,7 @@ "डिवाइस को मॉनीटर किया जा सकता है" "प्रोफ़ाइल को मॉनीटर किया जा सकता है" "नेटवर्क को मॉनीटर किया जा सकता है" + "नेटवर्क को मॉनिटर किया जा सकता है" "डिवाइस को मॉनीटर करना" "प्रोफ़ाइल को मॉनीटर करना" "नेटवर्क को मॉनीटर करना" @@ -416,6 +417,7 @@ "VPN" "आप %1$s से कनेक्‍ट हैं, जो ईमेल, ऐप्‍स और वेबसाइटों सहित आपकी नेटवर्क गतिविधि की निगरानी कर सकता है." "आप %1$s से कनेक्‍ट हैं, जो ईमेल, ऐप्‍स और वेबसाइटों सहित आपकी व्‍यक्‍तिगत नेटवर्क गतिविधि की निगरानी कर सकता है." + "आप %1$s से कनेक्‍ट हैं, जो ईमेल, ऐप्लिकेशन और वेबसाइट सहित आपकी व्‍यक्‍तिगत नेटवर्क गतिविधि को मॉनिटर कर सकता है." "आपकी कार्य प्रोफ़ाइल %1$s के द्वारा प्रबंधित है. वह %2$s से कनेक्‍ट है, जो ईमेल, ऐप्‍स और वेबसाइटों सहित आपकी कार्य नेटवर्क गतिविधि की निगरानी कर सकता है.\n\nअधिक जानकारी के लिए, अपने नियंत्रक से संपर्क करें." "आपकी कार्य प्रोफ़ाइल %1$s के द्वारा प्रबंधित है. वह %2$s से कनेक्‍ट है, जो ईमेल, ऐप्‍स और वेबसाइटों सहित आपकी कार्य नेटवर्क गतिविधि की निगरानी कर सकता है.\n\nआप %3$s से भी कनेक्‍ट हैं, जो आपकी व्‍यक्‍तिगत नेटवर्क गतिविधि की निगरानी कर सकता है." "आपका डिवाइस %1$s के द्वारा प्रबंधित है.\n\nआपका नियंत्रक सेटिंग, कॉर्पोरेट ऐक्‍सेस, ऐप्स, आपके डिवाइस से संबद्ध डेटा और आपके डिवाइस की स्‍थान जानकारी की निगरानी और उसका प्रबंधन कर सकता है.\n\nआप %2$s से कनेक्‍ट हैं, जो ईमेल, ऐप्‍स और वेबसाइटों सहित आपकी नेटवर्क गतिविधि की निगरानी कर सकता है.\n\nअधिक जानकारी के लिए, अपने नियंत्रक से संपर्क करें." @@ -492,8 +494,6 @@ "स्थिति बार में घड़ी के सेकंड दिखाएं. इससे बैटरी के जीवनकाल पर प्रभाव पड़ सकता है." "त्वरित सेटिंग को पुन: व्यवस्थित करें" "त्वरित सेटिंग में स्क्रीन की रोशनी दिखाएं" - "ऊपर स्वाइप करके विभाजित स्क्रीन में जाने का जेस्चर सक्षम करें" - "अवलोकन बटन से ऊपर स्वाइप करके स्क्रीन विभाजन में आने का हावभाव सक्षम करें" "प्रयोगात्मक" "ब्लूटूथ चालू करें?" "अपने कीबोर्ड को अपने टैबलेट से कनेक्ट करने के लिए, आपको पहले ब्लूटूथ चालू करना होगा." @@ -651,4 +651,5 @@ "%s सेटिंग खोलें." "सेटिंग का क्रम संपादित करें." "पृष्ठ %2$d में से %1$d" + "नोटिफ़िकेशन मौन या अवरुद्ध नहीं किए जा सकते हैं" diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 02466d610b9ec0077e8798a80bb591330c70af08..df3ccf1e5fc1e27a7e7df87eb80e71a30c62edea 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -239,7 +239,7 @@ "4G podaci pauzirani" "Mobilni podaci pauzirani" "Podaci su pauzirani" - "Budući da je dosegnuto postavljeno ograničenje podataka, uređaj je pauzirao upotrebu podataka za preostali dio ovog ciklusa.\n\nMobilni operater može naplatiti daljnju upotrebu." + "Dosegnuto je vaše ograničenje podataka. Više ne upotrebljavate mobilne podatke.\n\nAko nastavite, moguća je naplata za potrošnju podataka." "Nastavi" "Nema internetske veze" "Wi-Fi povezan" @@ -406,6 +406,7 @@ "Uređaj se možda nadzire" "Profil se možda nadzire" "Mreža se možda nadzire" + "Mreža se možda nadzire" "Nadzor uređaja" "Nadzor profila" "Nadzor mreže" @@ -418,6 +419,7 @@ "VPN" "Povezani ste s aplikacijom %1$s koja može nadzirati vašu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije." "Povezani ste s aplikacijom %1$s koja može nadzirati vašu osobnu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije." + "Povezani ste s aplikacijom %1$s koja može nadzirati vašu osobnu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije." "Vašim poslovnim profilom upravlja %1$s. Povezan je s aplikacijom %2$s koja može nadzirati vašu poslovnu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije.\n\nObratite se svojem administratoru za više informacija." "Vašim poslovnim profilom upravlja %1$s. Povezan je s aplikacijom %2$s koja može nadzirati vašu poslovnu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije.\n\nPovezani ste i s aplikacijom %3$s koja može nadzirati vašu osobnu aktivnost na mreži." "Vašim uređajem upravlja %1$s.\n\nVaš administrator može nadzirati postavke, poslovni pristup, aplikacije, podatke povezane s uređajem i podatke o lokaciji uređaja te upravljati njima.\n\nPovezani ste s aplikacijom %2$s koja može nadzirati vašu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije.\n\nObratite se svojem administratoru za više informacija." @@ -494,8 +496,6 @@ "Prikazuju se sekunde na satu na traci statusa. Može utjecati na trajanje baterije." "Promijeni raspored Brzih postavki" "Prikaži svjetlinu u Brzim postavkama" - "Omogući pokret povlačenja prema gore za podijeljen zaslon" - "Omogućivanje pokreta za otvaranje podijeljenog zaslona tako da se od gumba Pregled prstom prijeđe prema gore" "Eksperimentalno" "Želite li uključiti Bluetooth?" "Da biste povezali tipkovnicu s tabletom, morate uključiti Bluetooth." @@ -653,4 +653,5 @@ "Otvaranje postavki za %s." "Uređivanje redoslijeda postavki." "Stranica %1$d od %2$d" + "Obavijesti se ne mogu utišati niti blokirati" diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index b89b1069922ba562d8ec46b67e1a357f39d14725..425212a56186982a9c700a32988e6f19651e5c84 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -238,7 +238,7 @@ "A 4G adatforgalom szünetel" "A mobilhálózati adatforgalom szünetel" "Az adatforgalom szünetel" - "Mivel elérte a beállított adatkorlátot, az eszköz a ciklus fennmaradó részére felfüggesztette az adathasználatot.\n\nHa mégis használja az adatkapcsolatot, akkor szolgáltatója többletköltséget számíthat fel." + "Elérte a beállított adatkorlátot. A továbbiakban nem használ mobiladat-forgalmat.\n\nHa a folytatást választja, szolgáltatója adathasználati díjat számíthat fel." "Folytatás" "Nincs internet" "Wi-Fi csatlakoztatva" @@ -404,6 +404,7 @@ "Lehet, hogy az eszközt figyelik" "Profilját felügyelhetik" "Lehet, hogy a hálózatot figyelik" + "Lehet, hogy a hálózat felügyelt" "Eszközfigyelés" "Profilfelügyelet" "Hálózatfigyelés" @@ -416,6 +417,7 @@ "VPN" "Csatlakoztatta a(z) %1$s alkalmazást, amely figyelheti hálózati tevékenységét, beleértve az e-maileket, az alkalmazásokat és a webhelyeket." "Csatlakoztatta a(z) %1$s alkalmazást, amely figyelheti személyes hálózati tevékenységét, beleértve az e-maileket, az alkalmazásokat és a webhelyeket." + "Ön a(z) %1$s alkalmazáshoz csatlakozik, amely figyelheti személyes hálózati tevékenységét, beleértve az e-maileket, alkalmazásokat és webhelyeket." "Munkaprofilját a(z) %1$s felügyeli. Csatlakoztatva van hozzá a(z) %2$s alkalmazás, amely figyelheti az Ön hálózati tevékenységét, beleértve az e-maileket, az alkalmazásokat és a webhelyeket.\n\nTovábbi információért forduljon a rendszergazdájához." "Munkaprofilját a(z) %1$s felügyeli. Csatlakoztatva van hozzá a(z) %2$s alkalmazás, amely figyelheti az Ön hálózati tevékenységét, beleértve az e-maileket, az alkalmazásokat és a webhelyeket.\n\nCsatlakoztatta továbbá a(z) %3$s alkalmazást, amely szintén figyelemmel kísérheti személyes hálózati tevékenységét." "Eszközét a következő felügyeli: %1$s.\n\nA rendszergazda figyelemmel kísérheti és módosíthatja beállításait, vállalati hozzáféréseit, alkalmazásait, az eszközéhez társított adatokat és eszköze helyadatait.\n\nÖn a következőhöz csatlakozik: %2$s, amely (az e-mailekre, alkalmazásokra és webhelyekre is kiterjedően) figyelemmel kísérheti hálózati tevékenységét.\n\nTovábbi információért forduljon a rendszergazdához." @@ -481,7 +483,7 @@ "Hotspot" "Munkaprofil" "Egyeseknek tetszik, másoknak nem" - "A Kezelőfelület-hangoló az Android felhasználói felületének szerkesztéséhez és testreszabásához nyújt további megoldásokat. Ezek a kísérleti funkciók változhatnak vagy megsérülhetnek a későbbi kiadásokban,illetve eltűnhetnek azokból. Körültekintően járjon el." + "A Kezelőfelület-hangoló az Android felhasználói felületének szerkesztéséhez és testreszabásához nyújt további megoldásokat. Ezek a kísérleti funkciók változhatnak vagy megsérülhetnek a későbbi kiadásokban, illetve eltűnhetnek azokból. Körültekintően járjon el." "Ezek a kísérleti funkciók változhatnak vagy megsérülhetnek a későbbi kiadásokban, illetve eltűnhetnek azokból. Körültekintően járjon el." "Értem" "Gratulálunk! A Kezelőfelület-hangolót hozzáadtuk a Beállításokhoz" @@ -492,8 +494,6 @@ "Másodpercek megjelenítése az állapotsor óráján. Ez hatással lehet az akkumulátor üzemidejére." "Gyorsbeállítások átrendezése" "Fényerő megjelenítése a gyorsbeállításokban" - "Képernyőfelosztó gyors felfelé csúsztatás engedélyezése" - "Kézmozdulat engedélyezése osztott képernyős nézet aktiválásához, ha az Áttekintés gombról felfelé húzza az ujját" "Kísérleti" "Engedélyezi a Bluetooth-kapcsolatot?" "Ha a billentyűzetet csatlakoztatni szeretné táblagépéhez, először engedélyeznie kell a Bluetooth-kapcsolatot." @@ -651,4 +651,5 @@ "A(z) %s beállításainak megnyitása." "Beállítások sorrendjének szerkesztése." "%1$d. oldal, összesen: %2$d" + "Az értesítéseket nem lehet elnémítani vagy letiltani" diff --git a/packages/SystemUI/res/values-hy-rAM/strings.xml b/packages/SystemUI/res/values-hy-rAM/strings.xml index d0d6c506f72dfe48f3e1001456a7f0efd65a991a..77b1c824a7f4cc5a8199381a06e51d835f1bf3bf 100644 --- a/packages/SystemUI/res/values-hy-rAM/strings.xml +++ b/packages/SystemUI/res/values-hy-rAM/strings.xml @@ -32,7 +32,7 @@ "Ծանուցումներ չկան" "Ընթացիկ" "Ծանուցումներ" - "Մարտկոցը լիցքաթափվում է" + "Մարտկոցի լիցքը սպառվում է" "Մնաց %s" "Մնաց %s: Մարտկոցի տնտեսումը միացված է:" "USB լիցքավորումը չի աջակցվում:\nՕգտվեք միայն գործող լիցքավորիչից:" @@ -238,7 +238,7 @@ "4Գ տվյալների օգտագործումը դադարեցված է" "Բջջային տվյալների օգտագործումը դադարեցված է" "Տվյալների օգտագործումը դադարեցված է" - "Քանի որ ձեր սահմանված տվյալների սահմանաչափը սպառվել է, սարքն այլևս չի օգտագործի տվյալները այս ցիկլի մնացած ընթացքում:\n\nԵթե վերսկսեք, հնարավոր է կիրառվեն գանձումներ ձեր օպերատորի կողմից:" + "Տվյալների օգտագործման համար նշված սահմանաչափը լրացել է: Դուք բջջային տվյալներ այլևս չեք օգտագործում:\n\nԵթե վերսկսեք բջջային տվյալների օգտագործումը, դրա համար կարող են վճարներ գանձվել:" "Վերսկսել" "Ինտերնետ կապ չկա" "Wi-Fi-ը միացված է" @@ -404,6 +404,7 @@ "Սարքը կարող է վերահսկվել" "Պրոֆիլը կարող է վերահսկվել" "Ցանցը կարող է վերահսկվել" + "Ցանցը կարող է վերահսկվել" "Սարքի մշտադիտարկում" "Պրոֆիլի վերահսկում" "Ցանցի մշտադիտարկում" @@ -416,6 +417,7 @@ "VPN" "Դուք կապակցված եք %1$s հավելվածին, որը կարող է վերահսկել ձեր ցանցի գործունեությունը, այդ թվում նաև էլփոստի հաշիվները, հավելվածները և կայքերը:" "Դուք կապակցված եք %1$s հավելվածին, որը կարող է վերահսկել անձնական ցանցում կատարած ձեր գործողությունները, այդ թվում նաև էլփոստի հաշիվները, հավելվածները և կայքերը:" + "Դուք կապակցված եք %1$s հավելվածին, որը կարող է վերահսկել անձնական ցանցում կատարած ձեր գործողությունները, այդ թվում նաև էլփոստի հաշիվները, հավելվածները և կայքերը:" "Աշխատանքային պրոֆիլի կառավարիչն է՝ %1$s: Այն կապակցված է %2$s հավելվածին, որը կարող է վերահսկել աշխատանքային ցանցում կատարած գործունեությունը, այդ թվում նաև էլփոստի հաշիվները, հավելվածները և կայքերը:\n\nԼրացուցիչ տեղեկությունների համար դիմեք ադմինիստրատորին:" "Աշխատանքային պրոֆիլի կառավարիչն է՝ %1$s: Այն կապակցված է %2$s հավելվածին, որը կարող է վերահսկել աշխատանքային ցանցում կատարած գործունեությունը, այդ թվում նաև էլփոստի հաշիվները, հավելվածները և կայքերը:\n\nԴուք նույնպես կապակցված եք %3$s հավելվածին, որը կարող է վերահսկել անձնական ցանցում կատարած ձեր գործողությունները:" "Սարքի կառավարիչն է՝ %1$s:\n\nԱդմինիստրատորը կարող է վերահսկել և կառավարել կարգավորումները, կորպորատիվ հաշիվը, հավելվածները, սարքի հետ առնչվող և սարքի տեղադրության տվյալները:\n\nՆաև կապակցված եք %2$s հավելվածին, ինչը կարող է վերահսկել ձեր ցանցի գործունեությունը, այդ թվում նաև՝ էլփոստի հաշիվները, հավելվածները և կայքերը:\n\nԼրացուցիչ տեղեկությունների համար դիմեք ադմինիստրատորին:" @@ -492,8 +494,6 @@ "Ցույց տալ ժամացույցի վայրկյանները կարգավիճակի տողում: Կարող է ազդել մարտկոցի աշխատանքի ժամանակի վրա:" "Վերադասավորել Արագ կարգավորումները" "Ցույց տալ պայծառությունն Արագ կարգավորումներում" - "Ակտիվացնել մատը վերև սահեցնելով էկրանը տրոհելու ժեստը" - "Միացնել Համատեսք կոճակից մատը դեպի վերև սահեցնելու միջոցով տրոհված էկրանի ռեժիմ անցնելու ժեստը" "Փորձնական" "Միացնե՞լ Bluetooth-ը:" "Ստեղնաշարը ձեր պլանշետին միացնելու համար նախ անհրաժեշտ է միացնել Bluetooth-ը:" @@ -644,11 +644,12 @@ "Բացել կարգավորումները:" "Բացել արագ կարգավորումները:" "Փակել արագ կարգավորումները:" - "Զարթուցիչը կարգավորված է:" + "Զարթուցիչը դրված է:" "Մուտք է գործել որպես %s" "Ինտերնետ կապ չկա:" "Բացել մանրամասները:" "Բացել %s կարգավորումները:" "Խմբագրել կարգավորումների հերթականությունը:" "Էջ %1$d / %2$d" + "Հնարավոր չէ արգելափակել ծանուցումները կամ անջատել դրանց ձայնը" diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index ad24d6a2954f647979361ac6f0a1854261ddecf5..d006addad516c9fb9dbbb5528c22f5f1157ca717 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -238,7 +238,7 @@ "Data 4G dijeda" "Data seluler dijeda" "Data dijeda" - "Karena batas data yang disetel telah tercapai, perangkat telah menjeda penggunaan data selama sisa waktu siklus ini.\n\nMelanjutkan dapat mengakibatkan tagihan dari operator." + "Batas data yang disetel telah tercapai. Anda tidak menggunakan data seluler lagi.\n\nJika Anda melanjutkan, biaya penggunaan data mungkin berlaku." "Lanjutkan" "Tidak ada sambungan internet" "Wi-Fi tersambung" @@ -404,6 +404,7 @@ "Perangkat mungkin dipantau" "Profil dapat dipantau" "Jaringan mungkin dipantau" + "Jaringan mungkin dipantau" "Pemantauan perangkat" "Pemantauan profil" "Pemantauan jaringan" @@ -416,6 +417,7 @@ "VPN" "Anda tersambung ke %1$s, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs web." "Anda tersambung ke %1$s, yang dapat memantau aktivitas jaringan pribadi, termasuk email, aplikasi, dan situs web." + "Anda tersambung ke %1$s, yang dapat memantau aktivitas jaringan pribadi, termasuk email, aplikasi, dan situs web.." "Profil kerja dikelola oleh %1$s dan tersambung ke %2$s, yang dapat memantau aktivitas jaringan kerja, termasuk email, aplikasi, dan situs web.\n\nUntuk informasi selengkapnya, hubungi administrator." "Profil kerja dikelola oleh %1$s dan tersambung ke %2$s, yang dapat memantau aktivitas jaringan kerja, termasuk email, aplikasi, dan situs web.\n\nAnda juga tersambung ke %3$s, yang dapat memantau aktivitas jaringan pribadi." "Perangkat dikelola oleh %1$s.\n\nAdministrator dapat memantau dan mengelola setelan, akses perusahaan, aplikasi, data terkait perangkat, dan informasi lokasi perangkat.\n\nAnda tersambung ke %2$s, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs web.\n\nUntuk informasi selengkapnya, hubungi administrator." @@ -492,8 +494,6 @@ "Tampilkan detik jam di bilah status. Dapat memengaruhi masa pakai baterai." "Atur Ulang Setelan Cepat" "Tampilkan kecerahan di Setelan Cepat" - "Aktifkan isyarat gesek atas untuk layar terpisah" - "Aktifkan isyarat untuk masuk layar terpisah dengan menggesek tombol Ringkasan ke atas" "Eksperimental" "Aktifkan Bluetooth?" "Untuk menghubungkan keyboard dengan tablet, terlebih dahulu aktifkan Bluetooth." @@ -651,4 +651,5 @@ "Buka setelan %s." "Edit urutan setelan." "Halaman %1$d dari %2$d" + "Notifikasi tidak dapat disenyapkan atau diblokir" diff --git a/packages/SystemUI/res/values-is-rIS/strings.xml b/packages/SystemUI/res/values-is-rIS/strings.xml index a95e28b2d55e2c7b407f5776bb71523c9e1c55c9..26b1e74b0cfc38b9d172d311c6f462b6d12fc172 100644 --- a/packages/SystemUI/res/values-is-rIS/strings.xml +++ b/packages/SystemUI/res/values-is-rIS/strings.xml @@ -238,7 +238,7 @@ "Slökkt er á 4G-gögnum" "Slökkt er á farsímagögnum" "Slökkt er á gagnanotkun" - "Þar sem gagnahámarkinu var náð hefur tækið slökkt á gagnanotkun það sem eftir er af þessu tímabili.\n\nEf þú heldur áfram kann það að leiða til kostnaðar frá símafyrirtækinu." + "Gagnamörkunum sem þú stilltir hefur verið náð. Þú ert ekki lengur að nota farsímagögn.\n\nEf þú heldur áfram gætu gjöld fyrir gagnanotkun átt við." "Halda áfram" "Engin nettenging" "Wi-Fi tengt" @@ -404,6 +404,7 @@ "Hugsanlega er fylgst með tækjum" "Hugsanlega er fylgst með þessu sniði" "Hugsanlega er fylgst með netinu" + "Hugsanlega er fylgst með netinu" "Tækjaeftirlit" "Fylgst með sniði" "Neteftirlit" @@ -416,6 +417,7 @@ "VPN" "Þú ert með tengingu við %1$s, sem getur fylgst með netnotkun þinni, þ. á m. tölvupósti, forritum og vefsvæðum." "Þú ert með tengingu við %1$s, sem getur fylgst með persónulegri netnotkun þinni, þ. á m. tölvupósti, forritum og vefsvæðum." + "Þú ert með tengingu við %1$s, sem getur fylgst með persónulegri netnotkun þinni, þ. á m. tölvupósti, forritum og vefsvæðum." "Vinnusniðinu þínu er stjórnað af %1$s. Það er tengt %2$s, sem getur fylgst með vinnutengdri netnotkun þinni, þar á meðal tölvupósti, forritum og vefsvæðum.\n\nHafðu samband við kerfisstjórann til að fá frekari upplýsingar." "Vinnusniðinu þínu er stjórnað af %1$s. Það er tengt %2$s, sem getur fylgst með vinnutengdri netnotkun þinni, þar á meðal tölvupósti, forritum og vefsvæðum.\n\nÞú ert einnig með tengingu við %3$s, sem getur fylgst með persónulegri netnotkun þinni." "Tækinu er stjórnað af %1$s.\n\nKerfisstjórinn þinn getur fylgst með og stjórnað stillingum, fyrirtækjaaðgangi, forritum, gögnum sem tengd eru tækinu og staðsetningarupplýsingum tækisins.\n\nÞú ert með tengingu við %2$s, sem getur fylgst með netnotkun þinni, þar á meðal tölvupósti, forritum og vefsvæðum.\n\nHafðu samband við kerfisstjórann til að fá frekari upplýsingar." @@ -492,8 +494,6 @@ "Sýna sekúndur á klukku í stöðustikunni. Getur haft áhrif á endingu rafhlöðu." "Endurraða flýtistillingum" "Sýna birtustig í flýtistillingum" - "Virkja skjáskiptingu með því að strjúka upp" - "Virkja skjáskiptingarbendingu með því að strjúka upp frá yfirlitshnappi" "Tilraunastillingar" "Kveikja á Bluetooth?" "Til að geta tengt lyklaborðið við spjaldtölvuna þarftu fyrst að kveikja á Bluetooth." @@ -651,4 +651,5 @@ "Opna %s stillingar." "Breyta röð stillinga." "Blaðsíða %1$d af %2$d" + "Ekki er hægt að þagga eða loka á tilkynningar" diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index d370b6588bcba1656908d64b7cf73a88f41ed894..d056637fe93b136df033814a92ba8f6a5f5efb54 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -240,7 +240,7 @@ "Dati 4G sospesi" "Dati cellulari sospesi" "Dati sospesi" - "Hai raggiunto il tuo limite di dati, pertanto sul dispositivo è stato sospeso l\'utilizzo di dati per la parte rimanente del ciclo.\n\nSe riprendi a utilizzare i dati, l\'operatore potrebbe addebitarti costi." + "È stato raggiunto il limite di dati impostato. La rete dati è stata disattivata.\n\nSe la riattivi, potrebbero essere applicati costi per l\'utilizzo dei dati." "Riprendi" "Nessuna connessione" "Wi-Fi connesso" @@ -347,7 +347,7 @@ "Ricerca" "Su per %s." "A sinistra per %s." - "Non verrai disturbato da suoni e vibrazioni, ad eccezione di sveglie, promemoria, eventi e chiamate da contatti da te specificati." + "Non ti disturberanno: suoni e vibrazioni, ad eccezione di sveglie, promemoria, eventi e chiamate da contatti da te specificati." "Personalizza" "Verranno bloccati TUTTI i suoni e le vibrazioni, anche di sveglie, musica, video e giochi. Potrai ancora telefonare." "Verranno bloccati TUTTI i suoni e le vibrazioni, anche di sveglie, musica, video e giochi." @@ -406,6 +406,7 @@ "Il dispositivo potrebbe essere monitorato" "Il profilo potrebbe essere monitorato" "La rete potrebbe essere monitorata" + "La rete potrebbe essere monitorata" "Monitoraggio del dispositivo" "Monitoraggio del profilo" "Monitoraggio rete" @@ -418,6 +419,7 @@ "VPN" "Sei connesso a %1$s, da cui è possibile monitorare la tua attività di rete, inclusi email, app e siti web." "Sei connesso a %1$s, da cui è possibile monitorare la tua attività di rete personale, inclusi email, app e siti web." + "Sei collegato a %1$s, che consente di monitorare la tua attività di rete personale, inclusi siti web, email e app." "Il tuo profilo di lavoro è gestito da %1$s. È connesso a %2$s, da cui è possibile monitorare la tua attività di rete lavorativa, inclusi email, app e siti web.\n\nPer ulteriori informazioni, contatta il tuo amministratore." "Il tuo profilo di lavoro è gestito da %1$s. È connesso a %2$s, da cui è possibile monitorare la tua attività di rete lavorativa, inclusi email, app e siti web.\n\nSei connesso anche a %3$s, da cui è possibile monitorare la tua attività di rete personale." "Il tuo dispositivo è gestito da %1$s.\n\nL\'amministratore può monitorare e gestire impostazioni, accesso aziendale, app e dati associati al dispositivo, incluse le informazioni sulla posizione del dispositivo.\n\nSei connesso a %2$s, da cui è possibile monitorare la tua attività di rete, inclusi email, app e siti web.\n\nPer ulteriori informazioni, contatta l\'amministratore." @@ -494,8 +496,6 @@ "Mostra i secondi nell\'orologio nella barra di stato. Ciò potrebbe ridurre la durata della carica della batteria." "Riorganizza Impostazioni rapide" "Mostra luminosità in Impostazioni rapide" - "Attiva Schermo diviso mediante scorrimento verso l\'alto" - "Consente di attivare la modalità Schermo diviso scorrendo verso l\'alto dal pulsante Panoramica" "Sperimentali" "Attivare il Bluetooth?" "Per connettere la tastiera al tablet, devi prima attivare il Bluetooth." @@ -653,4 +653,5 @@ "Apri le impostazioni %s." "Modifica l\'ordine delle impostazioni." "Pagina %1$d di %2$d" + "Le notifiche non possono essere disattivate o bloccate" diff --git a/packages/SystemUI/res/values-it/strings_car.xml b/packages/SystemUI/res/values-it/strings_car.xml index ae26c9e102bdc47152ecf4b851e12edf4fdf5a58..19c4e2b02ad01e7067f4db3c360aa7fc522953e1 100644 --- a/packages/SystemUI/res/values-it/strings_car.xml +++ b/packages/SystemUI/res/values-it/strings_car.xml @@ -20,5 +20,5 @@ "Guida in modo sicuro" - "È necessario essere sempre pienamente coscienti delle condizioni di guida e rispettare le leggi vigenti. Le indicazioni stradali potrebbero essere imprecise, incomplete, pericolose, non adatte, vietate o implicare l\'attraversamento di confini. Anche le informazioni sulle attività commerciali potrebbero essere imprecise o incomplete. I dati non vengono forniti in tempo reale e non è possibile garantire la precisione della geolocalizzazione. Non maneggiare il dispositivo mobile e non utilizzare app non progettate per Android Auto durante la guida." + "È necessario essere sempre pienamente informati sulle condizioni della strada e rispettare la legislazione vigente. Le indicazioni stradali potrebbero essere imprecise, incomplete, pericolose, inadatte, vietate o richiedere l\'attraversamento di aree amministrative. Anche le informazioni sugli esercizi commerciali potrebbero essere imprecise o incomplete. I dati forniti non sono aggiornati in tempo reale e non è possibile garantire la precisione della geolocalizzazione. Non maneggiare dispositivi mobili e app non destinate ad Android Auto durante la guida." diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 4cf48c2c73e696d732635c5a1ad647c826900583..19a94a3c53e39bc59a7d30f49be8c995001deee5 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -240,7 +240,7 @@ "‏השימוש בנתוני 4G מושהה" "השימוש בנתונים סלולריים מושהה" "השימוש בנתונים מושהה" - "מכיוון שהגעת למגבלת הנתונים שהגדרת, המכשיר השהה את השימוש בנתונים עד סוף התקופה.\n\nאם תמשיך, אתה עשוי לקבל חיובים מהספק." + "הגעת למגבלת הנתונים שהגדרת. אתה כבר לא משתמש בנתונים סלולריים.\n\nאם תמשיך, ייתכנו חיובים לשימוש בנתונים." "המשך" "אין חיבור לאינטרנט" "‏Wi-Fi מחובר" @@ -408,6 +408,7 @@ "ייתכן שהמכשיר נמצא במעקב" "ייתכן שהפרופיל נתון למעקב" "ייתכן שהרשת נמצאת במעקב" + "ייתכן שהרשת מנוטרת" "מעקב אחר מכשיר" "מעקב אחר פרופיל" "מעקב אחר פעילות ברשת" @@ -420,6 +421,7 @@ "VPN" "אתה מחובר לאפליקציה %1$s, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים." "אתה מחובר לאפליקציה %1$s, שיכולה לעקוב אחר הפעילות שלך ברשת הפרטית, כולל הודעות אימייל, אפליקציות ואתרים." + "אתה מחובר לאפליקציה %1$s, שיכולה לעקוב אחר הפעילות שלך ברשת הפרטית, כולל הודעות אימייל, אפליקציות ואתרים." "פרופיל העבודה שלך מנוהל על ידי %1$s. הוא מחובר לאפליקציה %2$s, שיכולה לעקוב אחר הפעילות שלך ברשת העסקית, כולל הודעות אימייל, אפליקציות ואתרים.\n\nלמידע נוסף, פנה למנהל המערכת שלך." "פרופיל העבודה שלך מנוהל על ידי %1$s. הוא מחובר לאפליקציה %2$s, שיכולה לעקוב אחר הפעילות שלך ברשת העסקית, כולל הודעות אימייל, אפליקציות ואתרים.\n\nאתה מחובר גם לאפליקציה %3$s, שיכולה לעקוב אחר הפעילות שלך ברשת הפרטית." "המכשיר שלך מנוהל על ידי %1$s.\n\nמנהל המערכת שלך יכול לעקוב אחר הגדרות, גישה עסקית, אפליקציות, נתונים המשויכים למכשיר שלך ומידע על מיקום המכשיר, ולנהל אותם.\n\nאתה מחובר לאפליקציה %2$s, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים.\n\nלמידע נוסף, פנה למנהל המערכת שלך." @@ -496,8 +498,6 @@ "הצג שניות בשעון בשורת הסטטוס. פעולה זו עשויה להשפיע על אורך חיי הסוללה." "סידור מחדש של הגדרות מהירות" "הצג בהירות בהגדרות מהירות" - "הפעל מסך מפוצל על ידי תנועת החלקה כלפי מעלה" - "הפעל את התנועה לכניסה למסך מפוצל על ידי החלקה כלפי מעלה מלחצן הסקירה" "ניסיוניות" "‏האם להפעיל את ה-Bluetooth?" "‏כדי לחבר את המקלדת לטאבלט, תחילה עליך להפעיל את ה-Bluetooth." @@ -655,4 +655,5 @@ "פתיחת הגדרות של %s." "עריכת סדר ההגדרות." "דף %1$d מתוך %2$d" + "לא ניתן להשתיק או לחסום הודעות" diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index c42e34652ae38cf82097497976dfbf3df6bfb415..8d51fe635aa7e179847d5ce9282f3c775ac958d3 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -197,13 +197,13 @@ "機内モードがONです。" "機内モードをOFFにしました。" "機内モードをONにしました。" - "[通知を非表示]はONで、優先する通知のみです。" - "[通知を非表示]はONで、サイレントです。" - "[通知を非表示]はONで、アラームのみです。" - "通知を非表示" - "[通知を非表示]はOFFです。" - "[通知を非表示]をOFFにしました。" - "[通知を非表示]をONにしました。" + "マナーモードは ON で、優先する通知のみ許可します。" + "マナーモードは ON で、サイレント モードです。" + "マナーモードは ON で、アラームのみ許可します。" + "マナーモード" + "マナーモードは OFF です。" + "マナーモードを OFF にしました。" + "マナーモードを ON にしました。" "Bluetooth" "BluetoothがOFFです。" "BluetoothがONです。" @@ -240,7 +240,7 @@ "4Gデータは一時停止中です" "モバイルデータは一時停止中です" "データの一時停止" - "設定されたデータの上限に達したため、このサイクルの終了までこの端末でのデータの利用を一時停止しました。\n\n再開すると、携帯通信会社から課金される可能性があります。" + "設定されたデータの上限に達しているため、モバイルデータの使用を停止しました。\n\n再開すると、携帯通信会社からデータ使用量に応じた通信料を課金される可能性があります。" "再開" "インターネット未接続" "Wi-Fi接続済み" @@ -264,7 +264,7 @@ "デザートケース" "スクリーン セーバー" "イーサネット" - "通知を非表示" + "マナーモード" "優先する通知のみ" "アラームのみ" "サイレント" @@ -406,6 +406,7 @@ "端末が監視されている可能性があります" "プロファイルが監視されている可能性があります" "ネットワークが監視されている可能性があります" + "ネットワークが監視されている可能性があります" "端末の監視" "プロファイルの監視" "ネットワーク監視" @@ -418,6 +419,7 @@ "VPN" "%1$sに接続しています。このアプリはあなたのネットワークアクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。" "%1$sに接続しています。このアプリはあなたの個人のネットワークアクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。" + "「%1$s」に接続しています。このアプリはあなたの個人のネットワーク アクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。" "この仕事用プロファイルは%1$sによって管理され、%2$sに接続しています。このアプリはあなたの仕事のネットワークアクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。\n\n詳しくは管理者にお問い合わせください。" "この仕事用プロファイルは%1$sによって管理され、%2$sに接続しています。このアプリはあなたの仕事のネットワークアクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。\n\n%3$sにも接続しているため、個人のネットワークアクティビティも監視できます。" "この端末は%1$sによって管理されています。\n\n管理者は設定、コーポレートアクセス、アプリ、端末に関連付けられたデータ、端末の位置情報を監視、管理できます。\n\n%2$sに接続しているため、このアプリもネットワークアクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。\n\n詳しくは管理者にお問い合わせください。" @@ -494,8 +496,6 @@ "ステータスバーに時計の秒を表示します。電池使用量に影響する可能性があります。" "クイック設定を並べ替え" "クイック設定に明るさ調整バーを表示する" - "上にスワイプして分割画面に切り替える操作を有効にする" - "[概要] ボタンから上にスワイプして分割画面に切り替える操作を有効にします" "試験運用版" "BluetoothをONにしますか?" "タブレットでキーボードに接続するには、最初にBluetoothをONにする必要があります。" @@ -572,9 +572,9 @@ "YouTube" "カレンダー" "音量調節を表示" - "通知の非表示" + "マナーモード" "音量ボタンのショートカット" - "音量上げボタンで [通知を非表示] を OFF にする" + "音量上げボタンでマナーモードを OFF にする" "電池" "時計" "ヘッドセット" @@ -653,4 +653,5 @@ "%s の設定を開きます。" "設定の順序を編集します。" "ページ %1$d/%2$d" + "通知のサイレント設定やブロックはできません" diff --git a/packages/SystemUI/res/values-ka-rGE/strings.xml b/packages/SystemUI/res/values-ka-rGE/strings.xml index 6ddcde8ee767a6e4add5c6c9764709b77309ad58..258c90450e4824f67f05fa4c0bd71b77967238ae 100644 --- a/packages/SystemUI/res/values-ka-rGE/strings.xml +++ b/packages/SystemUI/res/values-ka-rGE/strings.xml @@ -238,7 +238,7 @@ "4G მონაცემები შეჩერებულია" "ფიჭური მონაცემები შეჩერებულია" "მონაცემები შეჩერებულია" - "რადგან თქვენი მონაცემების ლიმიტი ამოწურულია, მოწყობილობამ შეაჭერა მონაცემების გამოყენება დარჩენილი ციკლისათვის. \n\n შეჯამაბ შეიძლება გამოიწვიოს თქვენს პროვაიდერთან დამატებითი ხარჯები." + "მიღწეულია მონაცემთა მოხმარების თქვენ მიერ მითითებული ლიმიტი. ამიტომ, მობილური ინტერნეტის გამოყენება აღარ ხდება.\n\nგანახლების შემთხვევაში, შეიძლება მობილური ინტერნეტის საფასურის გადახდა მოგიწიოთ." "გაგრძელება" "ინტერნეტ კავშირი არ არის" "Wi-Fi დაკავშირებულია" @@ -404,6 +404,7 @@ "შესაძლოა მოწყობილობის მონიტორინგი არ ხორციელდება" "შესაძლოა პროფილზე ხორციელდებოდეს მონიტორინგი" "შესაძლოა ქსელზე ხორციელდება მონიტორინგი" + "ქსელზე შესაძლოა მონიტორინგი ხორციელდებოდეს" "მოწყობილობის მონიტორინგი" "პროფილის მონიტორინგი" "ქსელის მონიტორინგი" @@ -416,6 +417,7 @@ "VPN" "თქვენ დაუკავშირდით %1$s-ს, რომელსაც შეუძლია თქვენი ქსელის აქტივობის, მათ შორის, ელფოსტის, აპებისა და ვებსაიტების მონიტორინგი." "თქვენ დაუკავშირდით %1$s-ს, რომელსაც შეუძლია თქვენი პირადი ქსელის აქტივობის, მათ შორის, ელფოსტის, აპებისა და ვებსაიტების მონიტორინგი." + "თქვენ დაუკავშირდით %1$s-ს, რომელსაც თქვენი პირადი ქსელის აქტივობის მონიტორინგი შეუძლია, მათ შორის, ელფოსტის, აპებისა და ვებსაიტების." "თქვენი სამუშაო პროფილი %1$s-ის მიერ იმართება. ის დაკავშირებულია %2$s-თან, რომელსაც შეუძლია თქვენი სამსახურის ქსელის აქტივობის, მათ შორის, ელფოსტის, აპებისა და ვებსაიტების მონიტორინგი.\n\nდამატებითი ინფორმაციისთვის მიმართეთ თქვენს ადმინისტრატორს." "თქვენი სამუშაო პროფილი %1$s-ის მიერ იმართება. ის დაკავშირებულია %2$s-თან, რომელსაც შეუძლია თქვენი სამსახურის ქსელის აქტივობის, მათ შორის, ელფოსტის, აპებისა და ვებსაიტების მონიტორინგი.\n\nასევე, დაკავშირებული ხართ %3$s-თან, რომელსაც შეუძლია თქვენი პირადი ქსელის აქტივობის მონიტორინგი." "თქვენს მოწყობილობას მართავს %1$s.\n\nადმინისტრატორს შეუძლია თქვენი მოწყობილობასთან ასოცირებული პარამეტრების, კორპორატიული წვდომის, აპებისა და მონაცემების, და ასევე მოწყობილობის მდებარეობის ინფორმაციის მონიტორინგი და მართვა.\n\nთქვენ დაკავშირებული ხართ %2$s-თან, რომელსაც შეუძლია თქვენი ქსელის აქტივობის, მათ შორის, ელფოსტის, აპებისა და ვებ-საიტების მონიტორინგი.\n\nდამატებითი ინფორმაციისათვის, დაუკავშირდით თქვენს ადმინისტრატორს." @@ -492,8 +494,6 @@ "საათის წამების ჩვენება სტატუსის ზოლში. შეიძლება გავლენა იქონიოს ბატარეაზე." "სწრაფი პარამეტრების გადაწყობა" "სიკაშკაშის ჩვენება სწრაფ პარამეტრებში" - "ზემოთ გადაფურცვლისას ეკრანის გაყოფის ჟესტის ჩართვა" - "მიმოხილვის ღილაკიდან ზემოთ გადაფურცვლისას ეკრანის გაყოფის რეჟიმზე გადასვლის ჟესტის ჩართვა" "ექსპერიმენტული" "გსურთ Bluetooth-ის ჩართვა?" "კლავიატურის ტაბლეტთან დასაკავშირებლად, ჯერ უნდა ჩართოთ Bluetooth." @@ -651,4 +651,5 @@ "%s პარამეტრების გახსნა." "პარამეტრების მიმდევრობის რედაქტირება." "გვერდი %1$d / %2$d-დან" + "შეტყობინებების გაჩუმება ან დაბლოკვა ვერ მოხერხდება" diff --git a/packages/SystemUI/res/values-kk-rKZ/strings.xml b/packages/SystemUI/res/values-kk-rKZ/strings.xml index 2c444e46f5ed775c5d0cec15a0101ccae22d7011..25ede612d22dc400900ccb330924397c6972e0bf 100644 --- a/packages/SystemUI/res/values-kk-rKZ/strings.xml +++ b/packages/SystemUI/res/values-kk-rKZ/strings.xml @@ -238,7 +238,7 @@ "4G деректері кідіртілді" "Ұялы деректер кідіртілді" "Деректер кідіртілді" - "Орнатылған деректер шегіне жеткендіктен, құрылғы осы циклдың қалған бөлігі бойы деректерді пайдалануды кідіртті.\n\nЖалғастыру оператор ақыларына әкелуі мүмкін." + "Белгіленген деректер шегіне жеттіңіз. Ұялы деректер енді пайдаланылмайды.\n\nЕгер жалғастырсаңыз, деректер трафигі үшін ақы алынуы мүмкін." "Жалғастыру" "Интернет байланысы жоқ" "Wi-Fi қосулы" @@ -404,6 +404,7 @@ "Құрылғы бақылануы мүмкін" "Профиль бақылануы мүмкін" "Желі бақылауда болуы мүмкін" + "Желі бақылауда болуы мүмкін" "Құрылғыны бақылау" "Профильді бақылау" "Желіні бақылау" @@ -416,6 +417,7 @@ "VPN" "Сіз желідегі белсенділігіңізді, соның ішінде электрондық пошталарды, қолданбаларды және веб-сайттарды бақылай алатын %1$s қолданбасына қосылғансыз." "Сіз жеке желідегі белсенділігіңізді, соның ішінде электрондық пошталарды, қолданбаларды және веб-сайттарды бақылай алатын %1$s қолданбасына қосылғансыз." + "Жеке желідегі әрекеттеріңізді, соның ішінде электрондық пошта хабарларын, қолданбаларды және вебсайттарды бақылай алатын %1$s қолданбасына қосылғансыз." "Жұмыс профиліңізді %1$s басқарады. Ол жұмыс кезінде желідегі белсенділігіңізді, соның ішінде электрондық пошталарды, қолданбаларды және веб-сайттарды бақылай алатын %2$s қолданбасына қосылған.\n\nҚосымша ақпарат алу үшін әкімшіге хабарласыңыз." "Жұмыс профиліңізді %1$s басқарады. Ол желідегі белсенділігіңізді, соның ішінде электрондық пошталарды, қолданбаларды және веб-сайттарды бақылай алатын %2$s қолданбасына қосылған.\n\nСондай-ақ сіз желідегі жеке белсенділігіңізді бақылай алатын %3$s қолданбасына қосылғансыз." "Құрылғыңызды %1$s басқарады.\n\nӘкімші параметрлерді, корпоративтік рұқсатты, қолданбаларды, құрылғыңызбен байланысты деректерді және құрылғының орны туралы ақпаратты бақылай және басқара алады.\n\nСіз желідегі белсенділігіңізді, соның ішінде электрондық пошталарды, қолданбаларды және евб-сайттарды бақылай алатын %2$s қолданбасына қосылғансыз.\n\nҚосымша ақпарат алу үшін әкімшіге хабарласыңыз." @@ -492,8 +494,6 @@ "Күйін көрсету жолағында сағат секундтарын көрсету. Батареяның қызмет көрсету мерзіміне әсер етуі мүмкін." "Жылдам параметрлерді қайта реттеу" "Жылдам параметрлерде жарықтықты көрсету" - "Бөлінген экранда жоғары қарай сырғыту қимылын қосу" - "\"Шолу\" түймесінен жоғары қарай жанау арқылы бөлінген экранға кіру қимылын қосу" "Эксперименттік" "Bluetooth функциясын қосу керек пе?" "Пернетақтаны планшетке қосу үшін алдымен Bluetooth функциясын қосу керек." @@ -651,4 +651,5 @@ "%s параметрлерін ашу." "Параметрлер тәртібін өзгерту." "%2$d ішінен %1$d" + "Хабарландыруды үнсіз режимге қою не бөгеу мүмкін емес" diff --git a/packages/SystemUI/res/values-km-rKH/strings.xml b/packages/SystemUI/res/values-km-rKH/strings.xml index 0db7abc73b644ad459f0f29fa78e94fe2d78f44a..f839eb648181cfa4909e48f3aa44ac5dd6b6e044 100644 --- a/packages/SystemUI/res/values-km-rKH/strings.xml +++ b/packages/SystemUI/res/values-km-rKH/strings.xml @@ -238,7 +238,7 @@ "ទិន្នន័យ 4G ត្រូវបានផ្អាក" "ទិន្នន័យចល័តត្រូវបានផ្អាក" "ទិន្នន័យត្រូវបានផ្អាក" - "ដោយសារទិន្នន័យរបស់អ្នកបានឈានដល់កំណត់ ឧបករណ៍នេះបានផ្អាកការប្រើប្រាស់ទិន្នន័យសម្រាប់ការរំលឹកនៃវគ្គនេះ។\n\nការបន្តប្រើប្រាស់អាចនាំឲ្យមានការគិតប្រាក់ពីក្រុមហ៊ុនផ្តល់សេវាកម្ម។" + "បានឈានដល់កម្រិតទិន្នន័យដែលអ្នកបានកំណត់ហើយ។ ឥឡូវ​អ្នកមិនប្រើទិន្នន័យចល័តទៀតទេ។\n\nអាចនឹងគិតថ្លៃលើការប្រើទិន្នន័យ ប្រសិនបើអ្នកបន្តប្រើឡើងវិញ។" "បន្ត" "គ្មាន​ការ​តភ្ជាប់​អ៊ីនធឺណិត" "បាន​ភ្ជាប់​វ៉ាយហ្វាយ" @@ -404,6 +404,7 @@ "ឧបករណ៍​អាច​ត្រូវ​បាន​ត្រួតពិនិត្យ" "ប្រវត្តិរូបអាចត្រូវបានតាមដាន" "បណ្ដាញ​អាច​ត្រូវ​បាន​ត្រួតពិនិត្យ" + "បណ្ដាញអាចត្រូវបានត្រួតពិនិត្យ" "ការ​ត្រួតពិនិត្យ​ឧបករណ៍" "តាមដានប្រវត្ថិរូប" "ការ​ត្រួតពិនិត្យ​បណ្ដាញ" @@ -416,6 +417,7 @@ "VPN" "អ្នកត្រូវបានតភ្ជាប់ទៅ %1$s ដែលអាចឃ្លាំមើលសកម្មភាពបណ្តាញរបស់អ្នក រាប់បញ្ចូលទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រ។" "អ្នកត្រូវបានតភ្ជាប់ទៅ %1$s ដែលអាចឃ្លាំមើលសកម្មភាពបណ្តាញរបស់អ្នក រាប់បញ្ចូលទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រ។" + "អ្នកត្រូវបានភ្ជាប់ទៅ %1$s ដែលអាចឃ្លាំមើលសកម្មភាពបណ្តាញរបស់អ្នក រាប់បញ្ចូលទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រ។" "ប្រវត្តិរូបការងាររបស់អ្នកត្រូវបានគ្រប់គ្រងដោយ %1$s។ វាត្រូវបានតភ្ជាប់ទៅនឹង %2$s ដែលអាចឃ្លាំមើលសកម្មភាពបណ្តាញរបស់អ្នក រាប់បញ្ចូលទាំងអ៊ីមែល កម្មវិធី គេហទំព័រ។\n\nសម្រាប់ព័ត៌មានបន្ថែម សូមទាក់ទងអ្នកគ្រប់គ្រប់របស់អ្នក។" "ប្រវត្តិរូបការងាររបស់អ្នកត្រូវបានគ្រប់គ្រងដោយ %1$s។ វាត្រូវបានតភ្ជាប់ទៅនឹង %2$s ដែលអាចឃ្លាំមើលសកម្មភាពបណ្តាញរបស់អ្នក រាប់បញ្ចូលទាំងអ៊ីមែល កម្មវិធី គេហទំព័រ។\n\nអ្នកក៏ត្រូវបានតភ្ជាប់ផងដែរទៅនឹង %3$s ដែលអាចឃ្លាំមើលសកម្មភាពបណ្តាញផ្ទាល់ខ្លួនរបស់អ្នក។" "ឧបករណ៍របស់អ្នកត្រូវបានគ្រប់គ្រងដោយ %1$s.\n\nអ្នកគ្រប់គ្រងរបស់អ្នកអាចឃ្លាំមើល និងគ្រប់គ្រងការកំណត់ ការចូលប្រើជាក្រុម កម្មវិធី ទិន្នន័យដែលជាប់ទាក់ទងនឹងឧបករណ៍របស់អ្នក និងព័ត៌មានទីតាំងនៃឧបករណ៍របស់អ្នក។\n\nអ្នកត្រូវបានភ្ជាប់ជាមួយ %2$s ដែលវាអាចឃ្លាំមើលសកម្មភាពបណ្តាញរបស់អ្នក រួមបញ្ចូលទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រ។\n\nសម្រាប់ព័ត៌មានបន្ថែម សូមទាក់ទងអ្នកគ្រប់គ្រងរបស់អ្នក។" @@ -492,8 +494,6 @@ "បង្ហាញវិនាទីនៅលើរបារស្ថានភាពអាចនឹងប៉ះពាល់ដល់ថាមពលថ្ម។" "រៀបចំការកំណត់រហ័សឡើងវិញ" "បង្ហាញកម្រិតពន្លឺនៅក្នុងការកំណត់រហ័ស" - "បើកដំណើរការកាយវិការអូសទៅលើដើម្បីបំបែកអេក្រង់" - "បើកដំណើរការកាយវិការដើម្បីបំបែកអេក្រង់ដោយអូសទៅលើចាប់ពីប៊ូតុងទិដ្ឋភាព" "ពិសោធន៍" "បើកប៊្លូធូសឬ?" "ដើម្បីភ្ជាប់ក្តារចុចរបស់អ្នកជាមួយនឹងថេប្លេតរបស់អ្នក អ្នកត្រូវតែបើកប៊្លូធូសជាមុនសិន។" @@ -651,4 +651,5 @@ "បើការកំណត់ %s" "កែលំដាប់ការកំណត់" "ទំព័រ %1$d នៃ %2$d" + "ការជូនដំណឹងមិនអាចបិទសំឡេង ឬរារាំងបានទេ" diff --git a/packages/SystemUI/res/values-kn-rIN/strings.xml b/packages/SystemUI/res/values-kn-rIN/strings.xml index c62a8db9cb45c9549ba66722debf6d5b019bac2f..8d9b2dd546b51e18730510b4cfd4ad135f8d42f3 100644 --- a/packages/SystemUI/res/values-kn-rIN/strings.xml +++ b/packages/SystemUI/res/values-kn-rIN/strings.xml @@ -84,7 +84,7 @@ "ಮುಖಪುಟ" "ಮೆನು" "ಸಮಗ್ರ ನೋಟ" - "ಹುಡುಕು" + "ಹುಡುಕಿ" "ಕ್ಯಾಮರಾ" "ಫೋನ್" "ಧ್ವನಿ ಸಹಾಯಕ" @@ -238,7 +238,7 @@ "4G ಡೇಟಾ ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ" "ಸೆಲ್ಯುಲಾರ್ ಡೇಟಾ ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ" "ಡೇಟಾ ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ" - "ಏಕೆಂದರೆ ನಿಮ್ಮ ಹೊಂದಾಣಿಕೆ ಡೇಟಾ ಮೀತಿಯನ್ನು ತಲುಪಿದೆ, ಈ ಆವರ್ತನೆಯ ಉಳಿದ ಭಾಗಕ್ಕೆ ಸಾಧನವು ಡೇಟಾ ಬಳಕೆಯನ್ನು ವಿರಾಮಗೊಳಿಸಿದೆ.\n\nಮುಂದುವರೆಯುವಿಕೆಯು ನಿಮ್ಮ ವಾಹಕದ ಶುಲ್ಕಗಳಿಗೆ ಕಾರಣವಾಗಬಹುದು." + "ನೀವು ಹೊಂದಿಸಿರುವ ಡೇಟಾ ಮಿತಿ ತಲುಪಿದೆ. ನೀವು ಎಂದಿಗೂ ಸೆಲ್ಯುಲಾರ್ ಡೇಟಾವನ್ನು ಬಳಸದೆ ಇರಬಹುದು.\n\nನೀವು ಮುಂದುವರಿಸಿದರೆ, ಡೇಟಾ ಬಳಕೆಗೆ ಶುಲ್ಕಗಳು ಅನ್ವಯವಾಗಬಹುದು." "ಮುಂದುವರಿಸು" "ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕವಿಲ್ಲ" "ವೈ-ಫೈ ಸಂಪರ್ಕಗೊಂಡಿದೆ" @@ -404,6 +404,7 @@ "ಸಾಧನವನ್ನು ಪರಿವೀಕ್ಷಿಸಬಹುದಾಗಿದೆ" "ಪ್ರೊಫೈಲ್ ಅನ್ನು ಪರಿವೀಕ್ಷಿಸಬಹುದಾಗಿದೆ" "ನೆಟ್‌ವರ್ಕ್ ಅನ್ನು ವೀಕ್ಷಿಸಬಹುದಾಗಿ" + "ನೆಟ್‌ವರ್ಕ್ ಅನ್ನು ವೀಕ್ಷಿಸಬಹುದಾಗಿರುತ್ತದೆ" "ಸಾಧನ ಪರಿವೀಕ್ಷಣೆ" "ಪ್ರೊಫೈಲ್ ಮೇಲ್ವಿಚಾರಣೆ" "ನೆಟ್‌ವರ್ಕ್‌ ಪರಿವೀಕ್ಷಣೆ" @@ -416,6 +417,7 @@ "VPN" "ನೀವು ಇಮೇಲ್‌ಗಳು, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಮತ್ತು ವೆಬ್‌ಸೈಟ್‌ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ನೆಟ್‌ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ %1$s ಗೆ ಸಂಪರ್ಕಗೊಂಡಿರುವಿರಿ." "ನೀವು ಇಮೇಲ್‌ಗಳು, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಮತ್ತು ವೆಬ್‌ಸೈಟ್‌ಗಳು ಸೇರಿದಂತೆ ನಿಮ್ಮ ವೈಯಕ್ತಿಕ ನೆಟ್‌ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ %1$s ಗೆ ಸಂಪರ್ಕಗೊಂಡಿರುವಿರಿ." + "ನೀವು ಇಮೇಲ್‌ಗಳು, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು, ಮತ್ತು ವೆಬ್‌ಸೈಟ್‌ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ವೈಯಕ್ತಿಕ ನೆಟ್‌ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ %1$s ಗೆ ಸಂಪರ್ಕಗೊಂಡಿರುವಿರಿ." "ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್‌ ಅನ್ನು %1$s ಮೂಲಕ ನಿರ್ವಹಿಸಲಾಗುತ್ತಿದೆ. ಇದು ಇಮೇಲ್‌ಗಳು, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು, ಮತ್ತು ವೆಬ್‌ಸೈಟ್‌ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ಕೆಲಸದ ನೆಟ್‌ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ %2$s ಗೆ ಸಂಪರ್ಕಗೊಂಡಿದೆ.\n\nಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ, ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ." "ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್‌ ಅನ್ನು %1$s ಮೂಲಕ ನಿರ್ವಹಿಸಲಾಗುತ್ತಿದೆ. ಇದು ಇಮೇಲ್‌ಗಳು, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು, ಮತ್ತು ವೆಬ್‌ಸೈಟ್‌ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ಕೆಲಸದ ನೆಟ್‌ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ %2$s ಗೆ ಸಂಪರ್ಕಿತಗೊಂಡಿದೆ.\n\nನೀವು ಕೂಡಾ ವೈಯಕ್ತಿಕ ನೆಟ್‌ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ %3$s ಗೆ ಸಂಪರ್ಕಿತಗೊಂಡಿರುವಿರಿ." "ನಿಮ್ಮ ಸಾಧನವನ್ನು %1$s ಮೂಲಕ ನಿರ್ವಹಿಸಲಾಗುತ್ತಿದೆ.\n\nನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಸೆಟ್ಟಿಂಗ್‌ಗಳು, ಕಾರ್ಪೊರೇಟ್ ಪ್ರವೇಶ, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಹಾಗೂ ನಿಮ್ಮ ಸಾಧನದೊಂದಿಗೆ ಸಂಬಂಧಿಸಿದ ಡೇಟಾ ಮತ್ತು ನಿಮ್ಮ ಸಾಧನದ ಸ್ಥಳ ಮಾಹಿತಿಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು ಮತ್ತು ನಿರ್ವಹಿಸಬಹುದು.\n\nಇಮೇಲ್‌ಗಳು, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಮತ್ತು ವೆಬ್‌ಸೈಟ್‌ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ನೆಟ್‌ವರ್ಕ್ ಚಟುವಟಿಕೆಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ %2$s ಗೆ ಸಂಪರ್ಕಿತಗೊಂಡಿರುವಿರಿ.\n\nಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ, ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ." @@ -492,8 +494,6 @@ "ಸ್ಥಿತಿ ಪಟ್ಟಿಯಲ್ಲಿ ಗಡಿಯಾರ ಸೆಕೆಂಡುಗಳನ್ನು ತೋರಿಸು. ಇದಕ್ಕೆ ಬ್ಯಾಟರಿ ಬಾಳಿಕೆಯು ಪರಿಣಾಮಬೀರಬಹುದು." "ತ್ವರಿತ ಸೆಟ್ಟಿಂಗ್‌‌ಗಳನ್ನು ಮರುಹೊಂದಿಸಿ" "ತ್ವರಿತ ಸೆಟ್ಟಿಂಗ್‌‌ಗಳಲ್ಲಿ ಪ್ರಖರತೆಯನ್ನು ತೋರಿಸಿ" - "ಸ್ಪ್ಲಿಟ್-ಸ್ಕ್ರೀನ್ ಸ್ವೈಪ್-ಅಪ್ ಗೆಶ್ಚರ್ ಸಕ್ರಿಯಗೊಳಿಸಿ" - "ಸಮಗ್ರ ನೋಟದ ಬಟನ್‌ನಿಂದ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ ಸ್ಪ್ಲಿಟ್‌-ಸ್ಕ್ರೀನ್ ನಮೂದಿಸಲು ಗೆಸ್ಚರ್‌ ಸಕ್ರಿಯಗೊಳಿಸಿ" "ಪ್ರಾಯೋಗಿಕ" "ಬ್ಲೂಟೂತ್ ಆನ್ ಮಾಡುವುದೇ?" "ನಿಮ್ಮ ಕೀಬೋರ್ಡ್ ಅನ್ನು ಟ್ಯಾಬ್ಲೆಟ್‌ಗೆ ಸಂಪರ್ಕಿಸಲು, ನೀವು ಮೊದಲು ಬ್ಲೂಟೂತ್ ಆನ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ." @@ -593,8 +593,8 @@ "ಬಟನ್ ಸೇರಿಸು" "ಉಳಿಸು" "ಮರುಹೊಂದಿಸು" - "ಯಾವುದೇ ಹೋಮ್ ಬಟನ್ ಕಂಡುಬಂದಿಲ್ಲ" - "ಈ ಸಾಧನವನ್ನು ನ್ಯಾವಿಗೇಟ್ ಮಾಡಲು ಹೋಮ್ ಬಟನ್ ಅಗತ್ಯವಿರುತ್ತದೆ. ಉಳಿಸುವ ಮೊದಲು ದಯವಿಟ್ಟು ಹೋಮ್ ಬಟನ್ ಸೇರಿಸಿ." + "ಯಾವುದೇ ಮುಖಪುಟ ಬಟನ್ ಕಂಡುಬಂದಿಲ್ಲ" + "ಈ ಸಾಧನವನ್ನು ನ್ಯಾವಿಗೇಟ್ ಮಾಡಲು ಮುಖಪುಟ ಬಟನ್ ಅಗತ್ಯವಿರುತ್ತದೆ. ಉಳಿಸುವ ಮೊದಲು ದಯವಿಟ್ಟು ಮುಖಪುಟ ಬಟನ್ ಸೇರಿಸಿ." "ಬಟನ್ ಅಳತೆ ಹೊಂದಿಸು" "ಕ್ಲಿಪ್‌ಬೋರ್ಡ್" "ಐಟಂಗಳನ್ನು ನೇರವಾಗಿ ಕ್ಲಿಪ್‌ಬೋರ್ಡ್‌ಗೆ ಡ್ರ್ಯಾಗ್ ಮಾಡಲು ಕ್ಲಿಪ್‌ಬೋರ್ಡ್ ಅನುಮತಿಸುತ್ತದೆ. ಐಟಂಗಳು ಅಸ್ತಿತ್ವದಲ್ಲಿರುವಾಗ ಅವುಗಳನ್ನು ಕ್ಲಿಪ್‌ಬೋರ್ಡ್‌ನಿಂದ ನೇರವಾಗಿ ಹೊರಗೆ ಹಾಕಬಹುದಾಗಿರುತ್ತದೆ." @@ -651,4 +651,5 @@ "%s ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೆರೆಯಿರಿ." "ಸೆಟ್ಟಿಂಗ್‌ಗಳ ಕ್ರಮವನ್ನು ಎಡಿಟ್ ಮಾಡಿ." "%2$d ರಲ್ಲಿ %1$d ಪುಟ" + "ಸೂಚನೆಗಳನ್ನು ಮೌನವಾಗಿಸಲಾಗುವುದಿಲ್ಲ ಅಥವಾ ತಡೆಹಿಡಿಯಲಾಗುವುದಿಲ್ಲ" diff --git a/packages/SystemUI/res/values-kn-rIN/strings_tv.xml b/packages/SystemUI/res/values-kn-rIN/strings_tv.xml index 5afb322d3ea675a23d9b185508328526c8499f25..edaa8e60a444645591f8166fc513305a057db2e5 100644 --- a/packages/SystemUI/res/values-kn-rIN/strings_tv.xml +++ b/packages/SystemUI/res/values-kn-rIN/strings_tv.xml @@ -25,7 +25,7 @@ "ವಿರಾಮ" "PIP ನಿಯಂತ್ರಿಸಲು ""HOME"" ಕೀಯನ್ನು ಹಿಡಿದುಕೊಳ್ಳಿ" "ಚಿತ್ರದಲ್ಲಿ ಚಿತ್ರ" - "ನೀವು ಮತ್ತೊಂದನ್ನು ಪ್ಲೇ ಮಾಡುವ ತನಕ ಇದು ನಿಮ್ಮ ವೀಡಿಯೋವನ್ನು ವೀಕ್ಷಣೆಯಲ್ಲಿರಿಸುತ್ತದೆ. ಅದನ್ನು ನಿಯಂತ್ರಿಸಲು ""ಹೋಮ್"" ಅನ್ನು ಒತ್ತಿ ಹಿಡಿಯಿರಿ." + "ನೀವು ಮತ್ತೊಂದನ್ನು ಪ್ಲೇ ಮಾಡುವ ತನಕ ಇದು ನಿಮ್ಮ ವೀಡಿಯೋವನ್ನು ವೀಕ್ಷಣೆಯಲ್ಲಿರಿಸುತ್ತದೆ. ಅದನ್ನು ನಿಯಂತ್ರಿಸಲು ""ಮುಖಪುಟ"" ಅನ್ನು ಒತ್ತಿ ಹಿಡಿಯಿರಿ." "ಅರ್ಥವಾಯಿತು" "ವಜಾಗೊಳಿಸಿ" diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 3c08e923c7ff707a85695c3e50b1fdec79c24afe..b3f121c359b5b4b5dffadcec0059993d5faf1aec 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -240,7 +240,7 @@ "4G 데이터 사용 중지됨" "모바일 데이터 사용 중지됨" "데이터 사용 중지됨" - "설정된 데이터 한도에 도달했기 때문에 기기에서 사이클의 나머지 기간 동안 데이터 사용을 일시 중지했습니다. \n\n데이터 사용을 재개하면 이동통신사 요금이 청구될 수 있습니다." + "설정한 데이터 한도에 도달했습니다. 더 이상 모바일 데이터를 사용하지 않습니다.\n\n계속 사용하면 데이터 사용 요금이 부과될 수 있습니다." "재개" "인터넷에 연결되지 않음" "Wi-Fi 연결됨" @@ -406,6 +406,7 @@ "기기가 모니터링될 수 있음" "프로필이 모니터링될 수 있음" "네트워크가 모니터링될 수 있음" + "네트워크가 모니터링될 수 있음" "기기 모니터링" "프로필 모니터링" "네트워크 모니터링" @@ -418,6 +419,7 @@ "VPN" "%1$s에 연결되었습니다. 이 앱은 이메일, 앱, 웹사이트와 같은 내 네트워크 활동을 모니터링할 수 있습니다." "%1$s에 연결되었습니다. 이 앱은 이메일, 앱, 웹사이트와 같은 내 네트워크 활동을 모니터링할 수 있습니다." + "%1$s에 연결되었습니다. 이 앱은 이메일, 앱, 웹사이트와 같은 내 개인 네트워크 활동을 모니터링할 수 있습니다." "직장 프로필은 %1$s에서 관리합니다. 이는 %2$s에 연결되어 있으며 여기에서 이메일, 앱, 웹사이트와 같은 직장 네트워크 활동을 모니터링할 수 있습니다.\n\n자세한 내용은 관리자에게 문의하세요." "직장 프로필은 %1$s에서 관리합니다. 이는 %2$s에 연결되어 있으며 여기에서 이메일, 앱, 웹사이트와 같은 직장 네트워크 활동을 모니터링할 수 있습니다.\n\n또한 %3$s에 연결되어 있으며, 여기에서 내 개인 네트워크 활동을 모니터링할 수 있습니다." "%1$s에서 기기를 관리합니다.\n\n관리자는 설정, 기업 액세스, 앱, 기기와 연결된 데이터, 기기의 위치 정보를 모니터링하고 관리할 수 있습니다.\n\n%2$s에 연결되어 있으며 여기에서 이메일, 앱, 웹사이트와 같은 내 네트워크 활동을 모니터링할 수 있습니다.\n\n자세한 내용은 관리자에게 문의하세요." @@ -465,7 +467,7 @@ "충전 중이 아닌 경우 상태 표시줄 아이콘 내에 배터리 잔량 비율 표시" "빠른 설정" "상태 표시줄" - "개요" + "최근 사용" "데모 모드" "데모 모드 사용" "데모 모드 표시" @@ -494,8 +496,6 @@ "상태 표시줄에 시계 초 단위를 표시합니다. 배터리 수명에 영향을 줄 수도 있습니다." "빠른 설정 재정렬" "빠른 설정에서 밝기 표시" - "화면 분할 위로 스와이프 동작 사용" - "최근 사용 버튼에서 위로 스와이프하기 동작으로 창 분할 모드를 사용 설정합니다." "베타" "블루투스를 켜시겠습니까?" "키보드를 태블릿에 연결하려면 먼저 블루투스를 켜야 합니다." @@ -653,4 +653,5 @@ "%s 설정 열기" "설정 순서 수정" "%2$d페이지 중 %1$d페이지" + "알림을 무음으로 설정하거나 차단할 수 없습니다." diff --git a/packages/SystemUI/res/values-ky-rKG/strings.xml b/packages/SystemUI/res/values-ky-rKG/strings.xml index 7645b93795af66a3685949ebe8c58d4cd96c7b2f..cb404cb30a027c93581cbf7ea56eba609d5a7ea7 100644 --- a/packages/SystemUI/res/values-ky-rKG/strings.xml +++ b/packages/SystemUI/res/values-ky-rKG/strings.xml @@ -238,7 +238,7 @@ "4G дайындары тындырылды" "Уюлдук дайындар тындырылды" "Дайындар тындырылды" - "Киргизиле турган дайындар белгиленген эң жогорку чекке жеткендиктен, ушул мерчимдин калган бөлүгүндө түзмөгүңүздө дайындардын колдонулушу тындырылды.\n\nУлантсаңыз, байланыш операторуңузга акы төлөп калышыңыз мүмкүн." + "Трафик сиз койгон чекке жетти. Эми мобилдик дайындарды колдоно албайсыз.\n\nЭгер улантсаңыз, мобилдик дайындарды колдонгонуңуз үчүн акы алынышы мүмкүн." "Улантуу" "Интернет байланыш жок" "Wi-Fi байланышта" @@ -404,6 +404,7 @@ "Түзмөктү көзөмөлдөсө болот" "Профилди көзөмөлдөсө болот" "Тармак көзөмөлдөнүшү мүмкүн" + "Тармак көзөмөлдөнүшү мүмкүн" "Түзмөккө көз салуу" "Профилди көзөмөлдөө" "Тармакка көз салуу" @@ -416,6 +417,7 @@ "VPN" "Электрондук почта, колдонмолор жана вебсайттар сыяктуу тармактык аракеттерди көзөмөлдөй турган %1$s колдонмосуна туташып турасыз." "Электрондук почта, колдонмолор жана вебсайттар сыяктуу тармактагы жеке аракеттериңизди көзөмөлдөй турган %1$s колдонмосуна туташып турасыз." + "Электрондук почта, колдонмолор жана вебсайттар сыяктуу тармактагы жеке аракеттериңизди тескей турган %1$s колдонмосуна туташып турасыз." "Жумуш профилиңизди %1$s башкарат. Ал электрондук почта, колдонмолор жана вебсайттар сыяктуу жумуш тармагыңыздагы аракеттерди көзөмөлдөй турган %2$s менен туташкан.\n\nКөбүрөөк маалымат алуу үчүн администраторуңузга кайрылыңыз." "Жумуш профилиңизди %1$s башкарат. Ал электрондук почта, колдонмолор жана вебсайттар сыяктуу жумуш тармагыңыздагы аракеттерди көзөмөлдөй турган %2$s менен туташкан.\n\nМындан тышкары, тармактагы жеке аракеттериңизди көзөмөлдөгөн %3$s колдонмосуна туташып турасыз." "Түзмөгүңүздү %1$s башкарат.\nАдминистраторуңуз түзмөгүңүздөгү жөндөөлөрдү, корпоративдик мүмкүнчүлүктү, колдонмолорду, дайындарды, ошону менен катар жайгашкан жер дайындарын башкарып, тийиштүү маалыматты карай алат.\n\nСиз электрондук почталар, колдонмолор жана вебсайттар сыяктуу тармактагы аракеттериңизди тармактагы аракетиңизди тескей турган APPLICATION колдонмосуна туташып турасыз.\n%2$sКөбүрөөк маалымат алуу үчүн, администраторуңузга кайрылыңыз.\n\n" @@ -492,8 +494,6 @@ "Абал тилкесинен сааттын секунддары көрсөтүлсүн. Батареянын кубаты көбүрөөк сарпталышы мүмкүн." "Ыкчам жөндөөлөрдү кайра коюу" "Ыкчам жөндөөлөрдөн жарык деңгээлин көрсөтүү" - "Өйдө серпип экранды бөлүү жаңсоосун иштетүү" - "Сереп баскычынан өйдө серпип, экранды бөлүү режимин киргизүү үчүн жаңсоону иштетиңиз" "Сынамык" "Bluetooth күйгүзүлсүнбү?" "Баскычтобуңузду планшетиңизге туташтыруу үчүн, адегенде Bluetooth\'ту күйгүзүшүңүз керек." @@ -651,4 +651,5 @@ "%s жөндөөлөрүн ачуу." "Жөндөөлөрдүн иретин өзгөртүү." "%2$d ичинен %1$d-бет" + "Эскертмелердин үнүн басууга же бөгөттөөгө болбойт" diff --git a/packages/SystemUI/res/values-lo-rLA/strings.xml b/packages/SystemUI/res/values-lo-rLA/strings.xml index 6b1fca8d493bc8ee2109559ab11ffa1a3ebf03fb..76350ccf56c7690fc1470421ed9d39d9af55ed20 100644 --- a/packages/SystemUI/res/values-lo-rLA/strings.xml +++ b/packages/SystemUI/res/values-lo-rLA/strings.xml @@ -238,7 +238,7 @@ "ຂໍ້​ມູນ 4G ຢຸດ​ຊົ່ວ​ຄາວແລ້ວ" "ຂໍ້​ມູນເຊວ​ລູ​ລາຢຸດ​ຊົ່ວ​ຄາວແລ້ວ" "ຂໍ້​ມູນ​ຢຸດ​ຊົ່ວ​ຄາວແລ້ວ" - "ເນື່ອງ​ຈາກວ່າ​ຮອດ​ຂີດ​ຈຳ​ກັດ​ຂໍ້​ມູນ​ທີ່​ຕັ້ງ​ໄວ້​ຂອ​ງ​ທ່ານ​ແລ້ວ, ອຸ​ປະ​ກອນ​ຢຸດ​ການ​ນຳ​ໃຊ້​ຂໍ້​ມູນ​ສຳ​ລັບ​ສ່ວນ​ທີ່​ຍັງ​ເຫຼືອ​ຂອງ​ຮອບ​ວຽນ​ນີ້.\n\nການ​ເລີ່ມ​ຕໍ່​ອາດ​ຈະ​ນຳ​ໄປ​ສູ່​ການ​ປ່ຽນ​ແປງ​ຈາກ​ຜູ້​ໃຫ້​ບໍ​ລິ​ການ​ເຄືອ​ຂ່າຍ​ຂອງ​ທ່ານ." + "ທ່ານໃຊ້ອິນເຕີເນັດຮອດຈຳນວນທີ່ທ່ານຈຳກັດປະລິມານໄວ້ແລ້ວ. ທ່ານຈະບໍ່ນຳໃຊ້ການເຊື່ອມຕໍ່ຜ່ານເຄືອຂ່າຍມືຖືອີກຕໍ່ໄປ.\n\nຫາກທ່ານສືບຕໍ່ໃຊ້ໄປອີກ, ທ່ານອາດຖືກຮຽກເກັບເງິນຄ່າບໍລິການໄດ້." "ເລີ່ມຕໍ່" "ບໍ່ມີການເຊື່ອມຕໍ່ອິນເຕີເນັດ" "ເຊື່ອມ​ຕໍ່ Wi-​-Fi ແລ້ວ" @@ -404,6 +404,7 @@ "ອຸ​ປະ​ກອນ​ອາດ​ມີ​ການ​ເຝົ້າ​ຕິດ​ຕາມ" "ໂປຣ​ໄຟລ໌​ອາດ​ຖືກ​ເຝົ້າ​ຕິດ​ຕາມ​ຢູ່" "​ເຄືອ​ຂ່າຍ​ອາດ​ມີ​ການ​ເຝົ້າ​ຕິດ​ຕາມ" + "ການນຳໃຊ້ເຄືອຂ່າຍອາດມີການກວດສອບຕິດຕາມ" "ການກວດ​ສອບ​ຕິດ​ຕາມ​ອຸ​ປະ​ກອນ" "ການ​ຕິດ​ຕາມ​ໂປຣ​ໄຟລ໌" "ການກວດ​ສອບ​ຕິດ​ຕາມ​ເຄືອ​ຂ່າຍ" @@ -416,6 +417,7 @@ "VPN" "ທ່ານເຊື່ອມຕໍ່ກັບ %1$s, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍຂອງທ່ານ ລວມທັງອີເມວ, ​ແອັບ ແລະເວັບໄຊທ໌." "ທ່ານເຊື່ອມຕໍ່ກັບ %1$s, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍສ່ວນຕົວຂອງທ່ານ ລວມທັງອີເມວ, ​ແອັບ ແລະເວັບໄຊທ໌." + "ທ່ານເຊື່ອມຕໍ່ກັບ %1$s ແລ້ວ, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍສ່ວນຕົວຂອງທ່ານ ຮວມທັງອີເມວ, ​ແອັບ ແລະເວັບໄຊໄດ້." "ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານຖືກຄວບຄຸມໂດຍ %1$s. ມັນຖືກເຊື່ອມຕໍ່ກັບ %2$s, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍບ່ອນເຮັດວຽກຂອງທ່ານ ລວມທັງອີເມວ,​ ແອັບ ແລະເວັບໄຊທ໌.\n\nສຳລັບຂໍ້ມູນເພີ່ມເຕີມ, ໃຫ້ຕິດຕໍ່ຜູ້ບໍລິຫານຂອງທ່ານ." "ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານຖືກຈັດການໂດຍ %1$s. ມັນເຊື່ອມຕໍ່ກັບ %2$s, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍບ່ອນເຮັດວຽກຂອງທ່ານ ລວມທັງອີເມວ, ແອັບ ແລະເວັບໄຊທ໌.\n\nທ່ານເຊື່ອມຕໍ່ກັບ %3$s, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍສ່ວນຕົວຂອງທ່ານ." "ອຸ​ປະ​ກອນ​ຂອງ​ທ່ານ​ຖືກ​ຄຸ້ມ​ຄອງ​ໂດຍ %1$s.\n\nຜູ້​ຄວບ​ຄຸມຂອງ​ທ່ານ​ສາ​ມາດ​ຕິດ​ຕາມ​ກວດ​ກາ ​ແລະ​ການ​ຄຸ້ມ​ຄອງ​ການຕັ້ງ​ຄ່າ, ແອັບ​ການ​ເຂົ້າ​ຫາ​ບໍ​ລິ​ສັດ, ຂໍ້​ມູນ​ທີ່​ກ່ຽວ​ຂ້ອງ​ກັບ​ອຸ​ປະ​ກອນ​ຂອງ​ທ່ານ, ແລະ​ຂໍ້​ມູນທີ່​ຕັ້ງ​ຂອງອຸ​ປະ​ກອນ​ຂອງ​ທ່ານ.\n\nທ່ານ​ເຊື່ອມ​ຕໍ່​ກັບ %2$s ແລ້ວ, ເຊິ່ງ​ສາ​ມາດ​ຕິດ​ຕາມການ​ເຄື່ອນ​ໄຫວ​ເຄືອ​ຂ່າຍ​ຂອງ​ທ່ານ, ລວມ​ທັງ​ອີ​ເມວ, ແອັບ, ແລະ​ເວັບ​ໄຊ​ທ໌.\n\nສຳ​ລັບ​ຂໍ້​ມູນ​ເພີ່ມ​ເຕີມ, ຕິດ​ຕໍ່​ຜູ້​ຄວບ​ຄຸມ​ຂອງ​ທ່ານ." @@ -492,8 +494,6 @@ "ສະ​ແດງວິ​ນາ​ທີ​ໂມງ​ຢູ່​ໃນ​ແຖບ​ສະ​ຖາ​ນະ. ອາດ​ຈະ​ມີ​ຜົນ​ກະ​ທົບ​ຕໍ່​ອາ​ຍຸ​ແບັດ​ເຕີ​ຣີ." "ຈັດ​ວາງ​ການ​ຕັ້ງ​ຄ່າ​ດ່ວນ​ຄືນ​ໃໝ່" "ສະ​ແດງ​ຄວາມ​ແຈ້ງ​ຢູ່​ໃນ​ການ​ຕັ້ງ​ຄ່າ​ດ່ວນ" - "ເປີດໃຊ້ທ່າທາງການປັດຂຶ້ນເພື່ອເຂົ້າສູ່ໜ້າຈໍແບບແຍກກັນ" - "ເປີດໃຊ້ທ່າທາງເພື່ອເຂົ້າສູ່ໜ້າຈໍແບບແຍກກັນ ໂດຍການປັດຂຶ້ນຈາກປຸ່ມພາບຮວມ" "ຍັງຢູ່ໃນການທົດລອງ" "ເປີດ​ໃຊ້ Bluetooth ບໍ່?" "ເພື່ອ​ເຊື່ອມ​ຕໍ່​ແປ້ນ​ພິມ​ຂອງ​ທ່ານ​ກັບ​ແທັບ​ເລັດ​ຂອງ​ທ່ານ, ກ່ອນ​ອື່ນ​ໝົດ​ທ່ານ​ຕ້ອງ​ເປີດ Bluetooth." @@ -651,4 +651,5 @@ "ເປີດການຕັ້ງຄ່າ %s." "ແກ້ໄຂລຳດັບການຕັ້ງຄ່າ." "%1$d ຈາກທັງໝົດ %2$d" + "ບໍ່ສາມາດປິດສຽງ ຫຼື ບລັອກການແຈ້ງເຕືອນໄດ້" diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 46e50fbc3461a80b506d1e8d42e49dffb60c01a8..480d88a2c09c47b8f4f61903ddc9de932faaa3ca 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -240,7 +240,7 @@ "4G duomenys pristabdyti" "Korinio ryšio duomenys pristabdyti" "Duomenys pristabdyti" - "Kadangi buvo pasiektas nustatytas duomenų limitas, įrenginys pristabdė duomenų naudojimą likusį šio ciklo laikotarpį.\n\nAtnaujinus gali būti taikomi operatoriaus mokesčiai." + "Pasiektas nustatytas duomenų apribojimas. Nebenaudojate mobiliojo ryšio duomenų.\n\nJei atnaujinsite, gali būti taikomi mokesčiai už duomenų naudojimą." "Atnaujinti" "Nėra interneto ryš." "Prisij. prie „Wi-Fi“" @@ -275,10 +275,10 @@ "„Bluetooth“ išjungta" "Nėra pasiekiamų susietų įrenginių" "Šviesumas" - "Automatinis kaitaliojimas" + "Automatinis pasukimas" "Automatiškai sukti ekraną" "Nustatyti kaip %s" - "Kaitaliojimas užrakintas" + "Pasukimas užrakintas" "Stačias" "Gulsčias" "Įvesties metodas" @@ -408,6 +408,7 @@ "Įrenginys gali būti stebimas" "Profilis gali būti stebimas" "Tinklas gali būti stebimas" + "Tinklas gali būti stebimas" "Įrenginio stebėjimas" "Profilio stebėjimas" "Tinklo stebėjimas" @@ -420,6 +421,7 @@ "VPN" "Esate prisijungę prie programos „%1$s“, kuri gali stebėti tinklo veiklą, įskaitant el. laiškus, programas ir svetaines." "Esate prisijungę prie programos „%1$s“, kuri gali stebėti asmeninio profilio tinklo veiklą, įskaitant el. laiškus, programas ir svetaines." + "Esate prisijungę prie programos „%1$s“, kuri gali stebėti asmeninio tinklo veiklą, įskaitant el. laiškus, programas ir svetaines." "Darbo profilį tvarko „%1$s“. Jis susietas su programa „%2$s“, kuri gali stebėti darbo profilio tinklo veiklą, įskaitant el. laiškus, programas ir svetaines.\n\nDaugiau informacijos galite gauti susisiekę su administratoriumi." "Darbo profilį tvarko „%1$s“. Jis susietas su programa „%2$s“, kuri gali stebėti darbo profilio tinklo veiklą, įskaitant el. laiškus, programas ir svetaines.\n\nTaip pat esate prisijungę prie programos „%3$s“, kuri gali stebėti asmeninio profilio tinklo veiklą." "Jūsų įrenginį tvarko „%1$s“.\n\nAdministratorius gali stebėti ir tvarkyti nustatymus, įmonės informacijos pasiekiamumo nustatymus, programas, su įrenginiu susietus duomenis ir įrenginio vietovės informaciją.\n\nEsate prisijungę prie programos „%2$s“, kuri gali stebėti tinklo veiklą, įskaitant el. laiškus, programas ir svetaines.\n\nDaugiau informacijos galite gauti susisiekę su administratoriumi." @@ -496,8 +498,6 @@ "Rodyti laikrodžio sekundes būsenos juostoje. Tai gali paveikti akumuliatoriaus naudojimo laiką." "Pertvarkyti sparčiuosius nustatymus" "Rodyti skaistį sparčiuosiuose nustatymuose" - "Įgalinti ekrano skaidymo perbraukimo aukštyn gestą" - "Įgalinti gestą, kuriuo galima įjungti skaidytą ekraną, perbraukiant aukštyn nuo apžvalgos mygtuko" "Eksperimentinė versija" "Įjungti „Bluetooth“?" "Kad galėtumėte prijungti klaviatūrą prie planšetinio kompiuterio, pirmiausia turite įjungti „Bluetooth“." @@ -655,4 +655,5 @@ "Atidaryti „%s“ nustatymus." "Redaguoti nustatymų tvarką." "%1$d psl. iš %2$d" + "Pranešimų negalima nutildyti arba užblokuoti" diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 9efad2e941270da1982f2a385b83997e53fad39f..564a29c5f05d7fe587a6b0ee20c2c0b9ad7e2e8c 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -239,7 +239,7 @@ "4G datu lietojums ir apturēts" "Mobilo datu lietojums ir apturēts" "Datu lietojums ir apturēts" - "Tika sasniegts iestatītais datu lietojuma ierobežojums, tādēļ ierīcē ir apturēts datu lietojums cikla atlikušajā periodā.\n\nJa atsāksiet lietot datus, iespējams, jūsu mobilo sakaru operators iekasēs maksu." + "Ir sasniegts jūsu iestatītais datu ierobežojums. Jūs vairs neizmantojat mobilos datus.\n\nJa atsāksiet, var tikt piemērota maksa par datu lietojumu." "Atsākt" "Nav interneta sav." "Izv. sav. ar Wi-Fi" @@ -406,6 +406,7 @@ "Ierīci var pārraudzīt" "Profilu var pārraudzīt" "Iespējams, tīklā veiktās darbības tiek pārraudzītas." + "Var tikt pārraudzītas tīklā veiktās darbības." "Ierīces pārraudzība" "Profila pārraudzība" "Tīkla pārraudzība" @@ -418,6 +419,7 @@ "VPN" "Ir izveidots savienojums ar lietotni %1$s, kura var pārraudzīt jūsu tīklā veiktās darbības, tostarp e-pasta ziņojumus, lietotnes un vietnes." "Ir izveidots savienojums ar lietotni %1$s, kura var pārraudzīt jūsu tīklā veiktās privātās darbības, tostarp e-pasta ziņojumus, lietotnes un vietnes." + "Ir izveidots savienojums ar lietotni %1$s, kas var pārraudzīt jūsu tīklā veiktās privātās darbības, tostarp e-pasta ziņojumus, lietotnes un vietnes." "Jūsu darba profilu pārvalda %1$s. Tas ir saistīts ar lietojumprogrammu %2$s, kura var pārraudzīt jūsu tīklā veiktās darbības, tostarp e-pasta ziņojumus, lietotnes un vietnes.\n\nLai iegūtu plašāku informāciju, sazinieties ar administratoru." "Jūsu darba profilu pārvalda %1$s. Tas ir saistīts ar lietojumprogrammu %2$s, kura var pārraudzīt jūsu tīklā veiktās darbības, tostarp e-pasta ziņojumus, lietotnes un vietnes.\n\nIr piesaistīta arī lietojumprogramma %3$s, kas var pārraudzīt jūsu tīklā veiktās privātās darbības." "Jūsu ierīci pārvalda %1$s.\n\nJūsu administrators var pārraudzīt un pārvaldīt iestatījumus, korporatīvo piekļuvi, lietotnes un datus, kas ir saistīti ar šo ierīci, kā arī informāciju par jūsu ierīces atrašanās vietu.\n\nIr piesaistīta lietojumprogramma %2$s, kas var pārraudzīt jūsu tīklā veiktās darbības, tostarp e-pasta ziņojumus, lietotnes un vietnes.\n\nLai iegūtu plašāku informāciju, sazinieties ar administratoru." @@ -494,8 +496,6 @@ "Statusa joslā rādīt pulksteņa sekundes. Var ietekmēt akumulatora darbības laiku." "Pārkārtot ātros iestatījumus" "Rādīt spilgtumu ātrajos iestatījumos" - "Iespējot vilkšanu augšup, lai sadalītu ekrānu" - "Iespējot žestu ekrāna sadalīšanai, velkot augšup no pogas Pārskats" "Eksperimentāli" "Vai ieslēgt Bluetooth savienojumu?" "Lai pievienotu tastatūru planšetdatoram, vispirms ir jāieslēdz Bluetooth savienojums." @@ -653,4 +653,5 @@ "Atvērt %s iestatījumus." "Rediģēt iestatījumu secību." "%1$d. lpp. no %2$d" + "Nevar izslēgt paziņojumu signālu vai tos bloķēt" diff --git a/packages/SystemUI/res/values-mk-rMK/strings.xml b/packages/SystemUI/res/values-mk-rMK/strings.xml index 549543db03a7798c21d6785649050ae2e670ec58..602fdc9fb385935ebb5c3dc57d6ac210449de6cd 100644 --- a/packages/SystemUI/res/values-mk-rMK/strings.xml +++ b/packages/SystemUI/res/values-mk-rMK/strings.xml @@ -238,7 +238,7 @@ "Податоците 4G се паузирани" "Мобилните податоци се паузирани" "Податоците се паузирани" - "Поради тоа што го достигнавте поставеното ограничување на податоци, уредот го паузираше користењето податоци до крајот на циклусот.\n\nОператорот може да ви наплати ако продолжите." + "Го достигнавте ограничувањето за сообраќај на податоци што сте го поставиле. Веќе не користите мобилен интернет.\n\nДоколку продолжите, ќе ви биде наплатено за потрошениот сообраќај." "Продолжи" "Нема интернет" "Поврзано на Wi-Fi" @@ -404,6 +404,7 @@ "Уредот може да се следи" "Профилот можеби се следи" "Мрежата може да се следи" + "Мрежата може да се следи" "Следење на уредот" "Следење профил" "Следење на мрежата" @@ -416,6 +417,7 @@ "ВПН" "Поврзани сте на %1$s, којашто може да ја следи вашата активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-локациите." "Поврзани сте на %1$s, којашто може да ја следи вашата лична активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-локациите." + "Поврзани сте на %1$s, којашто може да ја следи вашата лична активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-локациите." "%1$s управува со вашиот работен профил. Истиот е поврзан на %2$s, којашто може да ја следи вашата работна активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-локациите.\n\nЗа повеќе информации, контактирајте со администраторот." "%1$s управува со вашиот работен профил. Истиот е поврзан на %2$s, којашто може да ја следи вашата работна активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-локациите.\n\nВие исто така сте поврзани на %3$s, којашто може да ја следи вашата лична активност на мрежата." "%1$s управува со вашиот уред.\n\nВашиот администратор може да ги следи и да управува со параметрите, корпоративниот пристап, апликациите, податоците поврзани со уредот и информациите за локацијата на уредот.\n\nПоврзани сте на %2$s, којашто може да ја следи вашата активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-локациите.\n\nЗа повеќе информации, контактирајте со администраторот." @@ -492,8 +494,6 @@ "Прикажи ги секундите на часовникот на статусната лента. Може да влијае на траењето на батеријата." "Преуредете ги Брзи поставки" "Прикажете ја осветленоста во Брзи поставки" - "Овозможи го гестот повлекување нагоре за поделен екран" - "Овозможете гест за отворање поделен екран со повлекување нагоре од копчето Краток преглед" "Експериментално" "Да се вклучи Bluetooth?" "За да ја поврзете тастатурата со таблетот, најпрво треба да вклучите Bluetooth." @@ -651,4 +651,5 @@ "Отворете ги поставките на %s." "Уредете го редоследот на поставките." "Страница %1$d од %2$d" + "Известувања не може да се стишат или блокираат" diff --git a/packages/SystemUI/res/values-ml-rIN/strings.xml b/packages/SystemUI/res/values-ml-rIN/strings.xml index 9f596b8175bb534e041e130cc87ee5f3a4ebabb8..ddabf900734c78b5450c1b95a43ccc0671d883a2 100644 --- a/packages/SystemUI/res/values-ml-rIN/strings.xml +++ b/packages/SystemUI/res/values-ml-rIN/strings.xml @@ -238,7 +238,7 @@ "4G ഡാറ്റ താൽക്കാലികമായി നിർത്തി" "സെല്ലുലാർ ഡാറ്റ താൽക്കാലികമായി നിർത്തി" "ഡാറ്റ താൽക്കാലികമായി നിർത്തി" - "നിങ്ങൾ നേരത്തെ ക്രമീകരിച്ച ഡാറ്റ പരിധിയിലെത്തിയതിനാൽ, ഈ സൈക്കിളിന്റെ അവശേഷിക്കുന്ന ഡാറ്റ ഉപയോഗം, ഉപകരണം താൽക്കാലികമായി നിർത്തി.\n\nപുനരാരംഭിക്കുന്നത്, നിങ്ങളുടെ കാരിയറിൽ നിന്ന് നിരക്കുകൾക്ക് ഇടയാക്കാം." + "നിങ്ങൾ സജ്ജമാക്കിയ ഡാറ്റ പരിധി എത്തിക്കഴിഞ്ഞു. ഇനിയങ്ങോട്ട് നിങ്ങൾ സെല്ലുലാർ ഡാറ്റ ഉപയോഗിക്കില്ല.\n\nതുടരുകയാണെങ്കിൽ, ഡാറ്റാ ഉപയോഗത്തിന് നിരക്കുകൾ ബാധകമായേക്കാം." "പുനരാരംഭിക്കുക" "ഇന്റർനെറ്റ് കണക്ഷൻ ഇല്ല" "വൈഫൈ കണക്‌റ്റുചെയ്‌തു" @@ -404,6 +404,7 @@ "ഉപകരണം നിരീക്ഷിക്കപ്പെടാം" "പ്രൊഫൈൽ നിരീക്ഷിക്കപ്പെടാം" "നെറ്റ്‌വർക്ക് നിരീക്ഷിക്കപ്പെടാം" + "നെറ്റ്‌വർക്ക് നിരീക്ഷിക്കപ്പെടാം" "ഉപകരണം നിരീക്ഷിക്കൽ" "പ്രൊഫൈൽ നിരീക്ഷിക്കൽ" "നെറ്റ്‌വർക്ക് നിരീക്ഷിക്കൽ" @@ -416,6 +417,7 @@ "VPN" "നിങ്ങൾ %1$s എന്നതിലേക്ക് കണക്റ്റുചെയ്‌തിരിക്കുന്നു, അതിന് ഇമെയിലുകൾ, ആപ്സ്, വെബ്‌സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നിങ്ങളുടെ നെറ്റ്‌വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാനാകും." "നിങ്ങൾ %1$s എന്നതിലേക്ക് കണക്റ്റുചെയ്‌തിരിക്കുന്നു, അതിന് ഇമെയിലുകൾ, ആപ്സ്, വെബ്‌സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നിങ്ങളുടെ സ്വകാര്യ നെറ്റ്‌വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാനാകും." + "നിങ്ങൾ %1$s ആപ്പിലേക്ക് കണക്റ്റുചെയ്‌തിരിക്കുന്നു, ഇമെയിലുകൾ, ആപ്‌സ്, വെബ്‌സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നെറ്റ്‌വർക്ക് ആക്റ്റിവിറ്റി നിരീക്ഷിക്കാൻ ഈ ആപ്പിന് കഴിയും." "നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈൽ നിയന്ത്രിക്കുന്നത് %1$s ആണ്. നിങ്ങൾ %2$s എന്നതിലേക്ക് കണക്റ്റുചെയ്‌തിരിക്കുന്നു, അതിന് ഇമെയിലുകൾ, ആപ്സ്, വെബ്‌സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നിങ്ങളുടെ ഔദ്യോഗിക നെറ്റ്‌വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാനാകും.\n\nകൂടുതൽ വിവരങ്ങൾക്ക്, നിങ്ങളുടെ അഡ്‌മിനിസ്‌ട്രേറ്ററെ ബന്ധപ്പെടുക." "നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈൽ നിയന്ത്രിക്കുന്നത് %1$s ആണ്. നിങ്ങൾ %2$s എന്നതിലേക്ക് കണക്റ്റുചെയ്‌തിരിക്കുന്നു, അതിന് ഇമെയിലുകൾ, ആപ്സ്, വെബ്‌സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നിങ്ങളുടെ ഔദ്യോഗിക നെറ്റ്‌വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാനാകും.\n\nനിങ്ങൾ %3$s എന്നതിലേക്കും കണക്റ്റുചെയ്‌തിരിക്കുന്നു, അതിന് നിങ്ങളുടെ സ്വകാര്യ നെറ്റ്‌വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാനാകും." "നിങ്ങളുടെ ഉപകരണം നിയന്ത്രിക്കുന്നത് %1$s ആണ്.\n\nനിങ്ങളുടെ അഡ്‌മിനിസ്‌ട്രേറ്റർക്ക്, ഉപകരണവുമായി ബന്ധപ്പെട്ട ക്രമീകരണവും കോർപ്പറേറ്റ് ആക്‌സസ്സും അപ്ലിക്കേഷനുകളും വിവരവും ഒപ്പം ഉപകരണത്തിന്റെ ലൊക്കേഷൻ വിവരവും നിരീക്ഷിച്ച് നിയന്ത്രിക്കാനാകും.\n\nഇമെയിലുകളും അപ്ലിക്കേഷനുകളും വെബ്‌സൈറ്റുകളും ഉൾപ്പെടെയുള്ള നെറ്റ്‌വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാനാകുന്ന ഒരു %2$s എന്നതിലേക്കും നിങ്ങൾ കണക്റ്റുചെയ്തിരിക്കുന്നു.\n\nകൂടുതൽ വിവരങ്ങൾക്ക്, അഡ്‌മിനിസ്ട്രേറ്ററെ ബന്ധപ്പെടുക." @@ -492,8 +494,6 @@ "സ്റ്റാറ്റസ് ബാറിൽ ക്ലോക്ക് സെക്കൻഡ് കാണിക്കുന്നത് ബാറ്ററിയുടെ ലൈഫിനെ ബാധിക്കാം." "ദ്രുത ക്രമീകരണം പുനഃസജ്ജീകരിക്കുക" "ദ്രുത ക്രമീകരണത്തിൽ തെളിച്ചം കാണിക്കുക" - "സ്പ്ലിറ്റ്-സ്ക്രീൻ സ്വൈപ്പ്-അപ്പ് ജെസ്റ്റർ പ്രവർത്തനക്ഷമമാക്കുക" - "ചുരുക്കവിവരണ ബട്ടണിൽ നിന്ന് മുകളിലേക്ക് സ്വൈപ്പുചെയ്തുകൊണ്ട് സ്പ്ലിറ്റ്-സ്ക്രീനിലേക്ക് പ്രവേശിക്കാൻ ജെസ്‌റ്റർ പ്രവർത്തനക്ഷമമാക്കുക" "പരീക്ഷണാത്മകം!" "Bluetooth ഓണാക്കണോ?" "നിങ്ങളുടെ ടാബ്‌ലെറ്റുമായി കീബോർഡ് കണക്റ്റുചെയ്യുന്നതിന്, ആദ്യം Bluetooth ഓണാക്കേണ്ടതുണ്ട്." @@ -651,4 +651,5 @@ "%s ക്രമീകരണം തുറക്കുക." "ക്രമീകരണ ക്രമം എഡിറ്റുചെയ്യുക." "പേജ് %1$d / %2$d" + "അറിയിപ്പുകൾ നിശബ്ദമാക്കാനോ ബ്ലോക്കുചെയ്യാനോ കഴിയില്ല" diff --git a/packages/SystemUI/res/values-mn-rMN/strings.xml b/packages/SystemUI/res/values-mn-rMN/strings.xml index f3a2f0827f591a758c4a5b1e83b37ebe94d60e8f..df9e7993ea7b0871079bfba4a9baaca07f4f8fc1 100644 --- a/packages/SystemUI/res/values-mn-rMN/strings.xml +++ b/packages/SystemUI/res/values-mn-rMN/strings.xml @@ -236,7 +236,7 @@ "4G дата-г түр зогсоосон байна" "Гар утасны дата-г түр зогсоосон байна" "Дата-г түр зогсоосон байна" - "Таны багц дата эрхийн дээд хэмжээнд хүрсэн байгаа тул төхөөрөмж нь үлдсэн хэсэгт дата хэрэглээг түр зогсоосон байна.\n\nТа үйлдлийг үргэлжлүүлэхийг хүсвэл үйлчилгээ үзүүлж буй үүрэн холбооны газраас нэмж дата эрх авна уу." + "Таны тогтоосон дата хэмжээний хязгаарт хүрсэн байна. Та одоогоор мобайл датаг ашиглаагүй байна.\n\nҮргэлжлүүлсэн тохиолдолд төлбөр гарах болно." "Үргэлжлүүлэх" "Интернет холболт байхгүй" "Wi-Fi холбогдсон" @@ -402,6 +402,7 @@ "Төхөөрөмжийг хянах боломжтой" "Профайлыг хянаж байж болзошгүй" "Сүлжээ хянагдаж байж болзошгүй" + "Сүлжээг хянаж байж болзошгүй" "Төхөөрөмжийн хяналт" "Профайл хяналт" "Сүлжээний хяналт" @@ -414,6 +415,7 @@ "VPN" "Та %1$s-д холбогдсон бөгөөд энэ нь таны имэйл, апп, вебсайт зэрэг сүлжээний үйл ажиллагааг хянах боломжтой." "Та %1$s-д холбогдсон бөгөөд энэ нь таны имэйл, апп, вебсайт зэрэг сүлжээний хувийн үйл ажиллагааг хянах боломжтой." + "Та имэйл, апп, вэб хуудас зэрэг хувийн сүлжээнийхээ үйл ажиллагааг хянах боломжтой %1$s-д холбогдсон байна." "Таны ажлын профайлыг %1$s удирддаг. Энэ нь %2$s-тэй холбогдсон бөгөөд таны имэйл, апп, вебсайт зэрэг сүлжээний үйл ажиллагааг хянах боломжтой.\n\nДэлгэрэнгүй мэдээлэл авахыг хүсвэл админтайгаа холбогдоно уу." "Таны ажлын профайлыг %1$s удирддаг. Энэ нь %2$s-тай холбогдсон бөгөөд таны имэйл, апп, вебсайт зэрэг ажлын сүлжээний үйл ажиллагааг хянах боломжтой.\n\nМөн та %3$s-д холбогдсон бөгөөд энэ нь таны сүлжээний хувийн үйл ажиллагааг хянаж чадна." "Таны төхөөрөмжийг %1$s удирддаг.\n\n Танай админ төхөөрөмж, төхөөрөмжийн байршилтай холбоотой өгөгдлийг холбох, тохиргоог өөрчлөх болон хяналт тавих боломжтой.\n\nТа %2$s-тай холбогдсон бөгөөд ингэснээр таны имэйл,апп, аюулгүй вебсайт зэрэг сүлжээний үйл ажиллагаагаа хянах боломжтой.\n\n Дэлгэрэнгүй мэдээлэл авахыг хүсвэл админтайгаа холбогдоно уу." @@ -492,8 +494,6 @@ "Статус талбарт цагийн секундыг харуулах. Энэ нь тэжээлийн цэнэгт нөлөөлж болно." "Түргэн тохиргоог дахин засварлах" "Түргэн тохиргоонд гэрэлтүүлэг харах" - "Дэлгэц хуваах дээш шудрах дохиог идэвхжүүлэх" - "Тойм товчлуурыг дээш шударч, хуваагдсан дэлгэцэд зангаагаар орох тохиргоог идэвхжүүлэх" "Туршилтын" "Bluetooth-г асаах уу?" "Компьютерийн гараа таблетад холбохын тулд эхлээд Bluetooth-г асаана уу." @@ -505,14 +505,14 @@ "Тэжээлийн мэдэгдлийн удирдлага" "Идэвхтэй" "Идэвхгүй" - "Тэжээлийн мэдэгдлийн удирдлагын тусламжтайгаар та апп-н мэдэгдэлд 0-5 хүртэлх ач холбогдлын төвшин тогтоох боломжтой. \n\n""5-р төвшин"" \n- Мэдэгдлийн жагсаалтын хамгийн дээр харуулна \n- Бүтэн дэлгэцэд саад болно \n- Дэлгэцэд тогтмол гарч ирнэ \n\n""4-р төвшин"" \n- Бүтэн дэлгэцэд саад болохоос сэргийлнэ \n- Дэлгэцэд тогтмол гарч ирнэ \n\n""3-р төвшин"" \n- Бүтэн дэлгэцэд саад болохоос сэргийлнэ \n- Дэлгэцэд хэзээ ч гарч ирэхгүй \n\n""2-р төвшин"" \n- Бүтэн дэлгэцэд саад болохоос сэргийлнэ \n- Дэлгэцэд хэзээ ч гарч ирэхгүй \n- Дуу болон чичиргээ хэзээ ч гаргахгүй \n\n""1-р төвшин"" \n- Бүтэн дэлгэцэд саад болохоос сэргийлнэ \n- Дэлгэцэд хэзээ ч гарч ирэхгүй \n- Дуу болон чичиргээ хэзээ ч гаргахгүй \n- Түгжигдсэн дэлгэц болон статусын самбараас нууна \n- Мэдэгдлийн жагсаалтын доор харуулна \n\n""0-р төвшин"" \n- Энэ апп-н бүх мэдэгдлийг блоклоно" + "Тэжээлийн мэдэгдлийн удирдлагын тусламжтайгаар та апп-н мэдэгдэлд 0-5 хүртэлх ач холбогдлын түвшин тогтоох боломжтой. \n\n""5-р түвшин"" \n- Мэдэгдлийн жагсаалтын хамгийн дээр харуулна \n- Бүтэн дэлгэцэд саад болно \n- Дэлгэцэд тогтмол гарч ирнэ \n\n""4-р түвшин"" \n- Бүтэн дэлгэцэд саад болохоос сэргийлнэ \n- Дэлгэцэд тогтмол гарч ирнэ \n\n""3-р түвшин"" \n- Бүтэн дэлгэцэд саад болохоос сэргийлнэ \n- Дэлгэцэд хэзээ ч гарч ирэхгүй \n\n""2-р түвшин"" \n- Бүтэн дэлгэцэд саад болохоос сэргийлнэ \n- Дэлгэцэд хэзээ ч гарч ирэхгүй \n- Дуу болон чичиргээ хэзээ ч гаргахгүй \n\n""1-р түвшин"" \n- Бүтэн дэлгэцэд саад болохоос сэргийлнэ \n- Дэлгэцэд хэзээ ч гарч ирэхгүй \n- Дуу болон чичиргээ хэзээ ч гаргахгүй \n- Түгжигдсэн дэлгэц болон статусын самбараас нууна \n- Мэдэгдлийн жагсаалтын доор харуулна \n\n""0-р түвшин"" \n- Энэ апп-н бүх мэдэгдлийг блоклоно" "Ач холбогдол: Автомат" - "Ач холбогдол: 0-р төвшин" - "Ач холбогдол: 1-р төвшин" - "Ач холбогдол: 2-р төвшин" - "Ач холбогдол: 3-р төвшин" - "Ач холбогдол: 4-р төвшин" - "Ач холбогдол: 5-р төвшин" + "Ач холбогдол: 0-р түвшин" + "Ач холбогдол: 1-р түвшин" + "Ач холбогдол: 2-р түвшин" + "Ач холбогдол: 3-р түвшин" + "Ач холбогдол: 4-р түвшин" + "Ач холбогдол: 5-р түвшин" "Апп нь мэдэгдэл бүрийн ач холбогдлыг тодорхойлдог." "Энэ апп-н мэдэгдлийг хэзээ ч бүү харуул." "Бүтэн дэлгэцэд саадгүй, гарч ирэхгүй, дуугүй, чичиргээгүй. Түгжигдсэн дэлгэц, статусын хэсгээс нуух." @@ -651,4 +651,5 @@ "%s тохиргоог нээнэ үү." "Тохиргооны дарааллыг өөрчилнө үү." "%2$d%1$d-р хуудас" + "Мэдэгдлийн дууг хаах, эсвэл блоклох боломжгүй" diff --git a/packages/SystemUI/res/values-mr-rIN/strings.xml b/packages/SystemUI/res/values-mr-rIN/strings.xml index e5c641039df3a6f5c2e7a8bcd0c4e9659ad290db..006b9bbd5605cee73f60453412045958d1ed6d43 100644 --- a/packages/SystemUI/res/values-mr-rIN/strings.xml +++ b/packages/SystemUI/res/values-mr-rIN/strings.xml @@ -238,7 +238,7 @@ "4G डेटास विराम दिला आहे" "सेल्युलर डेटास विराम दिला आहे" "डेटास विराम दिला आहे" - "आपली सेट केलेली डेटा मर्यादा गाठल्यामुळे, डिव्हाइसने या चक्राच्या उर्वरित डेटा वापरास विराम दिला आहे.\n\nपुन्हा सुरु करण्यामुळे आपल्या वाहकाकडून शुल्क आकारले जाऊ शकते." + "आपण सेट केलेली डेटा मर्यादा गाठली आहे. आपण यापुढे मोबाइल डेटा वापरणार नाही.\n\nआपण पुन: सुरु केल्यास, डेटा वापरासाठी शुल्क आकारले जाऊ शकतात." "पुन्हा सुरु करा" "इंटरनेट कनेक्शन नाही" "वाय-फाय कनेक्ट केले" @@ -404,6 +404,7 @@ "डिव्हाइसचे परीक्षण केले जाऊ शकते" "प्रोफाईलचे परीक्षण केले जाऊ शकते" "नेटवर्कचे परीक्षण केले जाऊ शकते" + "नेटवर्कचे परीक्षण केले जाऊ शकते" "डिव्हाइस परीक्षण" "प्रोफाईल परीक्षण" "नेटवर्क परीक्षण" @@ -416,6 +417,7 @@ "VPN" "आपण %1$s शी कनेक्‍ट केले आहे, जो ईमेल, अ‍ॅप्स आणि वेबसाइटसह आपल्‍या नेटवर्क क्रियाकलापाचे परीक्षण करू शकतो." "आपण %1$s शी कनेक्‍ट केले आहे, जो ईमेल, अ‍ॅप्स आणि वेबसाइटसह आपल्‍या वैयक्तिक नेटवर्क क्रियाकलापाचे परीक्षण करू शकतो." + "आपण %1$s शी कनेक्‍ट केले आहे, जो ईमेल, अ‍ॅप्स आणि वेबसाइटसह आपल्‍या वैयक्तिक नेटवर्क क्रियाकलापाचे परीक्षण करू शकतो." "आपले कार्य प्रोफाईल %1$s द्वारे व्यवस्थापित केले आहे. ते %2$s शी कनेक्ट केले आहे, जो ईमेल, अ‍ॅप्स आणि वेबसाइटसह आपल्‍या कार्य नेटवर्क क्रियाकलापाचे परीक्षण करू शकतो.\n\nअधिक माहितीसाठी, आपल्‍या प्रशासकाशी संपर्क साधा." "आपले कार्य प्रोफाईल %1$s द्वारे व्यवस्थापित केले आहे. ते %2$s शी कनेक्ट केले आहे, जे ईमेल, अ‍ॅप्स आणि वेबसाइटसह आपल्‍या कार्य नेटवर्क क्रियाकलापाचे परीक्षण करू शकते.\n\nआपण %3$s शी देखील कनेक्‍ट केले आहे, जे आपल्‍या वैयक्तिक नेटवर्क क्रियाकलापाचे परीक्षण करू शकते." "आपले डिव्हाइस %1$s द्वारे व्यवस्थापित केले आहे.\n\nआपला प्रशासक आपल्या डिव्हाइसशी संबद्ध सेटिंग्ज, कॉर्पोरेट प्रवेश, अ‍ॅप्स, डेटा आणि आपल्या डिव्हाइसच्या स्थान माहितीचे परीक्षण करू शकतो आणि व्‍यवस्थापित करू शकतो.\n\nआपण %2$s शी कनेक्ट केले आहे, जो ईमेल, अ‍ॅप्स आणि वेबसाइटसह आपल्या नेटवर्क क्रियाकलापाचे परीक्षण करू शकतो.\n\nअधिक माहितीसाठी, आपल्या प्रशासकाशी संपर्क साधा." @@ -492,8 +494,6 @@ "स्टेटस बारमध्‍ये घड्‍याळ सेकंद दर्शवा. कदाचित बॅटरी आयुष्‍य प्रभावित होऊ शकते." "द्रुत सेटिंग्जची पुनर्रचना करा" "द्रुत सेटिंग्जमध्‍ये चमक दर्शवा" - "विभाजित-स्क्रीन स्वाइप-अप जेश्चर सक्षम करा" - "विहंगावलोकन बटणावरून वर स्वाइप करून विभाजित-स्क्रीन प्रविष्ट करण्यासाठी जेश्चर सक्षम करा" "प्रायोगिक" "ब्लूटुथ सुरू करायचे?" "आपला कीबोर्ड आपल्या टॅब्लेटसह कनेक्ट करण्यासाठी, आपल्याला प्रथम ब्लूटुथ चालू करणे आवश्यक आहे." @@ -651,4 +651,5 @@ "%s सेटिंग्ज उघडा." "सेटिंग्जचा क्रम संपादित करा." "पृष्ठ %2$d पैकी %1$d" + "सूचना शांत किंवा अवरोधित केल्या जाऊ शकत नाहीत" diff --git a/packages/SystemUI/res/values-ms-rMY/strings.xml b/packages/SystemUI/res/values-ms-rMY/strings.xml index 7c543a6daab0523b9058d9ea7e14f7360ca511c6..df0faeb287eea493493cc094e0603b5c6d4d9b96 100644 --- a/packages/SystemUI/res/values-ms-rMY/strings.xml +++ b/packages/SystemUI/res/values-ms-rMY/strings.xml @@ -238,7 +238,7 @@ "Data 4G dijeda" "Data selular dijeda" "Data dijeda" - "Oleh kerana had data tetap anda telah dicapai, peranti telah menjeda penggunaan data bagi baki kitaran ini.\n\nMenyambung semula boleh menyebabkan anda dikenakan bayaran daripada pembawa anda." + "Had data yang anda tetapkan telah dicapai. Anda tidak lagi menggunakan data selular.\n\nJika anda menyambung semula, caj mungkin dikenakan untuk penggunaan data." "Sambung semula" "Tiada smbg Internet" "Wi-Fi disambungkan" @@ -404,6 +404,7 @@ "Peranti mungkin dipantau" "Profil mungkin dipantau" "Rangkaian mungkin dipantau" + "Rangkaian mungkin dipantau" "Pemantauan peranti" "Pemantauan profil" "Pemantauan rangkaian" @@ -416,6 +417,7 @@ "VPN" "Anda disambungkan ke %1$s, yang boleh memantau aktiviti rangkaian anda, termasuk e-mel, apl dan tapak web." "Anda disambungkan ke %1$s, yang boleh memantau aktiviti rangkaian peribadi anda, termasuk e-mel, apl dan tapak web." + "Anda disambungkan ke %1$s, yang boleh memantau aktiviti rangkaian peribadi anda, termasuk e-mel, apl dan tapak web." "Profil kerja anda diurus oleh %1$s. Profil ini disambungkan ke %2$s, yang boleh memantau aktiviti rangkaian kerja anda, termasuk e-mel, apl dan tapak web.\n\nUntuk mendapatkan maklumat lanjut, sila hubungi pentadbir anda." "Profil kerja anda diurus oleh %1$s. Profil disambungkan ke %2$s, yang boleh memantau aktiviti rangkaian kerja anda, termasuk e-mel, apl dan tapak web.\n\nAnda turut disambungkan ke %3$s, yang boleh memantau aktiviti rangkaian peribadi anda." "Peranti anda diurus oleh %1$s.\n\nPentadbir anda boleh memantau dan mengurus tetapan, akses korporat, apl, data yang dikaitkan dengan peranti anda serta maklumat lokasi peranti anda.\n\nAnda disambungkan ke %2$s, yang boleh memantau aktiviti rangkaian anda, termasuk e-mel, apl dan tapak web.\n\nUntuk mendapatkan maklumat lanjut, hubungi pentadbir anda." @@ -492,8 +494,6 @@ "Tunjukkan saat jam dalam bar status. Mungkin menjejaskan hayat bateri." "Susun Semula Tetapan Pantas" "Tunjukkan kecerahan dalam Tetapan Pantas" - "Dayakan gerak isyarat leret ke atas utk masuk skrin terpisah" - "Dayakan gerak isyarat untuk memasuki skrin terpisah dengan meleret ke atas daripada butang Ikhtisar" "Percubaan" "Hidupkan Bluetooth?" "Untuk menyambungkan papan kekunci anda dengan tablet, anda perlu menghidupkan Bluetooth terlebih dahulu." @@ -651,4 +651,5 @@ "Buka tetapan %s." "Edit susunan tetapan." "Halaman %1$d daripada %2$d" + "Pemberitahuan tidak boleh disenyapkan atau disekat" diff --git a/packages/SystemUI/res/values-my-rMM/strings.xml b/packages/SystemUI/res/values-my-rMM/strings.xml index 56a72494d2356dd55be152734ded7a4c2a17cd36..92ee06e0ef54c9d251f13ac8e5c442896ac27dd3 100644 --- a/packages/SystemUI/res/values-my-rMM/strings.xml +++ b/packages/SystemUI/res/values-my-rMM/strings.xml @@ -238,7 +238,7 @@ "4G data ခေတ္တရပ်တန့်သည်" "cellular data ခေတ္တရပ်တန့်သည်" "ဒေတာ ခေတ္တရပ်တန့်သည်" - "သင့် ဒေတာ အသုံးပြုမှု သတ်မှတ်ထားချက်သို့ ရောက်ရှိသောကြောင့်၊ ဤကာလအတွက် ကျန်ရှိသည့် ဒေတာအသုံးပြုမှုအား စက်ပစ္စည်းမှ ရပ်တန့်ထားသည်။\n\nဆက်လက်သွားပါက သင့်ဖုန်းဝန်ဆောင်မှုမှ သင့်အား ကုန်ကျစရိတ်တောင်းခံလိမ့်မည်။" + "သင်သတ်မှတ်ထားသော ဒေတာကန့်သတ်ချက်သို့ ရောက်နေပါပြီ။ သင်သည် ဆယ်လူလာဒေတာကို အသုံးမပြုတော့ပါ။\n\nသင်ဆက်လုပ်မည်ဆိုလျှင် ဒေတာသုံးစွဲမှုအတွက် အခငွေ ကျသင့်မှုရှိနိုင်ပါသည်။" "ပြန်ဆက်လုပ်ရန်" "အင်တာနက်မရှိ" "ကြိုးမဲ့ဆက်သွယ်မှု" @@ -404,6 +404,7 @@ "ကိရိယာကို စောင့်ကြပ် နိုင်ပါသည်" "ပရိုဖိုင်ကို စောင့်ကြပ်နိုင်သည်" "ကွန်ရက်ကို ကို စောင့်ကြပ် နိုင်ပါသည်" + "ကွန်ရက်ကို စောင့်ကြည့်စစ်ဆေးမှု ရှိနိုင်ပါသည်" "ကိရိယာကို စောင့်ကြပ်ခြင်း" "ပရိုဖိုင် စောင့်ကြပ်မှု" "ကွန်ရက်ကို စောင့်ကြပ်ခြင်း" @@ -416,6 +417,7 @@ "VPN" "သင်သည် %1$s သို့ ချိတ်ဆက်ထားသည်၊ ၎င်းသည် အီးမေးများ၊ အက်ပ်များနှင့် ဝဘ်ဆိုက်များအပါအဝင် သင့်ကွန်ရက်လုပ်ဆောင်ချက်များကို စောင့်ကြည့်နိုင်သည်။" "သင်သည် %1$s သို့ ချိတ်ဆက်ထားသည်။ ၎င်းသည် အီးမေးလ်များ၊ အက်ပ်များနှင့် ဝဘ်ဆိုက်များအပါအဝင် သင့်ကွန်ရက်လုပ်ဆောင်ချက်ကို စောင့်ကြည့်နိုင်သည်။" + "သင်သည် အီးမေးလ်၊ အက်ပ်နှင့် ဝဘ်ဆိုက်များအပါအဝင် သင့်ကိုယ်ရေးကိုယ်တာ ကွန်ရက်အသုံးပြုမှုကို စောင့်ကြည့်နိုင်သည့် %1$s သို့ ချိတ်ဆက်ထားပါသည်။" "သင့်အလုပ်ပရိုဖိုင်ကို %1$s မှစီမံခန့်ခွဲသည်။ ၎င်းကို %2$s သို့ ချိတ်ဆက်ထားသည်၊ ၎င်းသည် အီးမေးလ်များ၊ အက်ပ်များနှင့် ဝဘ်ဆိုက်များအပါအဝင် သင့်အလုပ်ကွန်ရက်လုပ်ဆောင်ချက်ကို စောင့်ကြည့်နိုင်သည်။ \n\nအချက်အလက်များ ပိုမိုရယူရန် သင်၏ စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ။" "သင့်အလုပ် ပရိုဖိုင်ကို %1$s မှစီမံခန့်ခွဲသည်။ ၎င်းကို %2$s သို့ ချိတ်ဆက်ထားသည်၊ ၎င်းသည် အီးမေးလ်များ၊ အက်ပ်များနှင့် ဝဘ်ဆိုက်များအပါအဝင် သင့်အလုပ်ကွန်ရက်လုပ်ဆောင်ချက်ကို စောင့်ကြည့်နိုင်သည်။ \n\n သင်သည်%3$s ကိုလည်း ချိတ်ဆက်ထားသည်၊ ၎င်းသည် သင့်ကိုယ်ပိုင်ကွန်ရက်လုပ်ဆောင်ချက်များကို စောင့်ကြည့်နိုင်သည်။" "သင့်စက်ကိရိယာကို %1$s မှစီမံခန့်ခွဲပါသည်။ \n\n စီမံခန့်ခွဲသူသည် ကြိုတင်ပြင်ဆင်မှုများ၊ စုပေါင်းဝင်ရောက်ခွင့်၊ အက်ပ်များ၊ သင့်ကိရိယာနှင့်သက်ဆိုင်သော ဒေတာနှင့် သင့်ကိရိယာ၏ တည်နေရာအချက်အလက်များကို စောင့်ကြည့်ပြီး စီမံခန့်ခွဲနိုင်သည်။ \n\nသင်သည် %2$s သို့ချိတ်ဆက်ထားသည်၊ ၎င်းသည် အီးမေးလ်များ၊ အက်ပ်များ၊ နှင့် ဝဘ်ဆိုက်များအပါအဝင် သင့်ကွန်ရက်လုပ်ဆောင်ချက်ကို စောင့်ကြည့်နိုင်သည်။ \n\nအချက်အလက်များ ပိုမိုရယူရန် သင်၏ စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ။" @@ -492,8 +494,6 @@ "အခြေအနေပြနေရာမှာ နာရီ စက္ကန့်များကို ပြပါ။ ဘက်ထရီ သက်တမ်းကို အကျိုးသက်ရောက်နိုင်တယ်။" "အမြန် ဆက်တင်များကို ပြန်စီစဉ်ရန်" "အမြန် ဆက်တင်များထဲက တောက်ပမှုကို ပြရန်" - "မျက်နှာပြင်ခွဲကြည့်ရန် အပေါ်သို့ပွတ်ဆွဲခြင်း အမူအရာကိုဖွင့်ပါ" - "ခြုံကြည့်သည့်ခလုတ်မှ အပေါ်သို့ပွတ်ဆွဲခြင်းဖြင့် မျက်နှာပြင်ခွဲကြည့်ရန် လက်ဟန်ကိုဖွင့်ပါ" "စမ်းသပ်ရေး" "ဘလူးတုသ် ဖွင့်ရမလား။" "ကီးဘုတ်ကို တပ်ဘလက်နှင့် ချိတ်ဆက်ရန်၊ ပမထဦးစွာ ဘလူးတုသ်ကို ဖွင့်ပါ။" @@ -588,7 +588,7 @@ "ဌာန" "ပြီးပါပြီ" "နေရာလွတ်ခြားစနစ်" - "မန်နယူး / ကီးဘုတ်ပြောင်းစနစ်" + "မီနူး / ကီးဘုတ်ပြောင်းစနစ်" "ပေါင်းထည့်ရန် ခလုတ်ကိုရွေးပါ" "ခလုတ်ပေါင်းထည့်ပါ" "သိမ်းရန်" @@ -651,4 +651,5 @@ "%s ဆက်တင်များကို ဖွင့်ပါ။" "ဆက်တင်များ၏ အစီအစဉ်ကို တည်းဖြတ်ပါ။" "စာမျက်နှာ %2$d အနက်မှ စာမျက်နှာ %1$d" + "အကြောင်းကြားချက်များကို အသံတိတ်ခြင်း သို့မဟုတ် ပိတ်ဆို့ခြင်းများ ပြုလုပ်၍ မရပါ" diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 3efdd3e132544daa94fd0c2fd675d4dea99c4249..02cb082305a9b285fda953b94af1dfd618538cd6 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -238,7 +238,7 @@ "4G-data er satt på pause" "Mobildata er satt på pause" "Data er satt på pause" - "Fordi den angitte datagrensen ble nådd, har enheten satt databruk på pause for resten av denne syklusen. \n\nHvis du gjenopptar bruken, kan det føre til avgifter fra operatøren din." + "Datagrensen du satte, er nådd. Du bruker ikke mobildata lenger.\n\nHvis du gjenopptar bruk av mobildata, kan gebyrer for databruk påløpe." "Gjenoppta" "Ingen Internett-forbindelse" "Wi-Fi tilkoblet" @@ -404,6 +404,7 @@ "Enheten kan være overvåket" "Profilen kan overvåkes" "Nettverket kan være overvåket" + "Nettverket kan bli overvåket" "Enhetsovervåking" "Profilovervåking" "Nettverksovervåking" @@ -416,6 +417,7 @@ "VPN" "Enheten er koblet til %1$s, som kan overvåke nettverksaktiviteten din, inkludert e-post, apper og nettsteder." "Enheten er koblet til %1$s, som kan overvåke den personlige nettverksaktiviteten din, inkludert e-post, apper og nettsteder." + "Enheten er koblet til %1$s, som kan overvåke den personlige nettverksaktiviteten din, inkludert e-post, apper og nettsteder." "Work-profilen din administreres av %1$s. Den er koblet til %2$s, som kan overvåke nettverksaktiviteten din på jobben, inkludert e-post, apper og nettsteder.\n\nFor å få mer informasjon, ta kontakt med administratoren." "Work-profilen din administreres av %1$s. Den er koblet til %2$s, som kan overvåke nettverksaktiviteten din på jobben, inkludert e-post, apper og nettsteder.\n\nDu er også koblet til %3$s, som kan overvåke den personlige nettverksaktiviteten din." "Enheten din administreres av %1$s.\n\nAdministratoren din kan overvåke og administrere innstillinger, bedriftstilgang, apper, data tilknyttet enheten din og enhetens posisjonsinformasjon.\n\nDu er koblet til %2$s, som kan overvåke nettverksaktiviteten din, inkludert e-post, apper og nettsteder.\n\nFor mer informasjon, ta kontakt med administratoren." @@ -492,8 +494,6 @@ "Vis sekunder i statusfeltet på klokken. Det kan påvirke batteritiden." "Omorganiser hurtiginnstillingene" "Vis lysstyrke i hurtiginnstillingene" - "Slå på delt skjerm ved å sveipe opp" - "Slå på bevegelsen for å åpne delt skjerm ved å sveipe opp fra Oversikt-knappen" "På forsøksstadiet" "Vil du slå på Bluetooth?" "For å koble tastaturet til nettbrettet ditt må du først slå på Bluetooth." @@ -651,4 +651,5 @@ "Åpne %s-innstillingene." "Endre rekkefølgen på innstillingene." "Side %1$d av %2$d" + "Varslinger kan ikke ignoreres eller blokkeres" diff --git a/packages/SystemUI/res/values-ne-rNP/strings.xml b/packages/SystemUI/res/values-ne-rNP/strings.xml index 07d0795bcf1668c5d345a57e693009a4cdffb1d5..79d4b846464b681c83c68830f88d1062778a6462 100644 --- a/packages/SystemUI/res/values-ne-rNP/strings.xml +++ b/packages/SystemUI/res/values-ne-rNP/strings.xml @@ -238,7 +238,7 @@ "4G डेटा रोकिएको छ" "सेल्यूलर डेटा रोकिएको छ" "डेटा रोकिएको छ" - "तपाईंले सेट गर्नुभएको डेटाको सीमा पुगेकाले, यन्त्रले यस चक्रको बाँकी भागका लागि डेटाको प्रयोग रोकेको छ।\n\nपुन: सुरू गर्दा तपाईंको क्यारियरले शुल्कहरू लिन सक्छ।" + "तपाईँले सेट गर्नुभएको डेटाको सीमामा पुगिएको छ। अबदेखि तपाईँ सेलुलर डेटाको प्रयोग गर्नुहुने छैन। \n\nतपाईँले प्रयोग जारी राख्नुभयो भने डेटा प्रयोगका शुल्कहरू लाग्न सक्छन्।" "पुनः सुरु गर्नुहोस्" "इन्टरनेट जडान छैन" "Wi-Fi जडित" @@ -404,6 +404,7 @@ "उपकरण अनुगमन हुन सक्छ" "प्रोफाइल अनुगमन हुन सक्छ" "सञ्जाल अनुगमित हुन सक्छ" + "नेटवर्कको अनुगमन गरिने सम्भावना छ" "उपकरण अनुगमन" "प्रोफाइल अनुगमन गर्दै" "सञ्जाल अनुगमन" @@ -416,6 +417,7 @@ "VPN" "तपाईँ %1$s सँग जडित हुनुहुन्छ जसले इ-मेल, अनुप्रयोगहरू र वेबसाइट लगायतका तपाईँका नेटवर्क गतिविधिको अनुगमन गर्न सक्छ।" "तपाईँ %1$s सँग जडित हुनुहुन्छ जसले इ-मेल, अनुप्रयोगहरू र वेबसाइट लगायतका तपाईँको निजी नेटवर्क गतिविधिका अनुगमन गर्न सक्छ।" + "तपाईं %1$s मा जोडिनुभएको छ जसले इमेल, अनुप्रयोग र वेबसाइटहरू लगायतको तपाईंको व्यक्तिगत नेटवर्क सम्बन्धी गतिविधिको अनुगमन गर्न सक्छ।" "तपाईँको कार्य प्रोफाइल %1$s द्वारा व्यवस्थापन गरिन्छ। यो %2$s सँग जोडिएको छ जसले इमेल, अनुप्रयोगहरू, र वेबसाइटहरू लगायतका तपाईँका नेटवर्क गतिविधि अनुगमन गर्न सक्छ।\n\nथप जानकारीको लागि, आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।" "तपाईँको कार्य प्रोफाइल %1$s द्वारा व्यवस्थापन गरिन्छ। यो %2$s सँग जोडिएको छ जसले इमेल, अनुप्रयोगहरू, र वेबसाइटहरू लगायतका तपाईँका नेटवर्क गतिविधि अनुगमन गर्न सक्छ।\n\nतपाईँ %3$s सँग पनि जडित हुनुहुन्छ, जसले तपाईँको व्यक्तिगत नेटवर्क गतिविधि अनुगमन गर्न सक्छ।" "तपाईँको उपकरण %1$s द्वारा व्यवस्थित गरिन्छ।\n\nतपाईँको प्रशासकले तपाईँको यन्त्र र त्यसको स्थान जानकारीमार्फत सेटिङहरू, कर्पोरेट पहुँच, अनुप्रयोगहरू, तपाईँको यन्त्रसँग सम्बद्ध डेटा र तपाईँको यन्त्रको स्थान जानकारीको अनुगमन र व्यवस्थापन गर्न सक्छ।\n\nतपाईँ %2$s सँग जडित हुनुहुन्छ जसले इमेल, अनुप्रयोगहरू, र वेबसाइटहरू लगायतका तपाईँका नेटवर्क गतिविधिका अनुगमन गर्न सक्छ।\n\nथप जानकारीको लागि तपाईको प्रशासकलाई सम्पर्क गर्नुहोस्।" @@ -492,8 +494,6 @@ "वस्तुस्थिति पट्टीको घडीमा सेकेन्ड देखाउनुहोस्। ब्याट्री आयु प्रभावित हुन सक्छ।" "द्रुत सेटिङहरू पुनः व्यवस्थित गर्नुहोस्" "द्रुत सेटिङहरूमा उज्यालो देखाउनुहोस्" - "विभाजित-स्क्रिन स्वाइप-अप इशारा सक्षम गर्नुहोस्" - "परिदृश्य बटनदेखि माथि स्वाइप गरी विभाजित-स्क्रिन प्रविष्ट गर्न इसारालाई सक्रिय गर्नुहोस्" "प्रयोगात्मक" "ब्लुटुथ सक्रिय पार्ने हो?" "आफ्नो ट्याब्लेटसँग किबोर्ड जोड्न, पहिले तपाईँले ब्लुटुथ सक्रिय गर्नुपर्छ।" @@ -651,4 +651,5 @@ "%s सम्बन्धी सेटिङहरूलाई खोल्नुहोस्।" "सेटिङहरूको क्रमलाई सम्पादन गर्नुहोस्।" "%2$d मध्ये पृष्ठ %1$d" + "सूचनाहरूलाई मौन गर्न वा यसमाथि रोक लगाउन मिल्दैन" diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 95092290b825bbb6100875a6d31d0d10bcbc28c6..a2a43650dcdf9db0e48d4fe690ff88bfc9bf1f6c 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -238,7 +238,7 @@ "4G-data zijn onderbroken" "Mobiele gegevens zijn onderbroken" "Gegevens zijn onderbroken" - "Omdat de ingestelde gegevenslimiet is bereikt, heeft het apparaat het gegevensverbruik onderbroken voor de rest van deze cyclus.\n\nAls u het gegevensverbruik hervat, kan je provider kosten in rekening brengen." + "De ingestelde datalimiet is bereikt. Je gebruikt geen mobiele data meer.\n\nAls je hervat, kunnen er kosten voor datagebruik in rekening worden gebracht." "Hervatten" "Geen internetverbinding" "Verbonden via wifi" @@ -404,6 +404,7 @@ "Apparaat wordt mogelijk gecontroleerd" "Profiel kan worden gecontroleerd" "Netwerk kan worden gecontroleerd" + "Netwerk kan worden gecontroleerd" "Apparaatcontrole" "Profielcontrole" "Netwerkcontrole" @@ -416,6 +417,7 @@ "VPN" "U bent verbonden met %1$s, waarmee je netwerkactiviteit kan worden gecontroleerd, inclusief e-mails, apps en websites." "U bent verbonden met %1$s, waarmee je persoonlijke netwerkactiviteit kan worden gecontroleerd, inclusief e-mails, apps en websites." + "Je bent verbonden met %1$s, waarmee je persoonlijke netwerkactiviteit kan worden gecontroleerd, inclusief e-mails, apps en websites." "Je werkprofiel wordt beheerd door %1$s. Deze is verbonden met %2$s, waarmee je werkgerelateerde netwerkactiviteit kan worden gecontroleerd, inclusief e-mails, apps en websites.\n\nNeem contact op met je beheerder voor meer informatie." "Je werkprofiel wordt beheerd door %1$s. Deze is verbonden met %2$s, waarmee je werkgerelateerde netwerkactiviteit kan worden gecontroleerd, inclusief e-mails, apps en websites.\n\nU bent ook verbonden met %3$s, waarmee je persoonlijke netwerkactiviteit kan worden gecontroleerd." "Je apparaat wordt beheerd door %1$s.\n\nJe beheerder kan instellingen, zakelijke toegang, apps, gekoppelde apparaatgegevens en locatiegegevens voor je apparaat controleren en beheren.\n\nU bent verbonden met %2$s waarmee je netwerkactiviteit kan worden gecontroleerd, inclusief e-mails, apps en websites.\n\nNeem contact op met je beheerder voor meer informatie." @@ -492,8 +494,6 @@ "Klokseconden op de statusbalk weergeven. Kan van invloed zijn op de accuduur." "Snelle instellingen opnieuw indelen" "Helderheid weergeven in Snelle instellingen" - "Omhoog vegen voor gesplitst scherm inschakelen" - "Gebaar inschakelen om gesplitst scherm te openen door vanaf de knop Overzicht omhoog te vegen" "Experimenteel" "Bluetooth inschakelen?" "Als je je toetsenbord wilt verbinden met je tablet, moet je eerst Bluetooth inschakelen." @@ -651,4 +651,5 @@ "%s-instellingen openen." "Volgorde van instellingen bewerken." "Pagina %1$d van %2$d" + "Meldingen kunnen niet op stil worden gezet of worden geblokkeerd" diff --git a/packages/SystemUI/res/values-pa-rIN/strings.xml b/packages/SystemUI/res/values-pa-rIN/strings.xml index 17c126163badd0008c9cf33da6abe0c7305be35b..e000541ed10e1bad2c6caf74a7c463f4f2a0afef 100644 --- a/packages/SystemUI/res/values-pa-rIN/strings.xml +++ b/packages/SystemUI/res/values-pa-rIN/strings.xml @@ -238,7 +238,7 @@ "4G ਡੈਟਾ ਰੁਕ ਗਿਆ ਹੈ" "ਸੈਲਿਊਲਰ ਡੈਟਾ ਰੁਕ ਗਿਆ ਹੈ" "ਡੈਟਾ ਰੁਕ ਗਿਆ ਹੈ" - "ਕਿਉਂਕਿ ਤੁਹਾਡੀ ਸੈਟ ਡੈਟਾ ਸੀਮਾ ਪੂਰੀ ਹੋ ਗਈ ਸੀ, ਡੀਵਾਈਸ ਨੇ ਇਸ ਬਾਕੀ ਚੱਕਰ ਲਈ ਡੈਟਾ ਉਪਯੋਗ ਰੋਕ ਦਿੱਤਾ ਹੈ।\n\nਇਸਨੂੰ ਦੁਬਾਰਾ ਸ਼ੁਰੂ ਕਰਨ ਨਾਲ ਤੁਹਾਡੇ ਕੈਰੀਅਰ ਵੱਲੋਂ ਖ਼ਰਚੇ ਪਾਏ ਜਾ ਸਕਦੇ ਹਨ।" + "ਤੁਸੀਂ ਤੁਹਾਡੇ ਵੱਲੋਂ ਸੈੱਟ ਕੀਤੀ ਗਈ ਡੈਟਾ ਸੀਮਾ \'ਤੇ ਪਹੁੰਚ ਚੁੱਕੇ ਹੋ। ਤੁਸੀਂ ਹੁਣ ਸੈਲਿਊਲਰ ਡੈਟੇ ਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕਰ ਰਹੇ ਹੋ।\n\nਜੇਕਰ ਤੁਸੀਂ ਮੁੜ-ਸ਼ੁਰੂ ਕਰਦੇ ਹੋ, ਤਾਂ ਡੈਟਾ ਵਰਤੋਂ ਲਈ ਖਰਚੇ ਲਾਗੂ ਹੋ ਸਕਦੇ ਹਨ।" "ਦੁਬਾਰਾ ਸ਼ੁਰੂ ਕਰੋ" "ਕੋਈ ਇੰਟਰਨੈਟ ਕਨੈਕਸ਼ਨ ਨਹੀਂ" "Wi-Fi ਕਨੈਕਟ ਕੀਤਾ" @@ -404,6 +404,7 @@ "ਡੀਵਾਈਸ ਦਾ ਨਿਰੀਖਣ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ" "ਪ੍ਰੋਫਾਈਲ ਦਾ ਨਿਰੀਖਣ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ" "ਨੈੱਟਵਰਕ ਦਾ ਨਿਰੀਖਣ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ" + "ਹੋ ਸਕਦਾ ਹੈ ਨੈੱਟਵਰਕ ਦੀ ਨਿਗਰਾਨੀ ਹੋ ਰਹੀ ਹੋਵੇ" "ਡੀਵਾਈਸ ਦਾ ਨਿਰੀਖਣ ਕਰਨਾ" "ਪ੍ਰੋਫਾਈਲ ਦਾ ਨਿਰੀਖਣ ਕਰਨਾ" "ਨੈੱਟਵਰਕ ਨਿਰੀਖਣ ਕਰ ਰਿਹਾ ਹੈ" @@ -416,6 +417,7 @@ "VPN" "ਤੁਸੀਂ %1$s ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈਬਸਫ਼ਿਆਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦੀ ਹੈ।" "ਤੁਸੀਂ %1$s ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈਬਸਫ਼ਿਆਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦੀ ਹੈ।" + "ਤੁਸੀਂ %1$s ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲਾਂ, ਐਪਾਂ, ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨਿੱਜੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।" "ਤੁਹਾਡੀ ਕਾਰਜ ਪ੍ਰੋਫ਼ਾਈਲ %1$s ਦੁਆਰਾ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਇਹ %2$s ਨਾਲ ਕਨੈਕਟ ਹੈ, ਜੋ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈਬਸਫ਼ਿਆਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦੀ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਬੰਧਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।" "ਤੁਹਾਡੀ ਕਾਰਜ ਪ੍ਰੋਫ਼ਾਈਲ %1$s ਦੁਆਰਾ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਇਹ %2$s ਨਾਲ ਕਨੈਕਟ ਹੈ, ਜੋ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈਬਸਫ਼ਿਆਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦੀ ਹੈ।\n\nਤੁਸੀਂ %3$s ਨਾਲ ਵੀ ਕਨੈਕਟ ਹੋ, ਜੋ ਤੁਹਾਡੀ ਨਿੱਜੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦਾ ਹੈ।" "ਤੁਹਾਡੀ ਡੀਵਾਈਸ %1$s ਦੁਆਰਾ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।\n\nਪ੍ਰਬੰਧਕ ਸੈਟਿੰਗਾਂ, ਕਾਰਪੋਰੇਟ ਪਹੁੰਚ, ਐਪਸ, ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਨਾਲ ਸੰਬੰਧਿਤ ਡੈਟਾ ਅਤੇ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਦੀ ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਜਾਣਕਾਰੀ ਦਾ ਨਿਰੀਖਣ ਅਤੇ ਉਸਨੂੰ ਵਿਵਸਥਿਤ ਕਰ ਸਕਦਾ ਹੈ।\n\nਤੁਸੀਂ ਇੱਕ %2$s ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈੱਬਪੰਨੇ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦਾ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਬੰਧਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।" @@ -492,8 +494,6 @@ "ਸਥਿਤੀ ਬਾਰ ਵਿੱਚ ਘੜੀ ਸਕਿੰਟ ਦਿਖਾਓ। ਬੈਟਰੀ ਸਮਰੱਥਾ ਤੇ ਅਸਰ ਪੈ ਸਕਦਾ ਹੈ।" "ਤਤਕਾਲ ਸੈਟਿੰਗਾਂ ਨੂੰ ਦੁਬਾਰਾ ਕ੍ਰਮ ਦਿਓ" "ਤਤਕਾਲ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਚਮਕ ਦਿਖਾਓ" - "ਸਪਲਿਟ-ਸਕ੍ਰੀਨ ਸਵਾਈਪ-ਅੱਪ ਸੰਕੇਤ ਨੂੰ ਯੋਗ ਬਣਾਓ" - "ਰੂਪ-ਰੇਖਾ ਬਟਨ ਤੋਂ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰਨ ਦੁਆਰਾ ਸਪਲਿਟ-ਸਕ੍ਰੀਨ ਵਿੱਚ ਦਾਖਲ ਹੋਣ ਲਈ ਸੰਕੇਤ ਨੂੰ ਯੋਗ ਬਣਾਓ" "ਪ੍ਰਯੋਗਾਤਮਿਕ" "Bluetooth ਚਾਲੂ ਕਰੋ?" "ਆਪਣੇ ਟੈਬਲੇਟ ਨਾਲ ਆਪਣਾ ਕੀ-ਬੋਰਡ ਕਨੈਕਟ ਕਰਨ ਲਈ, ਤੁਹਾਨੂੰ ਪਹਿਲਾਂ Bluetooth ਚਾਲੂ ਕਰਨ ਦੀ ਜ਼ਰੂਰਤ ਹੈ।" @@ -651,4 +651,5 @@ "%s ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹੋ।" "ਸੈਟਿੰਗਾਂ ਦੇ ਕ੍ਰਮ ਦਾ ਸੰਪਾਦਨ ਕਰੋ।" "%2$d ਦਾ %1$d ਪੰਨਾ" + "ਸੂਚਨਾਵਾਂ ਨੂੰ ਖਾਮੋਸ਼ ਜਾਂ ਬਲੌਕ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ" diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index c86d26c317700be9e924dbe9d4adc29c7ed49f00..46ab85badcab4c4c80d416f6eaa27dfc38c19643 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -240,7 +240,7 @@ "Transmisja danych 4G została wstrzymana" "Komórkowa transmisja danych została wstrzymana" "Transmisja danych została wstrzymana" - "Ponieważ został osiągnięty ustawiony przez Ciebie limit danych, urządzenie wstrzymało użycie danych na pozostałą część tego cyklu.\n\nWznowienie może spowodować naliczenie opłat przez operatora." + "Osiągnięto ustawiony limit danych. Nie korzystasz już z komórkowej transmisji danych.\n\nJeśli włączysz ją ponownie, może zostać naliczona opłata za transmisję danych." "Wznów" "Brak internetu" "Wi-Fi: połączono" @@ -408,6 +408,7 @@ "Urządzenie może być monitorowane" "Profil może być monitorowany" "Sieć może być monitorowana" + "Sieć może być monitorowana" "Monitorowanie urządzeń" "Monitorowanie profilu" "Monitorowanie sieci" @@ -420,6 +421,7 @@ "VPN" "Masz połączenie z aplikacją %1$s, która może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe." "Masz połączenie z aplikacją %1$s, która może monitorować Twoją prywatną aktywność w sieci, w tym e-maile, aplikacje i strony internetowe." + "Masz połączenie z aplikacją %1$s, która może monitorować Twoją prywatną aktywność w sieci, w tym e-maile, aplikacje i strony internetowe." "Twoim profilem do pracy zarządza %1$s. Profil jest połączony z aplikacją %2$s, która może monitorować Twoją aktywność w sieci związaną z pracą, w tym e-maile, aplikacje i strony internetowe.\n\nAby dowiedzieć się więcej, skontaktuj się z administratorem." "Twoim profilem do pracy zarządza %1$s. Profil jest połączony z aplikacją %2$s, która może monitorować Twoją aktywność w sieci związaną z pracą, w tym e-maile, aplikacje i strony internetowe.\n\nMasz też połączenie z aplikacją %3$s, która może monitorować Twoją prywatną aktywność w sieci." "Twoim urządzeniem zarządza %1$s.\n\nAdministrator może monitorować ustawienia, firmowe uprawnienia dostępu, aplikacje, dane powiązane z urządzeniem i informacje o jego lokalizacji oraz nimi zarządzać.\n\nMasz połączenie z aplikacją %2$s, która może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe.\n\nAby dowiedzieć się więcej, skontaktuj się z administratorem." @@ -496,8 +498,6 @@ "Pokaż sekundy na zegarku na pasku stanu. Może mieć wpływ na czas pracy baterii." "Uporządkuj Szybkie ustawienia" "Pokaż jasność w Szybkich ustawieniach" - "Włącz dzielenie ekranu gestem przesunięcia w górę" - "Włącz dzielenie ekranu po wykonaniu gestu przesunięcia palcem w górę od przycisku Przegląd" "Eksperymentalne" "Włączyć Bluetooth?" "Aby połączyć klawiaturę z tabletem, musisz najpierw włączyć Bluetooth." @@ -655,4 +655,5 @@ "Otwórz ustawienia: %s." "Edytuj kolejność ustawień." "Strona %1$d z %2$d" + "Nie można wyciszyć ani zablokować powiadomień" diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 199dbad15371699a0f165ad5957c187bcee19671..25aeb5fbfb5c01239bd8f9b67f5f50a511188a09 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -240,7 +240,7 @@ "Os dados 4G foram pausados" "Os dados da rede celular foram pausados" "Os dados foram pausados" - "Como seu limite de dados definido foi atingido, o dispositivo pausou o uso de dados para o restante deste ciclo.\n\nA retomada pode gerar cobranças por parte da sua operadora." + "O limite de dados que você definiu foi atingido. Você não está mais usando os dados da rede celular.\n\nSe retomar o uso de dados, cobranças poderão ser aplicadas." "Retomar" "Sem conexão à Internet" "Wi-Fi conectado" @@ -406,6 +406,7 @@ "O dispositivo pode ser monitorado" "O perfil pode ser monitorado" "A rede pode ser monitorada" + "A rede pode ser monitorada" "Monitoramento de dispositivos" "Monitoramento de perfis" "Monitoramento de rede" @@ -418,6 +419,7 @@ "VPN" "Você está conectado a %1$s, que pode monitorar sua atividade na rede, incluindo e-mails, apps e websites." "Você está conectado a %1$s, que pode monitorar sua atividade pessoal na rede, incluindo e-mails, apps e websites." + "Você está conectado a %1$s, que pode monitorar sua atividade pessoal na rede, incluindo e-mails, apps e websites." "Seu perfil de trabalho é gerenciado por %1$s. Ele está conectado a %2$s, que pode monitorar sua atividade profissional na rede, incluindo e-mails, apps e websites.\n\nPara ver mais informações, entre em contato com seu administrador." "Seu perfil de trabalho é gerenciado por %1$s. Ele está conectado a %2$s, que pode monitorar sua atividade profissional na rede, incluindo e-mails, apps e websites.\n\nVocê também está conectado a %3$s, que pode monitorar sua atividade pessoal na rede." "Seu dispositivo é gerenciado por %1$s.\n\nSeu administrador pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao seu dispositivo e informações sobre localização do dispositivo.\n\nVocê está conectado a %2$s, que pode monitorar suas atividades de rede, incluindo e-mails, apps e websites.\n\nPara ver mais informações, entre em contato com seu administrador." @@ -494,8 +496,6 @@ "Mostrar segundos do relógio na barra de status. Pode afetar a duração da bateria." "Reorganizar \"Configurações rápidas\"" "Mostrar brilho nas \"Configurações rápidas\"" - "Ativar gesto para dividir a tela ao deslizar para cima" - "Ativa o gesto para entrar no modo de tela dividida deslizando a partir do botão \"Visão geral\"" "Experimentais" "Ativar o Bluetooth?" "Para conectar o teclado ao tablet, é preciso primeiro ativar o Bluetooth." @@ -653,4 +653,5 @@ "Abrir configurações de %s." "Editar ordem das configurações." "Página %1$d de %2$d" + "Não é possível silenciar ou bloquear as notificações" diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index d3d7f24903b6a1f26e19483960d7266d0361fb78..79f1c7d87226ab9da5536599a689383e912dbc1b 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -238,7 +238,7 @@ "Dados 4G em pausa" "Dados de redes móveis em pausa" "Dados em pausa" - "Uma vez que foi atingido o limite de dados definido, foi interrompida a utilização de dados no seu dispositivo durante o tempo restante deste ciclo.\n\nSe retomar a utilização, o seu operador pode efetuar cobranças." + "O limite de dados definido foi atingido. Já não está a utilizar dados móveis.\n\nSe retomar, podem aplicar-se custos relativos à utilização de dados." "Retomar" "Sem ligação internet" "Wi-Fi ligado" @@ -404,6 +404,7 @@ "O dispositivo pode ser monitorizado" "O perfil pode ser monitorizado" "A rede pode ser monitorizada" + "A rede pode ser monitorizada" "Monitorização de dispositivos" "Monitorização de perfis" "Monitorização da rede" @@ -416,6 +417,7 @@ "VPN" "Está ligado a %1$s, que pode monitorizar a atividade da rede, incluindo emails, aplicações e Websites." "Está ligado a %1$s, que pode monitorizar a atividade da rede pessoal, incluindo emails, aplicações e Websites." + "Está ligado ao %1$s, que pode monitorizar a atividade da rede pessoal, incluindo emails, aplicações e Websites." "O seu perfil de trabalho é gerido por %1$s. Está ligado a %2$s, que pode monitorizar a atividade da rede de trabalho, incluindo emails, aplicações e Websites.\n\nPara obter mais informações, contacte o administrador." "O seu perfil de trabalho é gerido por %1$s. Está ligado a %2$s, que pode monitorizar a atividade da rede de trabalho, incluindo emails, aplicações e Websites.\n\nTambém está ligado a %3$s, que pode monitorizar a atividade da rede pessoal." "O seu dispositivo é gerido por %1$s.\n\nO seu administrador pode monitorizar e gerir as definições, o acesso empresarial, as aplicações, os dados associados ao dispositivo e as informações de localização do dispositivo.\n\nEstá ligado a %2$s, que pode monitorizar a atividade da rede, incluindo emails, aplicações e Websites.\n\nPara obter mais informações, contacte o administrador." @@ -492,8 +494,6 @@ "Mostrar segundos do relógio na barra de estado. Pode afetar a autonomia da bateria." "Reorganizar as Definições rápidas" "Mostrar luminosidade nas Definições rápidas" - "Ativar gesto de deslize rápido para cima do ecrã dividido" - "Ativar o gesto para aceder ao ecrã dividido ao deslizar rapidamente para cima a partir do botão Vista geral" "Experimental" "Pretende ativar o Bluetooth?" "Para ligar o teclado ao tablet, tem de ativar primeiro o Bluetooth." @@ -651,4 +651,5 @@ "Abrir as definições de %s." "Editar a ordem das definições." "Página %1$d de %2$d" + "Não é possível silenciar ou bloquear as notificações" diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 199dbad15371699a0f165ad5957c187bcee19671..25aeb5fbfb5c01239bd8f9b67f5f50a511188a09 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -240,7 +240,7 @@ "Os dados 4G foram pausados" "Os dados da rede celular foram pausados" "Os dados foram pausados" - "Como seu limite de dados definido foi atingido, o dispositivo pausou o uso de dados para o restante deste ciclo.\n\nA retomada pode gerar cobranças por parte da sua operadora." + "O limite de dados que você definiu foi atingido. Você não está mais usando os dados da rede celular.\n\nSe retomar o uso de dados, cobranças poderão ser aplicadas." "Retomar" "Sem conexão à Internet" "Wi-Fi conectado" @@ -406,6 +406,7 @@ "O dispositivo pode ser monitorado" "O perfil pode ser monitorado" "A rede pode ser monitorada" + "A rede pode ser monitorada" "Monitoramento de dispositivos" "Monitoramento de perfis" "Monitoramento de rede" @@ -418,6 +419,7 @@ "VPN" "Você está conectado a %1$s, que pode monitorar sua atividade na rede, incluindo e-mails, apps e websites." "Você está conectado a %1$s, que pode monitorar sua atividade pessoal na rede, incluindo e-mails, apps e websites." + "Você está conectado a %1$s, que pode monitorar sua atividade pessoal na rede, incluindo e-mails, apps e websites." "Seu perfil de trabalho é gerenciado por %1$s. Ele está conectado a %2$s, que pode monitorar sua atividade profissional na rede, incluindo e-mails, apps e websites.\n\nPara ver mais informações, entre em contato com seu administrador." "Seu perfil de trabalho é gerenciado por %1$s. Ele está conectado a %2$s, que pode monitorar sua atividade profissional na rede, incluindo e-mails, apps e websites.\n\nVocê também está conectado a %3$s, que pode monitorar sua atividade pessoal na rede." "Seu dispositivo é gerenciado por %1$s.\n\nSeu administrador pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao seu dispositivo e informações sobre localização do dispositivo.\n\nVocê está conectado a %2$s, que pode monitorar suas atividades de rede, incluindo e-mails, apps e websites.\n\nPara ver mais informações, entre em contato com seu administrador." @@ -494,8 +496,6 @@ "Mostrar segundos do relógio na barra de status. Pode afetar a duração da bateria." "Reorganizar \"Configurações rápidas\"" "Mostrar brilho nas \"Configurações rápidas\"" - "Ativar gesto para dividir a tela ao deslizar para cima" - "Ativa o gesto para entrar no modo de tela dividida deslizando a partir do botão \"Visão geral\"" "Experimentais" "Ativar o Bluetooth?" "Para conectar o teclado ao tablet, é preciso primeiro ativar o Bluetooth." @@ -653,4 +653,5 @@ "Abrir configurações de %s." "Editar ordem das configurações." "Página %1$d de %2$d" + "Não é possível silenciar ou bloquear as notificações" diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index f59721a8ed33570050fef8973cfa7feed425fb96..408edf31892090eb30fd716184e29816bafa49f8 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -241,7 +241,7 @@ "Conexiunea de date 4G este întreruptă" "Conexiunea de date mobile este întreruptă" "Conexiunea de date este întreruptă" - "Deoarece limita setată pentru date a fost atinsă, dispozitivul a întrerupt utilizarea datelor pentru restul acestui ciclu.\n\nReluarea utilizării de date poate genera aplicarea de taxe de către operator." + "A fost atinsă limita de date setată. Datele mobile nu mai sunt folosite \n\nDacă reluați, este posibil să se aplice taxe pentru utilizarea datelor." "Reluați" "Fără conex. internet" "Wi-Fi conectat" @@ -329,7 +329,7 @@ "Niciun element recent" "Ați șters tot" "Informații despre aplicație" - "fixare pe ecran" + "fixarea ecranului" "căutare" "%s nu a putut porni." "Aplicația %s este dezactivată în modul sigur." @@ -408,6 +408,7 @@ "Dispozitivul poate fi monitorizat" "Profilul poate fi monitorizat" "Rețeaua poate fi monitorizată" + "Este posibil ca rețeaua să fie monitorizată" "Monitorizarea dispozitivului" "Monitorizarea profilului" "Monitorizarea rețelei" @@ -420,6 +421,7 @@ "VPN" "Sunteți conectat(ă) la %1$s, care vă poate monitoriza activitatea în rețea, inclusiv e-mailurile, aplicațiile și site-urile." "Sunteți conectat(ă) la %1$s, care vă poate monitoriza activitatea în rețeaua personală, inclusiv e-mailurile, aplicațiile și site-urile." + "V-ați conectat la aplicația %1$s, care vă poate monitoriza activitatea personală în rețea, inclusiv e-mailurile, aplicațiile și site-urile accesate." "Profilul de serviciu este gestionat de %1$s. Este conectat la %2$s, care vă poate monitoriza activitatea în rețeaua de serviciu, inclusiv e-mailurile, aplicațiile și site-urile.\n\nPentru mai multe informații, contactați administratorul." "Profilul de serviciu este gestionat de %1$s. Este conectat la %2$s, care vă poate monitoriza activitatea în rețeaua de serviciu, inclusiv e-mailurile, aplicațiile și site-urile.\n\nDe asemenea, sunteți conectat(ă) la %3$s, care vă poate monitoriza activitatea în rețeaua personală." "Dispozitivul este gestionat de %1$s.\n\nAdministratorul poate monitoriza și gestiona setările, accesul la rețeaua companiei, aplicațiile, datele asociate cu dispozitivul și informațiile privind locația dispozitivului.\n\nSunteți conectat(ă) la %2$s, care vă poate monitoriza activitatea în rețea, inclusiv e-mailurile, aplicațiile și site-urile.\n\nPentru mai multe informații, contactați administratorul." @@ -496,8 +498,6 @@ "Afișează secundele pe ceas în bara de stare. Poate afecta autonomia bateriei." "Rearanjați Setările rapide" "Afișați luminozitatea în Setările rapide" - "Activați gestul de accesare a ecranului împărțit prin glisare în sus" - "Activați gestul de accesare a ecranului împărțit prin glisarea în sus de la butonul Recente" "Experimentale" "Activați Bluetooth?" "Pentru a conecta tastatura la tabletă, mai întâi trebuie să activați Bluetooth." @@ -655,4 +655,5 @@ "Deschideți setările %s." "Editați ordinea setărilor." "Pagina %1$d din %2$d" + "Notificările nu pot fi dezactivate sau blocate" diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index bee7eedcfbf369cfa67ea5460c898553e207d613..7efd8fa63a2f4b584645d3c4ca9fa9ec92a1bf85 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -242,7 +242,7 @@ "Передача данных 4G приостановлена" "Передача мобильных данных приостановлена" "Передача данных приостановлена" - "Передача данных выключена до конца цикла, поскольку достигнут установленный вами лимит.\n\nЕсли вы возобновите ее, оператор может взимать плату за дополнительный расход трафика." + "Достигнут установленный вами лимит на передачу мобильных данных.\n\nЕсли вы продолжите, может взиматься дополнительная плата." "Возобновить" "Нет интернет-подключения" "Wi-Fi подключено" @@ -410,6 +410,7 @@ "Устройство может контролироваться" "Действия в профиле могут отслеживаться" "Сеть может отслеживаться" + "Сеть может отслеживаться" "Отслеживание устройств" "Мониторинг профиля" "Отслеживание сетей" @@ -422,6 +423,7 @@ "Сеть VPN" "Запущено приложение \"%1$s\", которое может отслеживать ваши действия в Интернете, включая работу с электронной почтой, приложениями и веб-сайтами." "Запущено приложение \"%1$s\", которое может отслеживать ваши действия в Интернете (выполняемые в личном профиле), включая работу с электронной почтой, приложениями и веб-сайтами." + "Запущено приложение \"%1$s\", которое может отслеживать ваши действия в сети, включая работу с электронной почтой, приложениями и веб-сайтами." "Вашим рабочим профилем управляет \"%1$s\". Приложение \"%2$s\" может отслеживать ваши действия в Интернете, включая работу с электронной почтой, приложениями и веб-сайтами.\n\nЗа дополнительной информацией обратитесь к своему администратору." "Вашим рабочим профилем управляет \"%1$s\". Приложение \"%2$s\" может отслеживать ваши действия в Интернете, включая работу с электронной почтой, приложениями и веб-сайтами.\n\nПриложение \"%3$s\" может отслеживать ваши действия в Интернете, выполняемые в личном профиле." "Вашим корпоративным профилем управляет %1$s.\n\nАдминистратор может управлять настройками, корпоративным доступом, приложениями, данными на вашем устройстве, в том числе геоданными, а также просматривать соответствующие сведения.\n\nПриложение %2$s также может отслеживать ваши действия в сети, включая работу с электронной почтой, приложениями и веб-сайтами.\n\nЗа подробностями обратитесь к своему администратору." @@ -498,8 +500,6 @@ "Показывать в строке состояния время с точностью до секунды (заряд батареи может расходоваться быстрее)." "Изменить порядок Быстрых настроек" "Добавить яркость в Быстрые настройки" - "Разделять экран пролистыванием вверх" - "Включить разделение экрана пролистыванием вверх с кнопки \"Обзор\"" "Экспериментальная функция" "Подключение по Bluetooth" "Чтобы подключить клавиатуру к планшету, включите Bluetooth." @@ -657,4 +657,5 @@ "Открыть настройки %s." "Изменить порядок быстрых настроек." "Страница %1$d из %2$d" + "Уведомления нельзя блокировать и показывать без звука" diff --git a/packages/SystemUI/res/values-si-rLK/strings.xml b/packages/SystemUI/res/values-si-rLK/strings.xml index 0811f5e77adbef1b560b5b073274fe8d59fc4036..749231d54782ec511fd3c0f075a63ec0ffd392a7 100644 --- a/packages/SystemUI/res/values-si-rLK/strings.xml +++ b/packages/SystemUI/res/values-si-rLK/strings.xml @@ -238,7 +238,7 @@ "4G දත්ත විරාම කර ඇත" "සෙලියුලර් දත්ත විරාම කර ඇත" "දත්ත විරාම කර ඇත" - "ඔබ සකසා ඇති දත්ත සීමාවට ළඟා වූ නිසා, උපාංගය මගින් මෙම චක්‍රයේ ඉතිරිය සඳහා දත්ත භාවිතය විරාම කර ඇත. \n\nනැවත පටන් ගැනීමෙන් ඔබගේ වාහකයෙන් අය කිරීම් වලට පොළඹවනු ඇත." + "ඔබ සැකසූ දත්ත සීමාව ළඟා වී ඇත. ඔබ තවදුරටත් සෙලියුලර් දත්ත භාවිත නොකරයි. \n\nඔබ නැවත ආරම්භ කළහොත්, දත්ත භාවිතය සඳහා ගාස්තු අදාළ විය හැකිය." "නැවත පටන්ගන්න" "අන්තර්ජාල සම්බන්ධතාවයක් නැත" "Wi-Fi සම්බන්ධිතයි" @@ -404,6 +404,7 @@ "ඇතැම් විට උපාංගය නිරීක්ෂණය විය හැක" "ඇතැම් විට පැතිකඩ නිරීක්ෂණය කරන ලදි" "ඇතැම් විට ජාලය නිරීක්ෂණය විය හැක" + "ඇතැම් විට ජාලය නිරීක්ෂණය විය හැක" "උපාංගය නිරීක්ෂණය" "පැතිකඩ නිරීක්ෂණය කිරීම" "ජාල නිරීක්ෂණය" @@ -416,6 +417,7 @@ "VPN" "ඊ-තැපැල්, යෙදුම් සහ වෙබ් අඩවි ඇතුළු ඔබේ ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කළ හැකි, %1$s වෙත ඔබ සම්බන්ධ වී ඇත." "ඊ-තැපැල්, යෙදුම් සහ වෙබ් අඩවි ඇතුළු ඔබේ පෞද්ගලික ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කළ හැකි, %1$s වෙත ඔබ සම්බන්ධ වී ඇත." + "ඊ-තැපැල්, යෙදුම් සහ වෙබ් අඩවි ඇතුළු ඔබේ පෞද්ගලික ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කළ හැකි, %1$s වෙත ඔබ සම්බන්ධ වී ඇත." "ඔබේ කාර්යාල පැතිකඩ කළමනාකරණය කරන්නේ %1$s විසිනි. එය ඊ-තැපැල්, යෙදුම් සහ වෙබ් අඩවි ඇතුළු ඔබේ කාර්යාල ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කළ හැකි, %2$s වෙත ඔබ සම්බන්ධ වී ඇත.\n\nවැඩිදුර විස්තර සඳහා, ඔබේ පරිපාලක අමතන්න." "ඔබේ කාර්යාල පැතිකඩ කළමනාකරණය කරන්නේ %1$s විසිනි. එය ඊ-තැපැල්, යෙදුම් සහ වෙබ් අඩවි ඇතුළු ඔබේ කාර්යාල ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කළ හැකි, %2$s, වෙත ඔබ සම්බන්ධ වී ඇත.\n\nඔබ ඔබේ පෞද්ගලික ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කළ හැකි, %3$s වෙතද සම්බන්ධ වී ඇත." "ඔබේ උපාංගය කළමනාකරණය කරන්නේ %1$s විසිනි.\n\nඔබේ පරිපාලකට ඔබේ උපාංගය හා සම්බන්ධිත සැකසීම්, ආයතනික ප්‍රවේශය, යෙදුම්, දත්ත සහ ඔබේ උපාංගය තිබෙන ස්ථානයේ තොරතුරු නිරීක්ෂණය කිරීමට සහ කළමනාකරණය කිරීමට හැකිය.\n\nඔබ ඊ-තැපැල්, යෙදුම්, සහ වෙබ් අඩවි ඇතුළු ඔබේ ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කිරීමට හැකි %2$s, වෙතද සම්බන්ධව ඇත.\n\nවැඩිදුර තොරතුරු සඳහා, ඔබගේ පරිපාලක අමතන්න." @@ -492,8 +494,6 @@ "තත්ත්ව තීරුවෙහි ඔරලෝසු තත්පර පෙන්වන්න. බැටරි ආයු කාලයට බලපෑමට හැකිය." "ඉක්මන් සැකසීම් යළි පිළිවෙළට සකසන්න" "ඉක්මන් සැකසීම්වල දීප්තිය පෙන්වන්න" - "බෙදුම්-තිරය ඉහළට-ස්වයිප් කිරීමේ අභිනය සබල කරන්න" - "දළ විශ්ලේෂණ බොත්තම හරහා ඉහළට ස්වයිප් කිරීමෙන් බෙදුම් තිරයට ඇතුළු වීමට ඉඟිය සබල කිරීම" "පරීක්ෂණාත්මක" "බ්ලූටූත් ක්‍රියාත්මක කරන්නද?" "ඔබේ යතුරු පුවරුව ඔබේ ටැබ්ලට් පරිගණකයට සම්බන්ධ කිරීමට, ඔබ පළමුව බ්ලූටූත් ක්‍රියාත්මක කළ යුතුය." @@ -651,4 +651,5 @@ "%s සැකසීම් විවෘත කරන්න." "සැකසීම්වල අනුපිළිවෙළ සංංස්කරණය කරන්න." "%2$d න් %1$d" + "දැනුම්දීම් නිහඬ හෝ අවහිර කළ නොහැකිය" diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 304c9a06eb35ec621337fca086be66e9fb376ab7..8dd25693fa580fd23e2909bc537084f873001deb 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -242,7 +242,7 @@ "Dátové prenosy 4G sú pozastavené" "Mobilné dáta sú pozastavené" "Dáta sú pozastavené" - "Keďže ste dosiahli nastavený limit pre mobilné dáta, na zariadení bola pre zvyšok tohto cyklu pozastavená spotreba dát.\n\nJej opätovné spustenie môže mať za následok účtovanie poplatkov vaším operátorom." + "Dosiahli ste nastavený limit dát. Už nepoužívate mobilné dátové pripojenie.\n\nAk ho však obnovíte, môžu vám byť účtované poplatky za spotrebu dát." "Znova spustiť" "Bez prip. na Internet" "Wi-Fi: pripojené" @@ -410,6 +410,7 @@ "Zariadenie môže byť sledované" "Profil môže byť monitorovaný" "Sieť môže byť sledovaná" + "Sieť môže byť monitorovaná" "Sledovanie zariadenia" "Monitorovanie profilu" "Sledovanie siete" @@ -422,6 +423,7 @@ "VPN" "Ste pripojený/-á k aplikácii %1$s, ktorá môže sledovať vašu aktivitu v sieti vrátane e-mailových správ, aplikácií a webových stránok." "Ste pripojený/-á k aplikácii %1$s, ktorá môže sledovať vašu osobnú aktivitu v sieti vrátane e-mailových správ, aplikácií a webových stránok." + "Ste pripojený/-á k aplikácii %1$s, ktorá môže sledovať vašu osobnú aktivitu v sieti vrátane e-mailových správ, aplikácií a webových stránok." "Váš pracovný profil spravuje organizácia %1$s. Je pripojený k aplikácii %2$s, ktorá môže sledovať vašu pracovnú aktivitu v sieti vrátane e-mailových správ, aplikácií a webových stránok.\n\nĎalšie informácie získate od svojho správcu." "Váš pracovný profil spravuje organizácia %1$s. Je pripojený k aplikácii %2$s, ktorá môže sledovať vašu pracovnú aktivitu v sieti vrátane e-mailových správ, aplikácií a webových stránok.\n\nSte tiež pripojený/-á k aplikácii %3$s, ktorá môže sledovať vašu osobnú aktivitu v sieti." "Vaše zariadenie spravuje organizácia %1$s.\n\nSprávca môže sledovať a spravovať nastavenia, podnikový prístup, aplikácie a údaje priradené k vášmu účtu, ako aj informácie o polohe zariadenia.\n\nSte pripojený/-á k aplikácii %2$s, ktorá môže sledovať vašu aktivitu v sieti vrátane e-mailových správ, aplikácii a webových stránok.\n\nĎalšie informácie získate od svojho správcu." @@ -498,8 +500,6 @@ "Zobrazí sekundy v stavovom riadku. Môže to ovplyvňovať výdrž batérie." "Zmeniť usporiadanie Rýchlych nastavení" "Zobraziť jas v Rýchlych nastaveniach" - "Aktivovať rozdelenú obrazovku prejdením prstom" - "Umožňuje aktivovať rozdelenú obrazovku prejdením prstom nahor od tlačidla Prehľad" "Experimentálne" "Zapnúť Bluetooth?" "Ak chcete klávesnicu pripojiť k tabletu, najprv musíte zapnúť Bluetooth." @@ -571,7 +571,7 @@ "Prehliadač" "Kontakty" "E-mail" - "Okamžité správy" + "Čet" "Hudba" "YouTube" "Kalendár" @@ -657,4 +657,5 @@ "Otvoriť nastavenia %s" "Upraviť poradie nastavení" "Strana %1$d%2$d" + "Upozornenia nie je možné stlmiť ani blokovať" diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index a8bc3d1a5dc2977c70a156c1e7289408f53d8a2f..fc81a23b8abf33d0e9f0b0bc6428434f779efb84 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -242,7 +242,7 @@ "Prenos podatkov v omrežju 4G je zaustavljen" "Prenos mobilnih podatkov je zaustavljen" "Prenos podatkov je zaustavljen" - "Dosegli ste nastavljeno omejitev količine prenesenih podatkov, zato je naprava zaustavila porabo podatkov za preostanek cikla.\n\nČe nadaljujete s porabo, boste morda morali plačati stroške operaterju." + "Dosegli ste nastavljeno omejitev porabe podatkov. Prenosa podatkov v mobilnih omrežjih ne uporabljate več.\n\nČe nadaljujete, lahko nastanejo stroški prenosa podatkov." "Nadaljuj" "Ni internetne povez." "Wi-Fi povezan" @@ -410,6 +410,7 @@ "Naprava je morda nadzorovana" "Profil je morda nadziran" "Omrežje je lahko nadzorovano" + "Omrežje je morda nadzorovano" "Nadzor naprave" "Nadzor nad profilom" "Nadzor omrežja" @@ -422,6 +423,7 @@ "VPN" "Povezani ste z aplikacijo %1$s, ki lahko nadzira omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti." "Povezani ste z aplikacijo %1$s, ki lahko nadzira vašo osebno omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti." + "Povezani ste z aplikacijo %1$s, ki lahko nadzira vašo osebno omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti." "Delovni profil upravlja organizacija %1$s. Povezan je z aplikacijo %2$s, ki lahko nadzira vašo delovno omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti.\n\nČe želite več informacij, se obrnite na skrbnika." "Delovni profil upravlja organizacija %1$s. Povezan je z aplikacijo %2$s, ki lahko nadzira vašo delovno omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti.\n\nPovezani ste tudi z aplikacijo %3$s, ki lahko nadzira vašo osebno omrežno dejavnost." "Napravo upravlja organizcija %1$s.\n\nSkrbnik lahko nadzira in upravlja nastavitve, dostop za podjetje, aplikacije, podatke, povezane z napravo, in podatke o lokaciji naprave.\n\nPovezani ste z aplikacijo %2$s, ki lahko nadzira omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti.\n\nČe želite več informacij, se obrnite na skrbnika." @@ -498,8 +500,6 @@ "Prikaže sekunde pri uri v vrstici stanja. To lahko vpliva na čas delovanja pri akumulatorskem napajanju." "Preuredi hitre nastavitve" "Prikaz svetlosti v hitrih nastavitvah" - "Omogočanje poteze za razdeljen zaslon z vlečenjem navzgor" - "Omogočanje poteze za vklop razdeljenega zaslona, tako da uporabnik od gumba za pregled povleče s prstom navzgor" "Poskusno" "Želite vklopiti Bluetooth?" "Če želite povezati tipkovnico in tablični računalnik, vklopite Bluetooth." @@ -657,4 +657,5 @@ "Odpri nastavitve za %s." "Uredi vrstni red nastavitev." "%1$d. stran od %2$d" + "Obvestil ni mogoče utišati ali blokirati" diff --git a/packages/SystemUI/res/values-sq-rAL/strings.xml b/packages/SystemUI/res/values-sq-rAL/strings.xml index 4bc29aa610dd9431598df56aea2910b08990788d..68f56852d98df438259a0df1d2d5e5596f58c43c 100644 --- a/packages/SystemUI/res/values-sq-rAL/strings.xml +++ b/packages/SystemUI/res/values-sq-rAL/strings.xml @@ -238,7 +238,7 @@ "Të dhënat 4G janë ndërprerë" "Të dhënat celulare janë ndërprerë" "Të dhënat janë ndërprerë" - "Pajisja jote ka ndërprerë përdorimin e të dhënave për pjesën e mbetur të ciklit sepse është arritur kufiri i caktuar i të dhënave.\n\nVazhdimi mund të sjellë tarifa nga operatori celular." + "Kufiri i të dhënave që ke caktuar është arritur. Nuk po përdor më të dhënat celulare.\n\nNëse vazhdon, mund të zbatohen tarifa për përdorimin e të dhënave." "Rifillo" "Nuk ka lidhje interneti" "Wi-Fi është i lidhur" @@ -404,6 +404,7 @@ "Pajisja mund të monitorohet" "Profili mund të monitorohet" "Rrjeti mund të jetë i monitoruar" + "Rrjeti mund të jetë i monitoruar" "Monitorimi i pajisjes" "Monitorimi i profilit" "Monitorimi i rrjetit" @@ -416,6 +417,7 @@ "VPN" "Je i lidhur me aplikacionin %1$s, i cili mund të monitorojë aktivitetin tënd në rrjet përfshirë mailet, aplikacionet dhe sajtet e uebit." "Je i lidhur me aplikacionin %1$s, i cili mund të monitorojë aktivitetin tënd personal në rrjet, përfshirë mailet, aplikacionet dhe sajtet e uebit." + "Je i lidhur me aplikacionin %1$s, i cili mund të monitorojë aktivitetin tënd personal në rrjet, përfshirë mailet, aplikacionet dhe sajtet e uebit." "Profili yt i punës menaxhohet nga %1$s. Ai është i lidhur me %2$s, i cili mund të monitorojë aktivitetin tënd të punës në rrjet, përfshirë mailet, aplikacionet dhe sajtet e uebit.\n\nPër më shumë informacione, kontakto me administratorin tënd." "Profili yt i punës menaxhohet nga %1$s. Ai është i lidhur me %2$s, i cili mund të monitorojë aktivitetin tënd të punës në rrjet, përfshirë mailet, aplikacionet dhe sajtet e uebit.\n\nJe lidhur gjithashtu edhe me %3$s, i cili mund të monitorojë aktivitetin tënd personal në rrjet." "Pajisja jote menaxhohet nga %1$s.\n\nAdministratori mund të monitorojë dhe menaxhojë cilësimet, qasjen e korporatës, aplikacionet, të dhënat që shoqërojnë pajisjen tënde si dhe informacionin e vendndodhjes së pajisjes.\n\nJe i lidhur me %2$s, që mund të monitorojë aktivitetin tënd të punës në rrjet përfshirë mail-at, aplikacionet dhe faqet e internetit.\n\nPër më shumë informacion, kontakto me administratorin tënd." @@ -492,8 +494,6 @@ "Trego sekondat e orës në shiritin e statusit. Mund të ndikojë te jeta e baterisë." "Risistemo Cilësimet e shpejta" "Shfaq ndriçimin te Cilësimet e shpejta" - "Aktivizo gjestin e rrëshqitjes lart për ekranin e ndarë" - "Aktivizo gjestin për të hyrë tek ekrani i ndarë duke rrëshqitur lart nga butoni \"Përmbledhja\"" "Eksperimentale" "Të aktivizohet \"bluetooth-i\"?" "Për të lidhur tastierën me tabletin, në fillim duhet të aktivizosh \"bluetooth-in\"." @@ -651,4 +651,5 @@ "Hap cilësimet e %s." "Modifiko rendin e cilësimeve." "Faqja %1$d nga %2$d" + "Njoftimet nuk mund të vendosen në heshtje ose të bllokohen" diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 16ae7e2ec3aaa9e047792e53413a8b4475e177ed..d313054956693bdc69f0d817da03a58fd28d2a91 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -239,7 +239,7 @@ "4G подаци су паузирани" "Мобилни подаци су паузирани" "Подаци су паузирани" - "Због тога што сте достигли подешено ограничење за податке, уређај је паузирао коришћење података током остатка овог циклуса.\n\nАко наставите, мобилни оператер може да вам наплати додатне трошкове." + "Ограничење потрошње података које сте подесили је достигнуто. Више не користите мобилне податке.\n\nАко наставите, можда ће бити наплаћени трошкови за потрошњу података." "Настави" "Нема интернет везе" "Wi-Fi је повезан" @@ -406,6 +406,7 @@ "Уређај се можда надгледа" "Профил се можда надгледа" "Мрежа се можда надгледа" + "Мрежа се можда надгледа" "Надгледање уређаја" "Надгледање профила" "Надгледање мреже" @@ -418,6 +419,7 @@ "VPN" "Повезани сте са апликацијом %1$s, која може да надгледа активности на мрежи, укључујући имејлове, апликације и веб-сајтове." "Повезани сте са апликацијом %1$s, која може да надгледа активности на личној мрежи, укључујући имејлове, апликације и веб-сајтове." + "Повезани сте са апликацијом %1$s, која може да надгледа активности на личној мрежи, укључујући имејлове, апликације и веб-сајтове." "Профилом за Work управља %1$s. Повезан је са апликацијом %2$s, која може да надгледа активности на пословној мрежи, укључујући имејлове, апликације и веб-сајтове.\n\nВише информација потражите од администратора." "Профилом за Work управља %1$s. Повезан је са апликацијом %2$s, која може да надгледа активности на пословној мрежи, укључујући имејлове, апликације и веб-сајтове.\n\nПовезани сте и са апликацијом %3$s, која може да надгледа активности на личној мрежи." "Уређајем управља %1$s.\n\nАдминистратор може да надгледа подешавања, корпоративни приступ, апликације, податке повезане са уређајем и информације о локацији уређаја, као и да управља њима.\n\nПовезани сте са апликацијом %2$s, која може да надгледа активности на мрежи, укључујући имејлове, апликације и веб-сајтове.\n\nВише информација потражите од администратора." @@ -494,8 +496,6 @@ "Секунде на сату се приказују на статусној траци. То може да утиче на трајање батерије." "Преуреди Брза подешавања" "Прикажи осветљеност у Брзим подешавањима" - "Омогући покрет за превлачење нагоре за подељени екран" - "Омогућава покрет за прелазак на подељени екран превлачењем нагоре од дугмета Преглед" "Експериментално" "Желите ли да укључите Bluetooth?" "Да бисте повезали тастатуру са таблетом, прво морате да укључите Bluetooth." @@ -653,4 +653,5 @@ "Отвори подешавања за %s." "Измени редослед подешавања." "%1$d. страна од %2$d" + "Звук обавештења не може да се искључи нити она могу да се блокирају" diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index e6988d702137ede9ff3ebc26fa5fc4be7a52b82f..8176422c8a7abc510f0f9063ec7285dc4469ca3e 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -238,7 +238,7 @@ "4G-data har pausats" "Mobildata har pausats" "Dataanvändningen har pausats" - "Eftersom du har nått den angivna datagränsen har dataanvändningen pausats under resten av perioden.\n\nOm du återupptar dataanvändningen kan avgifter från operatören tillkomma." + "Den angivna datagränsen har uppnåtts. Du använder inte längre mobildata.\n\nOm du fortsätter kan avgifter för dataanvändning tillkomma." "Återuppta" "Ingen anslutning" "Wi-Fi-ansluten" @@ -331,7 +331,7 @@ "%s är inaktiverad i säkert läge." "Rensa alla" "Appen har inte stöd för delad skärm." - "Dra här om du vill dela upp skärmen" + "Dra hit för att dela upp skärmen" "Dela horisontellt" "Dela vertikalt" "Dela anpassad" @@ -352,7 +352,7 @@ "+%d" "Mindre brådskande aviseringar nedan" "Tryck igen för att öppna" - "Svep uppåt om du vill låsa upp" + "Svep uppåt för att låsa upp" "Svep från ikonen och öppna telefonen" "Svep från ikonen och öppna röstassistenten" "Svep från ikonen och öppna kameran" @@ -404,6 +404,7 @@ "Enheten kan övervakas" "Det kan hända att profilen övervakas" "Nätverket kan vara övervakat" + "Nätverket kan vara övervakat" "Enhetsövervakning" "Profilövervakning" "Nätverksövervakning" @@ -416,6 +417,7 @@ "VPN" "Du är ansluten till %1$s, som kan bevaka aktivitet på nätverket, inklusive e-post, appar och webbplatser." "Du är ansluten till %1$s, som kan bevaka din privata aktivitet på nätverket, inklusive e-post, appar och webbplatser." + "Du är ansluten till %1$s som kan övervaka din privata aktivitet på nätverket, inklusive e-postmeddelanden, appar och webbplatser." "Jobbprofilen hanteras av %1$s. Den är ansluten till %2$s, som kan hantera aktivitet på arbetsplatsens nätverk, inklusive e-post, appar och webbplatser.\n\nKontakta administratören för mer information." "Jobbprofilen hanteras av %1$s. Den är ansluten till %2$s, som kan hantera aktivitet på arbetsplatsens nätverk, inklusive e-post, appar och webbplatser.\n\nDu är även ansluten till %3$s, som kan hantera privat aktivitet på nätverket." "Enheten hanteras av %1$s.\n\nAdministratören kan bevaka och hantera inställningar, företagsåtkomst, appar, data som är kopplad till enheten och enhetens platsuppgifter.\n\nDu är ansluten till %2$s, som kan övervaka aktivitet på nätverket, inklusive e-post. appar och webbplatser .\n\nKontakta administratören för mer information." @@ -492,8 +494,6 @@ "Visa klocksekunder i statusfältet. Detta kan påverka batteritiden." "Ordna snabbinställningarna" "Visa ljusstyrka i snabbinställningarna" - "Aktivera delad skärm när du sveper uppåt" - "Aktivera en rörelse som delar skärmen när du sveper uppåt från knappen Översikt" "Experimentella" "Vill du aktivera Bluetooth?" "Om du vill ansluta tangentbordet till surfplattan måste du först aktivera Bluetooth." @@ -651,4 +651,5 @@ "Öppna %s-inställningarna." "Ändra ordning på inställningarna." "Sida %1$d av %2$d" + "Det går inte att tysta eller blockera aviseringar" diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 50c668532adcc3d14611f08e7c5fdbf7b345655d..f8b825ad868b056285aa595627aaf7c1e67e060c 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -238,7 +238,7 @@ "Data ya 4G imesitishwa" "Data ya simu ya mkononi imesitishwa" "Data imesitishwa" - "Kwa sababu ulifikia kiwango cha juu cha data kilichowekwa, kifaa kimesitisha matumizi ya data katika awamu hii iliyosalia.\n\n Kuendelea kunaweza kusababisha malipo kwa mtoa huduma wako." + "Umefikia kikomo cha data ulichoweka. Hutaweza kutumia tena data ya simu ya mkononi.\n\nIkiwa utaendelea, huenda ukatozwa ada za matumizi ya data." "Endelea" "Hakuna muunganisho wa mtandao" "Mtandao-hewa umeunganishwa" @@ -404,6 +404,7 @@ "Huenda kifaa kinafuatiliwa" "Huenda wasifu ukafuatiliwa" "Huenda mtandao unafuatiliwa" + "Huenda mtandao unafuatiliwa" "Ufuatiliaji wa kifaa" "Ufuatiliaji wasifu" "Ufuatiliaji wa mtandao" @@ -416,6 +417,7 @@ "VPN" "Umeunganishwa kwenye %1$s, ambayo inaweza kufuatilia shughuli za mtandao wako, ikiwa ni pamoja na barua pepe, programu na tovuti." "Umeunganishwa kwenye %1$s, ambayo inaweza kufuatilia shughuli za mtandao wako, ikiwa ni pamoja na barua pepe, programu na tovuti." + "Umeunganishwa kwenye %1$s, ambayo inaweza kufuatilia shughuli za mtandao wako, ikiwa ni pamoja na barua pepe, programu na tovuti." "Wasifu wako wa kazini unasimamiwa na %1$s. Wasifu huu umeunganishwa kwenye %2$s, ambayo inaweza kufuatilia shughuli za mtandao wako, ikiwa ni pamoja na barua pepe, programu, na tovuti. \n\nKwa maelezo zaidi, wasiliana na msimamizi wako." "Wasifu wako wa kazini unasimamiwa na %1$s. Wasifu huu umeunganishwa kwenye %2$s, ambayo inaweza kufuatilia mtandao wako wa kazini, ikiwa ni pamoja na barua pepe, programu na tovuti. \n\n Wewe pia umeunganishwa kwenye %3$s, ambayo inaweza kufuatilia shughuli za mtandao wako kibinafsi." "Kifaa chako kinasimamiwa na %1$s. \n\nMsimamizi wako anaweza kufuatilia na kudhibiti mipangilio, ufikiaji wa kampuni, programu, data inayohusiana na kifaa chako, na maelezo ya mahali kilipo kifaa chako. \n\n Umeuganishwa kwenye %2$s, ambayo inaweza kufuatilia shughuli ya mtandao wako, ikiwa ni pamoja na barua pepe, programu, na tovuti. \n\n Kwa maelezo zaidi, wasiliana na msimamizi wako." @@ -492,8 +494,6 @@ "Onyesha sekunde za saa katika sehemu ya arifa. Inaweza kuathiri muda wa matumizi ya betri." "Panga Upya Mipangilio ya Haraka" "Onyesha unga\'avu katika Mipangilio ya Haraka" - "Ruhusu kugawanya skrini kwa ishara ya kutelezesha kidole juu" - "Washa kipengele cha ishara ili utumie skrini iliyogawanywa kwa kutelezesha kidole juu kutoka kitufe cha Muhtasari" "Ya majaribio" "Je, ungependa kuwasha Bluetooth?" "Ili uunganishe Kibodi yako kwenye kompyuta yako kibao, lazima kwanza uwashe Bluetooth." @@ -651,4 +651,5 @@ "Fungua mipangilio ya %s." "Badilisha orodha ya mipangilio." "Ukurasa wa %1$d kati ya %2$d" + "Huwezi kuzima wala kuzuia arifa" diff --git a/packages/SystemUI/res/values-ta-rIN/strings.xml b/packages/SystemUI/res/values-ta-rIN/strings.xml index f0cb53044a9f0568c534ea833b112ee221fe1141..0080f8e5301e04d00d9a760f7a5c8ac7972f3b9f 100644 --- a/packages/SystemUI/res/values-ta-rIN/strings.xml +++ b/packages/SystemUI/res/values-ta-rIN/strings.xml @@ -238,7 +238,7 @@ "4G டேட்டா இடைநிறுத்தப்பட்டது" "செல்லுலார் தரவு இடைநிறுத்தப்பட்டது" "தரவு இடைநிறுத்தப்பட்டது" - "அமைக்கப்பட்ட தரவின் வரம்பை அடைந்துவிட்டதால், இந்தச் சுழற்சியின் மீதமுள்ள நாட்களுக்கான தரவுப் பயன்பாட்டைச் சாதனம் இடைநிறுத்தியுள்ளது.\n\nமீண்டும் தொடங்குவது, மொபைல் நிறுவனக் கட்டணங்களுக்கு உட்படுத்தலாம்." + "நீங்கள் அமைத்த தரவு வரம்பை அடைந்துவிட்டீர்கள். இப்போது செல்லுலார் தரவைப் பயன்படுத்த முடியாது.\n\nமீண்டும் தொடங்கினால், தரவுப் பயன்பாட்டிற்குக் கட்டணங்கள் விதிக்கப்படலாம்." "மீண்டும் தொடங்கு" "இணைய இணைப்பு இல்லை" "வைஃபை இணைக்கப்பட்டது" @@ -404,6 +404,7 @@ "சாதனம் கண்காணிக்கப்படலாம்" "சுயவிவரம் கண்காணிக்கப்படலாம்" "நெட்வொர்க் கண்காணிக்கப்படலாம்" + "நெட்வொர்க் கண்காணிக்கப்படலாம்" "சாதனத்தைக் கண்காணித்தல்" "சுயவிவரத்தைக் கண்காணித்தல்" "நெட்வொர்க்கைக் கண்காணித்தல்" @@ -416,6 +417,7 @@ "VPN" "%1$s உடன் இணைக்கப்பட்டுள்ளீர்கள். இந்தப் பயன்பாட்டால், மின்னஞ்சல்கள், பயன்பாடுகள் மற்றும் இணையதளங்கள் உட்பட உங்கள் நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்க முடியும்." "%1$s உடன் இணைக்கப்பட்டுள்ளீர்கள். இந்தப் பயன்பாட்டால், மின்னஞ்சல்கள், பயன்பாடுகள் மற்றும் இணையதளங்கள் உட்பட உங்கள் தனிப்பட்ட நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்க முடியும்." + "%1$s உடன் இணைக்கப்பட்டுள்ளீர்கள். இந்தப் பயன்பாட்டால் மின்னஞ்சல்கள், பயன்பாடுகள், இணையதளங்கள் உட்பட உங்கள் தனிப்பட்ட நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்க முடியும்." "உங்கள் பணி சுயவிவரத்தை %1$s நிர்வகிக்கிறது. %2$s உடன் இணைக்கப்பட்டதால், மின்னஞ்சல்கள், பயன்பாடுகள் மற்றும் இணையதளங்கள் உட்பட உங்கள் பணியிட நெட்வொர்க் செயல்பாட்டை அதனால் கண்காணிக்க முடியும்.\n\nகூடுதல் தகவலுக்கு, நிர்வாகியைத் தொடர்புகொள்ளவும்." "உங்கள் பணி சுயவிவரத்தை %1$s நிர்வகிக்கிறது. %2$s உடன் இணைக்கப்பட்டுள்ளதால், மின்னஞ்சல்கள், பயன்பாடுகள் மற்றும் இணையதளங்கள் உட்பட உங்கள் பணியிட நெட்வொர்க் செயல்பாட்டை அதனால் கண்காணிக்க முடியும்.\n\nமேலும் %3$s உடன் இணைக்கப்பட்டுள்ளதால், உங்கள் தனிப்பட்ட நெட்வொர்க் செயல்பாட்டையும் அதனால் கண்காணிக்க முடியும்." "சாதனத்தை நிர்வகிப்பது: %1$s.\n\nஉங்கள் நிர்வாகியால் அமைப்புகள், நிறுவன அணுகல், பயன்பாடுகள், சாதனத்துடன் தொடர்புடைய தரவு மற்றும் சாதனத்தின் இருப்பிடத் தகவல் ஆகியவற்றைக் கண்காணிக்கவும் நிர்வகிக்கவும் முடியும்.\n\n%2$s உடன் இணைக்கப்பட்டதால், மின்னஞ்சல்கள், பயன்பாடுகள் மற்றும் இணையதளங்கள் உட்பட உங்கள் நெட்வொர்க் செயல்பாட்டை அதனால் கண்காணிக்க முடியும்.\n\nகூடுதல் தகவலுக்கு, நிர்வாகியைத் தொடர்புகொள்ளவும்." @@ -492,8 +494,6 @@ "நிலைப் பட்டியில் கடிகார வினாடிகளைக் காட்டும். பேட்டரியின் ஆயுளைக் குறைக்கலாம்." "விரைவு அமைப்புகளை மறுவரிசைப்படுத்து" "விரைவு அமைப்புகளில் ஒளிர்வுப் பட்டியைக் காட்டு" - "மேலே ஸ்வைப் செய்வதன் மூலம் திரையைப் பிரிக்கும் சைகையை இயக்கு" - "மேலோட்டப் பார்வை பொத்தானிலிருந்து மேலே ஸ்வைப் செய்வதன் மூலம், திரைப் பிரிப்பைச் செயலாக்குவதற்கான சைகையை இயக்கும்" "சோதனை முயற்சி" "புளூடூத்தை இயக்கவா?" "உங்கள் டேப்லெட்டுடன் விசைப்பலகையை இணைக்க, முதலில் புளூடூத்தை இயக்க வேண்டும்." @@ -651,4 +651,5 @@ "%s அமைப்புகளைத் திற." "அமைப்புகளின் வரிசை முறையைத் திருத்து." "பக்கம் %1$d / %2$d" + "அறிவிப்புகளை ஒலியடக்க அல்லது தடுக்க முடியவில்லை" diff --git a/packages/SystemUI/res/values-te-rIN/strings.xml b/packages/SystemUI/res/values-te-rIN/strings.xml index e50d47a1bf9d6bfb834d6c253c5cf0bf91d8a1db..a1a85fc3ffc2cd0cb19d53e35824cd8e7aae5daa 100644 --- a/packages/SystemUI/res/values-te-rIN/strings.xml +++ b/packages/SystemUI/res/values-te-rIN/strings.xml @@ -238,7 +238,7 @@ "4G డేటా పాజ్ చేయబడింది" "సెల్యులార్ డేటా పాజ్ చేయబడింది" "డేటా పాజ్ చేయబడింది" - "మీ సెట్ చేయబడిన డేటా పరిమితిని చేరుకున్నందున పరికరం ఈ సైకిల్‌లో మిగిలిన భాగానికి డేటా వినియోగాన్ని పాజ్ చేసింది.\n\nపునఃప్రారంభించడం వలన మీ క్యారియర్ ఛార్జీలు విధించవచ్చు." + "మీరు సెట్ చేసిన డేటా పరిమితిని చేరుకున్నారు. మీరు ఇప్పుడు సెల్యులార్ డేటాను ఉపయోగించడం లేదు.\n\nమీరు పునఃప్రారంభిస్తే, డేటా వినియోగానికి ఛార్జీలు వర్తించవచ్చు." "పునఃప్రారంభించు" "ఇంటర్నెట్ కనెక్షన్ లేదు" "Wi-Fi కనెక్ట్ చేయబడింది" @@ -404,6 +404,7 @@ "పరికరం పర్యవేక్షించబడవచ్చు" "ప్రొఫైల్‌ని పర్యవేక్షించవచ్చు" "నెట్‌వర్క్ పర్యవేక్షించబడవచ్చు" + "నెట్‌వర్క్ పర్యవేక్షించబడవచ్చు" "పరికర పర్యవేక్షణ" "ప్రొఫైల్ పర్యవేక్షణ" "నెట్‌వర్క్ పర్యవేక్షణ" @@ -416,6 +417,7 @@ "VPN" "మీరు %1$sకి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు." "మీరు %1$sకి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌‍సైట్‌లతో సహా మీ వ్యక్తిగత నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు." + "మీరు %1$sకి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ వ్యక్తిగత నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు." "మీ కార్యాలయ ప్రొఫైల్‌ను %1$s నిర్వహిస్తోంది. అలాగే, మీ కార్యాలయ ప్రొఫైల్ %2$sకి కనెక్ట్ చేయబడింది, ఇది ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ కార్యాలయ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు.\n\nమరింత సమాచారం కోసం, మీ నిర్వాహకుడిని సంప్రదించండి." "మీ కార్యాలయ ప్రొఫైల్‌ను %1$s నిర్వహిస్తోంది. అలాగే, మీ కార్యాలయ ప్రొఫైల్ %2$sకి కనెక్ట్ చేయబడింది, ఇది ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ కార్యాలయ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు.\n\nమీరు %3$sకి కూడా కనెక్ట్ చేయబడ్డారు, ఇది మీ వ్యక్తిగత నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు." "మీ పరికరాన్ని %1$s నిర్వహిస్తోంది.\n\nమీ నిర్వాహకుడు సెట్టింగ్‌లను, కార్పొరేట్ ప్రాప్యతను, అనువర్తనాలను, మీ పరికరంతో అనుబంధించిన డేటాను మరియు మీ పరికర స్థాన సమాచారాన్ని పర్యవేక్షించగలరు మరియు నిర్వహించగలరు.\n\nమీరు %2$sకి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు.\n\nమరింత సమాచారం కోసం, మీ నిర్వాహకుడిని సంప్రదించండి." @@ -492,8 +494,6 @@ "స్థితి పట్టీలో గడియారం సెకన్లు చూపుతుంది. బ్యాటరీ శక్తి ప్రభావితం చేయవచ్చు." "శీఘ్ర సెట్టింగ్‌ల ఏర్పాటు క్రమం మార్చు" "శీఘ్ర సెట్టింగ్‌ల్లో ప్రకాశం చూపు" - "పైకి స్వైప్ చేయడం ద్వారా స్క్రీన్ విభజన సంజ్ఞను ప్రారంభించు" - "స్థూలదృష్టి బటన్ నుండి పైకి స్వైప్ చేయడం ద్వారా స్క్రీన్ విభజనలోకి ప్రవేశించడానికి సంజ్ఞను ప్రారంభిస్తుంది" "ప్రయోగాత్మకం" "బ్లూటూత్ ఆన్ చేయాలా?" "మీ కీబోర్డ్‌ను మీ టాబ్లెట్‌తో కనెక్ట్ చేయడానికి, మీరు ముందుగా బ్లూటూత్ ఆన్ చేయాలి." @@ -651,4 +651,5 @@ "%s సెట్టింగ్‌లను తెరవండి." "సెట్టింగ్‌ల క్రమాన్ని సవరించండి." "%2$dలో %1$dవ పేజీ" + "నోటిఫికేషన్‌లను నిశ్శబ్దంగా ఉంచలేరు లేదా బ్లాక్ చేయలేరు" diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 7eb227eb84b5dcc60ce00fa23c8681ac274e6a81..805431d5125822e48395c166a38fd09189cda85b 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -238,7 +238,7 @@ "หยุดการใช้ข้อมูล 4G ชั่วคราวแล้ว" "หยุดการใช้ข้อมูลมือถือชั่วคราวแล้ว" "หยุดการใช้ข้อมูลชั่วคราวแล้ว" - "เนื่องจากใช้งานข้อมูลถึงขีดจำกัดที่กำหนดไว้แล้ว อุปกรณ์จึงหยุดการใช้งานข้อมูลไว้ชั่วคราวตลอดระยะเวลาที่เหลือของรอบนี้\n\nการทำให้กลับมาทำงานอีกครั้งอาจทำให้เกิดค่าใช้จ่ายจากผู้ให้บริการ" + "คุณใช้อินเทอร์เน็ตเกินปริมาณที่กำหนดไว้ ระบบจะไม่ใช้เครือข่ายมือถือต่อไป\n\nหากใช้ต่อ อาจมีค่าบริการตามปริมาณการใช้อินเทอร์เน็ต" "ทำต่อ" "ไม่มีอินเทอร์เน็ต" "เชื่อมต่อ WiFi แล้ว" @@ -404,6 +404,7 @@ "อาจมีการตรวจสอบอุปกรณ์" "อาจมีการตรวจสอบโปรไฟล์" "เครือข่ายอาจได้รับการตรวจสอบ" + "เครือข่ายอาจถูกตรวจสอบ" "การตรวจสอบอุปกรณ์" "การตรวจสอบโปรไฟล์" "การตรวจสอบเครือข่าย" @@ -416,6 +417,7 @@ "VPN" "คุณเชื่อมต่อกับ %1$s ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายของคุณ รวมถึงอีเมล แอป และเว็บไซต์ได้" "คุณเชื่อมต่อกับ %1$s ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายส่วนตัวของคุณ รวมถึงอีเมล แอป และเว็บไซต์ได้" + "คุณเชื่อมต่อกับ %1$s ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายส่วนตัวของคุณ รวมถึงอีเมล แอป และเว็บไซต์ได้" "โปรไฟล์งานได้รับการจัดการโดย %1$s โดยมีการเชื่อมต่อกับ %2$s ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่าย รวมถึงอีเมล แอป และเว็บไซต์ได้\n\nสำหรับข้อมูลเพิ่มเติม โปรดติดต่อผู้ดูแลระบบ" "โปรไฟล์งานได้รับการจัดการโดย %1$s โดยมีการเชื่อมต่อกับ %2$s ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่าย รวมถึงอีเมล แอป และเว็บไซต์ได้\n\nนอกจากนี้ คุณยังเชื่อมต่อกับ %3$s ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายส่วนตัวได้" "อุปกรณ์ได้รับการจัดการโดย %1$s\n\nผู้ดูและรบบของคุณสามารถตรวจสอบและจัดการการตั้งค่า การเข้าถึงของบริษัท แอป ข้อมูลที่เชื่อมโยงกับอุปกรณ์ และข้อมูลตำแหน่งของอุปกรณ์ได้\n\nคุณมีการเชื่อมต่อกับ %2$s ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายรวมถึงอีเมล แอป และเว็บไซต์ได้\n\nสำหรับข้อมูลเพิ่มเติม โปรดติดต่อผู้ดูแลระบบ" @@ -492,8 +494,6 @@ "แสดงวินาทีของนาฬิกาในแถบสถานะ อาจส่งผลต่ออายุแบตเตอรี" "จัดเรียงการตั้งค่าด่วนใหม่" "แสดงความสว่างในการตั้งค่าด่วน" - "เปิดใช้ท่าทางสัมผัสการเลื่อนขึ้นเพื่อแยกหน้าจอ" - "เปิดใช้ท่าทางสัมผัสเพื่อเข้าสู่โหมดแยกหน้าจอโดยเลื่อนขึ้นจากปุ่มภาพรวม" "ทดสอบ" "เปิดบลูทูธไหม" "หากต้องการเชื่อมต่อแป้นพิมพ์กับแท็บเล็ต คุณต้องเปิดบลูทูธก่อน" @@ -651,4 +651,5 @@ "เปิดการตั้งค่า %s" "แก้ไขลำดับการตั้งค่า" "หน้า %1$d จาก %2$d" + "ไม่สามารถปิดเสียงหรือบล็อกการแจ้งเตือน" diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index ed6830e87b87317da076eaf351038eb8a2a23075..89af1894a798251d07b164ba2f1c0cff52eb6508 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -238,7 +238,7 @@ "Naka-pause ang 4G data" "Naka-pause ang cellular data" "Naka-pause ang data" - "Dahil naabot ang iyong nakatakdang limitasyon sa data, na-pause ng device ang paggamit ng data para sa nalalabing bahagi ng cycle na ito.\n\nMaaaring makakuha ng mga singilin mula sa iyong carrier ang pagpapatuloy." + "Naabot na ang limitasyon sa data na itinakda mo. Hindi ka na gumagamit ng cellular data.\n\nKung magpapatuloy ka, maaari kang masingil para sa paggamit ng data." "Ipagpatuloy" "Walang koneksyon sa Internet" "nakakonekta ang Wi-Fi" @@ -404,6 +404,7 @@ "Maaaring subaybayan ang device" "Maaaring subaybayan ang profile" "Maaaring sinusubaybayan ang network" + "Maaaring sinusubaybayan ang network" "Pagsubaybay sa device" "Pagsubaybay sa Profile" "Pagsubaybay sa network" @@ -416,6 +417,7 @@ "VPN" "Nakakonekta ka sa %1$s, na maaaring sumubaybay sa iyong aktibidad sa network kabilang ang mga email, app at website." "Nakakonekta ka sa %1$s, na maaaring sumubaybay sa iyong personal na aktibidad sa network, kabilang ang mga email, app at website." + "Nakakonekta ka sa %1$s, na maaaring sumubaybay sa aktibidad sa iyong personal na network, kabilang ang mga email, app at website." "Ang iyong profile sa trabaho ay pinapamahalaan ng %1$s. Nakakonekta ito sa %2$s, na maaaring sumubaybay sa iyong aktibidad sa network, kabilang ang mga email, app at website.\n\nPara sa higit pang impormasyon, makipag-ugnayan sa iyong administrator." "Ang iyong profile sa trabaho ay pinapamahalaan ng %1$s. Nakakonekta ito sa %2$s, na maaaring sumubaybay sa iyong aktibidad sa network, kabilang ang mga email, app at website.\n\nNakakonekta ka rin sa %3$s, na maaaring sumubaybay sa iyong personal na aktibidad sa network." "Pinapamahalaan ang iyong device ng %1$s.\n\nMaaaring subaybayan at pamahalaan ng iyong administrator ang mga setting, corporate na access, app, data na nauugnay sa iyong device at ang impormasyon ng lokasyon ng iyong device.\n\nNakakonekta ka sa %2$s, na maaaring subaybayan ang iyong aktibidad sa network, kabilang ang mga email, app at website.\n\nPara sa higit pang impormasyon, makipag-ugnayan sa iyong administrator." @@ -492,8 +494,6 @@ "Ipakita ang mga segundo ng orasan sa status bar. Maaaring makaapekto sa tagal ng baterya." "Ayusing Muli ang Mga Mabilisang Setting" "Ipakita ang liwanag sa Mga Mabilisang Setting" - "I-enable ang pag-swipe pataas na galaw para sa split-screen" - "I-enable ang gesture upang makapasok sa split-screen sa pamamagitan ng pagsa-swipe pataas mula sa button ng Pangkalahatang-ideya" "Pang-eksperimento" "I-on ang Bluetooth?" "Upang ikonekta ang iyong keyboard sa iyong tablet, kailangan mo munang i-on ang Bluetooth." @@ -651,4 +651,5 @@ "Buksan ang mga setting ng %s." "I-edit ang pagkakasunud-sunod ng mga setting." "Page %1$d ng %2$d" + "Hindi maaaring i-silent o i-block ang mga notification" diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 8fae7975e51ad145a7803da55f077ff9b53872ab..c17e9fc3cbe89dc3856cd03d9b24daa1978ea093 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -238,7 +238,7 @@ "4G veri kullanımı duraklatıldı" "Hücresel veri kullanımı duraklatıldı" "Veri kullanımı duraklatıldı" - "Ayarlanmış olan veri sınırınıza ulaşıldığından, bu dönemin kalan süresi için cihazda veri kullanımı duraklatıldı.\n\nVeri kullanımını devam ettirmek, operatörünüzün sizden ödeme almasına neden olabilir." + "Ayarladığınız veri limitine ulaşıldı. Artık hücresel verilerinizi kullanmıyorsunuz.\n\nHücresel veri kullanımını devam ettirirseniz veri kullanım ücretleri ödemeniz gerekebilir." "Devam ettir" "İnternet bağlantısı yok" "Kablosuz bağlandı" @@ -404,6 +404,7 @@ "Cihaz izlenebilir" "Profil izlenebilir" "Ağ etkinliği izlenebilir" + "Ağ etkinliği izlenebilir" "Cihaz izleme" "Profil izleme" "Ağ izleme" @@ -416,6 +417,7 @@ "VPN" "E-postalarınız, uygulamalarınız ve web siteleriniz dahil olmak üzere ağ etkinliğinizi izleyebilen %1$s uygulamasına bağlısınız." "E-postalarınız, uygulamalarınız ve web siteleriniz dahil olmak üzere kişisel ağ etkinliğinizi izleyebilen %1$s uygulamasına bağlısınız." + "E-postalarınız, uygulamalarınız ve web siteleriniz dahil olmak üzere kişisel ağ etkinliğinizi izleyebilen %1$s uygulamasına bağlısınız." "İş profiliniz %1$s tarafından yönetiliyor. E-postalarınız, uygulamalarınız ve web siteleriniz dahil olmak üzere ağ etkinliğinizi izleyebilen %2$s uygulamasına bağlı.\n\nDaha fazla bilgi için yöneticinizle iletişim kurun." "İş profiliniz %1$s tarafından yönetiliyor. E-postalarınız, uygulamalarınız ve web siteleriniz dahil olmak üzere ağ etkinliğinizi izleyebilen %2$s uygulamasına bağlı.\n\n Ayrıca kişisel ağ etkinliğinizi izleyebilen %3$s uygulamasına bağlısınız." "Cihazınız %1$s tarafından yönetiliyor.\n\nYöneticiniz; ayarları, şirket erişimini, uygulamaları, cihazınızla ilişkilendirilmiş verileri ve cihazınızın konum bilgilerini izleyebilir ve yönetebilir.\n\nE-postalarınız, uygulamalarınız ve web siteleriniz dahil olmak üzere ağ etkinliğinizi izleyebilen %2$s uygulamasına bağlısınız.\n\nDaha fazla bilgi edinmek için yöneticinizle iletişim kurun." @@ -492,8 +494,6 @@ "Durum çubuğunda saatin saniyelerini gösterir. Pil ömrünü etkileyebilir." "Hızlı Ayarlar\'ı Yeniden Düzenle" "Hızlı Ayarlar\'da parlaklığı göster" - "Hızlıca yukarı kaydırma hareketiyle ekran bölm. etkinleştir" - "Genel bakış düğmesinden yukarı hızlıca kaydırarak bölünmüş ekrana geçme hareketini etkinleştir" "Deneysel" "Bluetooth açılsın mı?" "Klavyenizi tabletinize bağlamak için önce Bluetooth\'u açmanız gerekir." @@ -651,4 +651,5 @@ "%s ayarlarını aç." "Ayarların sırasını düzenle." "Sayfa %1$d / %2$d" + "Bildirimler engellenemez veya sesi kapatılamaz" diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 7eaf0dbad8c8bab2ec14f39415d0151ee9b0569e..92f137211f865690f8a23b3302d78851d9115fed 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -242,7 +242,7 @@ "Передавання даних 4G призупинено" "Передавання мобільних даних призупинено" "Передавання даних призупинено" - "Пристрій призупинив передавання даних до кінця цього циклу, оскільки ваш ліміт перевищено.\n\nЯкщо ви відновите передавання даних, оператор може стягувати додаткову плату." + "Ви досягнули вказаного ліміту даних. Мобільний трафік вимкнено.\n\nЯкщо продовжите, може стягуватися плата за використання трафіку." "Відновити" "Немає з’єднання" "Wi-Fi під’єднано" @@ -410,6 +410,7 @@ "Дії на пристрої можуть відстежуватися" "Профіль може відстежуватись" "Дії в мережі можуть відстежуватися" + "Мережа може відстежуватися" "Відстеження дій на пристрої" "Відстеження профілю" "Відстеження дій у мережі" @@ -422,6 +423,7 @@ "VPN" "Ваш профіль під’єднано до додатка %1$s, який може відстежувати вашу активність у мережі, зокрема в електронній пошті, додатках і на веб-сайтах." "Ваш профіль під’єднано до додатка %1$s, який може відстежувати вашу особисту активність у мережі, зокрема в електронній пошті, додатках і на веб-сайтах." + "Ваш профіль під’єднано до додатка %1$s, який може відстежувати вашу особисту активність у мережі, зокрема доступ до електронної пошти, додатків і веб-сайтів." "Вашим робочим профілем керує %1$s. Профіль під’єднано до додатка %2$s, який може відстежувати вашу робочу активність у мережі, зокрема в електронній пошті, додатках і на веб-сайтах.\n\nЗв’яжіться з адміністратором, щоб дізнатися більше." "Вашим робочим профілем керує %1$s. Профіль під’єднано до додатка %2$s, який може відстежувати вашу робочу активність у мережі, зокрема в електронній пошті, додатках і на веб-сайтах.\n\nВаш профіль також під’єднано до додатка %3$s, який може відстежувати вашу особисту активність у мережі." "Вашим пристроєм керує організація %1$s.\n\nАдміністратор може відстежувати та контролювати налаштування, корпоративний доступ, додатки, геодані й інші дані, пов’язані з вашим пристроєм.\n\nВаш профіль під’єднано до додатка %2$s, який може відстежувати вашу активність у мережі, зокрема в електронній пошті, додатках і на веб-сайтах.\n\nЗв’яжіться з адміністратором, щоб дізнатися більше." @@ -498,8 +500,6 @@ "Показувати секунди на годиннику в рядку стану. Акумулятор може розряджатися швидше." "Упорядкувати швидкі налаштування" "Показувати панель яскравості у швидких налаштуваннях" - "Увімкнути розділення екрана рухом пальця вгору" - "Увімкнути жест розділення екрана рухом пальця вгору від кнопки \"Огляд\"" "Експериментальні налаштування" "Увімкнути Bluetooth?" "Щоб під’єднати клавіатуру до планшета, спершу потрібно ввімкнути Bluetooth." @@ -657,4 +657,5 @@ "Відкрити налаштування %s." "Змінити порядок налаштувань." "Сторінка %1$d з %2$d" + "Сповіщення не можна вимкнути або заблокувати" diff --git a/packages/SystemUI/res/values-ur-rPK/strings.xml b/packages/SystemUI/res/values-ur-rPK/strings.xml index 5c0ed1860a5f8594f9aebb5bd908c52ed3227d5a..b7b87eb29902dc3ade916606c41051e0336523f5 100644 --- a/packages/SystemUI/res/values-ur-rPK/strings.xml +++ b/packages/SystemUI/res/values-ur-rPK/strings.xml @@ -238,7 +238,7 @@ "‏4G ڈیٹا موقوف کر دیا گیا" "سیلولر ڈیٹا موقوف کر دیا گیا" "ڈیٹا موقوف کر دیا گیا" - "چونکہ آپ کی سیٹ کردہ ڈیٹا کی حد تک پہنچ گیا، لہذا آلہ نے اس سائیکل کے بقیہ حصے کیلئے ڈیٹا کے استعمال کو موقوف کر دیا ہے۔\n\nدوبارہ شروع کرنے سے آپ کے کیریئر سے چارجز لگ سکتے ہیں۔" + "آپ کی سیٹ کردہ ڈیٹا کی حد پوری ہو گئی ہے۔ آپ اب سیلولر ڈیٹا استعمال نہیں کر رہے۔\n\nاگر آپ دوبارہ شروع کرتے ہیں تو ڈیٹا کے استعمال کے چارجز لاگو ہو سکتے ہیں۔" "دوبارہ شروع کریں" "کوئی انٹرنیٹ کنکشن نہیں" "‏Wi-Fi مربوط ہے" @@ -404,6 +404,7 @@ "آلہ کو مانیٹر کیا جا سکتا ہے" "پروفائل کو مانیٹر کیا جا سکتا ہے" "نیٹ ورک کو مانیٹر کیا جا سکتا ہے" + "نیٹ ورک کو شاید مانیٹر کیا جائے" "آلہ کو مانیٹر کرنا" "پروفائل کو مانیٹر کرنا" "نیٹ ورک کو مانیٹر کرنا" @@ -416,6 +417,7 @@ "VPN" "آپ %1$s سے منسلک ہیں، جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔" "آپ %1$s سے منسلک ہیں، جو آپ کے نجی نیٹ ورک کی سرگرمی سمیت ای میلز، ایپس اور ویب سائٹس مانیٹر کر سکتی ہے۔" + "آپ %1$s سے منسلک ہیں، جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے نجی نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔" "آپ کا دفتری پروفائل %1$s کے زیر انتظام ہے۔ یہ %2$s سے منسلک ہے، جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔\n\nمزید معلومات کیلئے اپنے منتظم سے رابطہ کریں۔" "آپ کا دفتری پروفائل %1$s کے زیر انتظام ہے۔ یہ %2$s سے منسلک ہے، جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔\n\nآپ %3$s سے بھی منسلک ہیں، جو آپ کے نجی نیٹ ورک کی سرگرمی کو مانیٹر کر سکتی ہے۔" "آپ کا آلہ %1$s کے زیر انتظام ہے۔\n\nآپ کا منتظم ترتیبات، کارپوریٹ رسائی، ایپس، آپ کے آلہ سے وابستہ ڈیٹا اور آپ کے آلہ کے مقام کی معلومات کو مانیٹر اور ان کا نظم کر سکتا ہے۔\n\nآپ %2$s سے منسلک ہیں، جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔\n\nمزید معلومات کیلئے اپنے منتظم سے رابطہ کریں۔" @@ -492,8 +494,6 @@ "گھڑی کے سیکنڈز اسٹیٹس بار میں دکھائیں۔ اس کا بیٹری کی زندگی پر اثر پڑ سکتا ہے۔" "فوری ترتیبات کو دوبارہ ترتیب دیں" "فوری ترتیبات میں چمکیلا پن دکھائیں" - "سپلٹ اسکرین کیلئے سوائپ اپ اشارہ فعال کریں" - "مجموعی جائزہ بٹن سے سوائپ اپ کرکے سپلٹ اسکرین میں داخل ہونے کیلئے اشارہ فعال کریں" "تجرباتی" "بلوٹوتھ آن کریں؟" "اپنے کی بورڈ کو اپنے ٹیبلٹ کے ساتھ منسلک کرنے کیلئے پہلے آپ کو اپنا بلو ٹوتھ آن کرنا ہو گا۔" @@ -651,4 +651,5 @@ "%s ترتیبات کھولیں۔" "ترتیبات کی ترتیب میں ترمیم کریں۔" "صفحہ %1$d از %2$d" + "اطلاعات کو خاموش یا مسدود نہیں کیا جا سکتا" diff --git a/packages/SystemUI/res/values-uz-rUZ/strings.xml b/packages/SystemUI/res/values-uz-rUZ/strings.xml index ac6194fecb0d0e9938a0c58c4718775ac9b90ca2..61195c587bc061d85ac81e440efa70b97278fd23 100644 --- a/packages/SystemUI/res/values-uz-rUZ/strings.xml +++ b/packages/SystemUI/res/values-uz-rUZ/strings.xml @@ -240,7 +240,7 @@ "4G internet to‘xtatib qo‘yildi" "Mobil internetdan foydalanish to‘xtatib qo‘yildi" "Internetdan foydalanish to‘xtatib qo‘yildi" - "Siz o‘rnatgan mobil internet chekloviga yetgani bois joriy hisob-kitob davrining qolgan muddati uchun mobil internetdan foydalanish vaqtinchalik to‘xtatib qo‘yildi.\n\nAgar internetdan foydalanishni davom ettirsangiz, buning uchun uyali aloqa operatoringiz ortiqcha haq talab qilishi mumkin." + "O‘rnatilgan trafik sarflab bo‘lindi. Endi mobil internetdan foydalana olmaysiz.\n\nDavom ettiradigan bo‘lsangiz, trafik uchun to‘lov olinishi mumkin." "Davom etish" "Internetga ulanmagan" "Wi-Fi ulandi" @@ -406,6 +406,7 @@ "Qurilma kuzatilishi mumkin" "Profil kuzatilishi mumkin" "Tarmoqni kuzatish mumkin" + "Tarmoq kuzatilishi mumkin" "Qurilmalarni kuzatish" "Profilni kuzatish" "Tarmoqlarni kuzatish" @@ -418,6 +419,7 @@ "VPN" "%1$s ilovasi ishga tushirilgan. U internetdagi harakatlaringiz, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin." "%1$s ilovasi ishga tushirilgan. U internetdagi harakatlaringiz, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin." + "%1$s ilovasi ishga tushirilgan. U internetdagi harakatlaringiz, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin." "Sizning ishchi profilingiz %1$s tomonidan boshqariladi. %2$s ilovasi ish tarmog‘idagi harakatlaringizni, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin.\n\nBatafsil ma’lumot olish uchun administrator bilan bog‘laning." "Sizning ishchi profilingiz %1$s tomonidan boshqariladi. %2$s ilovasi ish tarmog‘idagi harakatlaringizni, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin.\n\nShuningdek, %3$s ilovasi ham shaxsiy tarmoqdagi harakatlaringizni kuzatishi mumkin." "Qurilmangiz %1$s tomonidan boshqariladi.\n\nAdministrator sozlamalar, korporativ kirish huquqi, ilovalar, qurilmangizdagi ma’lumotlar, jumladan, joylashuv ma’lumotlarini boshqarishi mumkin.\n\nShuningdek, siz %2$s ilovasiga ham ulangansiz. Ushbu ilova internetdagi harakatlaringizni, jumladan, e-pochta, ilovalar va veb-saytlar bilan ishlashingizni kuzata oladi.\n\nBatafsil ma’lumot olish uchun administrator bilan bog‘laning." @@ -494,8 +496,6 @@ "Holat panelida soat soniyalari ko‘rsatilsin. Bu batareya resursiga ta’sir qilishi mumkin." "Tezkor sozlamalarni qayta tartiblash" "Tezkor sozlamalarda yorqinlikni ko‘rsatish" - "Tepaga surish orqali ekranni ikkiga bo‘lish" - "Umumiy ma’lumot tugmasini tepaga surish orqali ekranni bo‘lish ishorasini yoqish" "Tajribaviy" "Bluetooth yoqilsinmi?" "Klaviaturani planshetingizga ulash uchun Bluetooth xizmatini yoqishingiz kerak." @@ -653,4 +653,5 @@ "%s sozlamalarini ochish." "Sozlamalar tartibini o‘zgartirish." "%1$d-sahifa, jami: %2$d ta sahifa" + "Bildirishnomalarni bloklab yoki ovozsiz ko‘rinadigan qilib bo‘lmaydi" diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 930eebe9ad108ee9534f64b79bdfb118cdab1a59..6aaab66f2c45886148587e6f1fa6e3a9ab5777ed 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -238,7 +238,7 @@ "Đã tạm dừng dữ liệu 4G" "Đã tạm dừng dữ liệu di động" "Đã tạm dừng dữ liệu" - "Vì bạn đã đạt tới giới hạn dữ liệu thiết lập nên thiết bị đã tạm dừng sử dụng dữ liệu cho phần còn lại của chu kỳ này.\n\nTiếp tục có thể dẫn tới nhà cung cấp dịch vụ của bạn sẽ tính phí." + "Đã đạt đến giới hạn dữ liệu mà bạn đặt. Bạn hiện không còn sử dụng dữ liệu di động.\n\nNếu tiếp tục, bạn có thể bị tính phí khi sử dụng dữ liệu." "Tiếp tục" "Ko có k.nối Internet" "Đã kết nối Wi-Fi" @@ -404,6 +404,7 @@ "Thiết bị có thể được giám sát" "Hồ sơ có thể được giám sát" "Mạng có thể được giám sát" + "Mạng có thể được giám sát" "Giám sát thiết bị" "Giám sát hồ sơ" "Giám sát mạng" @@ -416,6 +417,7 @@ "VPN" "Bạn đang kết nối với %1$s. Ứng dụng này có thể giám sát hoạt động mạng của bạn bao gồm email, ứng dụng và trang web." "Bạn đang kết nối với %1$s. Ứng dụng này có thể giám sát hoạt động mạng cá nhân của bạn bao gồm email, ứng dụng và trang web." + "Bạn đang kết nối với %1$s. Ứng dụng này có thể giám sát hoạt động mạng cá nhân của bạn bao gồm email, ứng dụng và trang web." "Hồ sơ công việc của bạn được quản lý bởi %1$s. Hồ sơ được kết nối với %2$s, ứng dụng này có thể giám sát hoạt động mạng cơ quan của bạn, bao gồm email, ứng dụng và trang web.\n\nĐể biết thêm thông tin, hãy liên hệ với quản trị viên của bạn." "Hồ sơ công việc của bạn được quản lý bởi %1$s. Hồ sơ được kết nối với %2$s, ứng dụng này có thể giám sát hoạt động mạng cơ quan của bạn, bao gồm email, ứng dụng và trang web.\n\nBạn cũng được kết nối với %3$s, có thể giám sát hoạt động mạng cá nhân của bạn." "Thiết bị của bạn được quản lý bởi %1$s.\n\nQuản trị viên có thể giám sát và quản lý cài đặt, quyền truy cập của công ty, ứng dụng, dữ liệu được liên kết với thiết bị của bạn và thông tin về vị trí của thiết bị.\n\nBạn được kết nối với %2$s. Ứng dụng này có thể giám sát hoạt động mạng của bạn, bao gồm email, ứng dụng và trang web.\n\nĐể biết thêm thông tin, hãy liên hệ với quản trị viên của bạn." @@ -494,8 +496,6 @@ "Hiển thị giây đồng hồ trong thanh trạng thái. Có thể ảnh hưởng đến thời lượng pin." "Sắp xếp lại Cài đặt nhanh" "Hiển thị độ sáng trong Cài đặt nhanh" - "Bật cử chỉ vuốt lên ở chế độ chia đôi màn hình" - "Cho phép cử chỉ truy cập chế độ chia đôi màn hình bằng cách vuốt lên từ nút Tổng quan" "Thử nghiệm" "Bật Bluetooth?" "Để kết nối bàn phím với máy tính bảng, trước tiên, bạn phải bật Bluetooth." @@ -653,4 +653,5 @@ "Mở cài đặt %s." "Chỉnh sửa thứ tự cài đặt." "Trang %1$d / %2$d" + "Không thể chặn hoặc tắt tiếng thông báo" diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 2548c4b2f4eeab54898405a246d9e6a5a471471e..f10d538683258b532baa42baf04b1932f0bece1d 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -238,7 +238,7 @@ "4G 数据网络已暂停使用" "移动数据网络已暂停使用" "数据网络已暂停使用" - "由于使用的数据流量已达到您所设置的上限,因此您的设备已暂停在此周期的剩余时间内使用数据流量。\n\n如果恢复数据流量使用,您的运营商可能会向您收取相应费用。" + "您的数据用量已达到设置的上限。您无法再使用移动数据网络。\n\n如果您继续操作,可能需要支付相应的数据流量费用。" "恢复" "未连接互联网" "已连接到WLAN网络" @@ -404,6 +404,7 @@ "设备可能会受到监控" "资料可能会受到监控" "网络可能会受到监控" + "网络可能会受到监控" "设备监测" "资料监控" "网络监控" @@ -416,6 +417,7 @@ "VPN" "您已连接到%1$s,该应用可以监控您的网络活动,包括收发电子邮件、使用应用和浏览网站。" "您已连接到%1$s,该应用可以监控您的个人网络活动,包括收发电子邮件、使用应用和浏览网站。" + "您已连接到%1$s,该应用可以监控您的个人网络活动,包括收发电子邮件、使用应用和浏览网站。" "您的工作资料由以下单位管理:%1$s。您已连接到%2$s,该应用可以监控您的工作网络活动,包括收发电子邮件、使用应用和浏览网站。\n\n若要了解详情,请与您单位的管理员联系。" "您的工作资料由以下单位管理:%1$s。您已连接到%2$s,该应用可以监控您的工作网络活动,包括收发电子邮件、使用应用和浏览网站。\n\n此外,您还连接到了%3$s,该应用可以监控您的个人网络活动。" "您的设备由以下单位管理:%1$s。\n\n您单位的管理员可以监控和管理与此设备相关的设置、企业权限、应用、数据以及设备位置信息。\n\n您已连接到%2$s,该应用可以监控您的网络活动,包括收发电子邮件、使用应用和浏览网站。\n\n若要了解详情,请与您单位的管理员联系。" @@ -492,8 +494,6 @@ "在状态栏中显示时钟的秒数。这可能会影响电池的续航时间。" "重新排列快捷设置" "在快捷设置中显示亮度栏" - "启用分屏上滑手势" - "启用通过从“概览”按钮向上滑动的手势进入分屏模式" "实验性功能" "要开启蓝牙吗?" "要将您的键盘连接到平板电脑,您必须先开启蓝牙。" @@ -651,4 +651,5 @@ "打开%s设置。" "修改设置顺序。" "第 %1$d 页,共 %2$d 页" + "无法将通知静音或屏蔽" diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index c0172b1cf7ff7b6db3a04b2e8d4f6b04fc830177..8405fe509bc3dbedcc0645a06e0679e9fa9ea7f5 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -240,7 +240,7 @@ "已暫停 4G 數據" "已暫停流動數據" "已暫停使用數據" - "由於您已達到設定的數據用量上限,裝置已暫停使用數據,直到週期結束。\n\n如恢復使用數據,流動網絡供應商可能會向您收取費用。" + "已達到您設定的數據上限。系統將停止使用流動數據網絡。\n\n如果您恢復使用流動數據網絡,可能需要支付數據費用。" "恢復" "沒有互聯網連線" "Wi-Fi 已連線" @@ -406,6 +406,7 @@ "裝置可能會受到監控" "個人檔案可能受到監控" "網絡可能會受到監控" + "網絡可能會受到監控" "裝置監控" "個人檔案監控" "網絡監控" @@ -418,6 +419,7 @@ "VPN" "您已連結至%1$s ,它能夠監控您的網絡活動,包括電郵、應用程式和網站。" "您已連結至%1$s,它能夠監控您的個人網絡活動,包括電郵、應用程式和網站。" + "您已連接至「%1$s」,此應用程式可以監控您的個人網絡活動,包括電郵、應用程式及網站。" "您的工作設定檔由%1$s管理。它已連結至%2$s,能夠監控您的工作網絡活動,包括電郵、應用程式和網站。\n\n如需進一步資訊,請聯絡您的管理員。" "您的工作設定檔由%1$s管理。它已連結至%2$s,能夠監控您的工作網絡活動,包括電郵、應用程式和網站。\n\n此外,您亦連結至%3$s,因此它亦能夠監控您的個人網絡活動。" "您的裝置由 %1$s 管理。\n\n您的管理員可以監控及管理您裝置的設定、企業存取、應用程式、資料及位置資訊。\n\n此外,您的裝置連至 %2$s,它能監控您的網絡活動,包括電郵、應用程式及網站。\n\n如需更多資訊,請聯絡您的管理員。" @@ -494,8 +496,6 @@ "在狀態列中顯示時鐘秒數,但可能會影響電池壽命。" "重新排列快速設定" "在快速設定顯示亮度" - "啟用分割畫面向上快速滑動手勢" - "從 [概覽] 按鈕向上快速滑動,即可使用手勢功能進入分割畫面模式" "實驗版" "要開啟藍牙嗎?" "如要將鍵盤連接至平板電腦,請先開啟藍牙。" @@ -653,4 +653,5 @@ "開啟%s設定頁面。" "編輯設定次序。" "第 %1$d 頁 (共 %2$d 頁)" + "通知無法設為靜音或封鎖" diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 66c126404d21a4f7ca8aeb0d08d643642f67ee50..b4f2b27dc7eb8fa021c2fdffd50d890a33265b8e 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -238,7 +238,7 @@ "已暫停 4G 數據連線" "已暫停行動數據連線" "已暫停數據連線" - "由於數據用量已達設定上限,裝置在這個週期的剩餘時間將暫停使用數據連線。\n\n如果恢復使用,行動通訊業者可能會向您收取額外的連線費用。" + "你的數據用量已達設定的用量上限,因此系統已停止使用行動數據連線。\n\n如果你繼續使用行動數據連線,可能需要支付相關的數據傳輸費用。" "恢復連線" "沒有網際網路連線" "Wi-Fi 已連線" @@ -404,6 +404,7 @@ "裝置可能會受到監控" "設定檔可能會受到監控" "網路可能會受到監控" + "網路可能會受到監控" "裝置監控" "設定檔監控" "網路監控" @@ -416,6 +417,7 @@ "VPN" "由於您已連線至 %1$s,您的網路活動也會受到這個應用程式監控,包括收發電子郵件、使用應用程式和瀏覽網站。" "由於您已連線至 %1$s,您的個人網路活動也會受到這個應用程式監控,包括收發電子郵件、使用應用程式和瀏覽網站。" + "由於你已連結至「%1$s」,你的個人網路活動 (包括收發電子郵件、使用應用程式及瀏覽網站) 可能會受到這個應用程式監控。" "您的 Work 設定檔是由下列機構管理:%1$s。由於設定檔已連線至 %2$s,您的工作網路活動也會受到這個應用程式監控,包括收發電子郵件、使用應用程式和瀏覽網站。\n\n詳情請洽您的管理員。" "您的 Work 設定檔是由下列機構管理:%1$s。由於設定檔已連線至 %2$s,您的工作網路活動也會受到這個應用程式監控,包括收發電子郵件、使用應用程式和瀏覽網站。\n\n同時由於您也連線至%3$s,您的個人網路活動也會受到這個應用程式監控。" "您的裝置由下列機構管理:%1$s。\n\n您的管理員可以監控及管理與裝置相關的設定、企業網路存取權、應用程式和資料,以及裝置的位置資訊。\n\n由於您的裝置已連線至 %2$s,您的網路活動也會受到這個應用程式監控,包括收發電子郵件、使用應用程式和瀏覽網站。\n\n如需詳細資訊,請洽您的管理員。" @@ -492,8 +494,6 @@ "在狀態列中顯示時鐘秒數。這可能會影響電池續航力。" "重新排列快速設定" "在快速設定中顯示亮度" - "啟用分割畫面向上滑動手勢" - "啟用透過從 [總覽] 按鈕向上滑動的手勢進入分割畫面" "實驗性" "要開啟藍牙功能嗎?" "如要將鍵盤連線到平板電腦,您必須先開啟藍牙。" @@ -651,4 +651,5 @@ "開啟「%s」設定。" "編輯設定順序。" "第 %1$d 頁,共 %2$d 頁" + "無法關閉通知音效或封鎖通知" diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 49bf0bd0d5020a7e2d58f4434d582d54c8c5fca9..c6e40444b845e9bb5cf2251f73887175d4483fce 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -238,7 +238,7 @@ "4G idatha imisiwe" "Idatha yeselula imisiwe" "Idatha imisiwe" - "Ngoba umkhawulo wakho wedatha osethiwe ufinyelelwe, idivayisi imise kancane ukusetshenziswa kwedatha ngesikhumbuzi salo mjikelezo.\n\nUkuqhuba futhi kungaholela kuzindleko kusuka kwinkampani yakho yenethiwekhi." + "Umkhawulo wedatha owusethayo ufikiwe. Awusasebenzisi idatha yeselula.\n\nUma uqalisa kabusha, izindleko zingasebenza ekusetshenzisweni kwedatha." "Qalisa kabusha" "Alukho uxhumano lwe-Inthanethi" "I-Wi-Fi ixhunyiwe" @@ -404,6 +404,7 @@ "Idivayisi inganganyelwa" "Iphrofayela ingaqashwa" "Inethiwekhi kungenzeka iqashiwe" + "Inethiwekhi kungenzeka iqashiwe" "Ukwengamela idivayisi" "Ukuqapha iphrofayela" "Ukuqashwa kwenethiwekhi" @@ -416,6 +417,7 @@ "I-VPN" "Uxhumeke ku-%1$s, engahlola umsebenzi wakho wenethiwekhi ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi." "Uxhumeke ku-%1$s, engahlola umsebenzi wenethiwekhi yakho yomuntu siqu, ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi." + "Uxhumeke ku-%1$s, engaqapha umsebenzi wakho womuntu siqu wenethiwekhi, ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi." "Iphrofayela yakho yomsebenzi iphethwe yi-%1$s. Ixhumeke ku-%2$s, engahlola umsebenzi wenethiwekhi yakho yokusebenza, ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi.\n\nUkuze uthole olunye ulwazi, xhumana nomqondisi wakho." "Iphrofayela yakho yomsebenzi iphethwe yi-%1$s. Ixhumeke ku-%2$s, engahlola umsebenzi wenethiwekhi yakho yomsebenzi, ofaka ama-imeyili, izinhlelo zokusebenza namawebhusayithi.\n\nFuthi uxhumeke ku-%3$s, engahlola umsebenzi wenethiwekhi yakho yomuntu siqu." "Idivayisi yakho iphethwe yi-%1$s.\n\nUmqondisi wakho angaqaphela aphinde aphathe izilungiselelo, ukufinyelela kwezinkampani, izinhlelo zokusebenza, idatha ehlotshaniswa nedivayisi yakho, nolwazi lendawo yedivayisi yakho.\n\nUxhumeke ku-%2$s, engaqaphela umsebenzi wakho wenethiwekhi, ofaka ama-imeyili, izinhlelo zokusebenza namawebhusayithi.\n\nUkuze uthole olunye ulwazi, xhumana nomqondisi wakho." @@ -492,8 +494,6 @@ "Bonisa amasekhondi wewashi kubha yesimo. Ingathinta impilo yebhethri." "Hlela kabusha izilungiselelo ezisheshayo" "Bonisa ukukhanya kuzilungiselelo ezisheshayo" - "Nika amandla ukuthinta kokuswayiphela phezulu ukuhlukanisa isikrini" - "Nika amandla ukuthinta ukuze ungene ekuhlukaniseni isikrini ngokuswayiphela phezulu kusukela kunkinobho yokubuka konke" "Okokulinga" "Vula i-Bluetooth?" "Ukuze uxhume ikhibhodi yakho nethebhulethi yakho, kufanele uqale ngokuvula i-Bluetooth." @@ -651,4 +651,5 @@ "Vula izilungiselelo ze-%s." "Hlela uhlelo lwezilungiselelo." "Ikhasi %1$d kwangu-%2$d" + "Izaziso azikwazi ukuthuliswa noma ukuvinjelwa" diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index e93b701974a0a32e4d8edcf24c507816b48530f6..3ee5295eeb545bbe7d4fd664e4b7904996d589a4 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -100,7 +100,7 @@ - wifi,cell,battery,dnd,flashlight,rotation,bt,airplane,location + wifi,cell,battery,dnd,flashlight,rotation,bt,airplane @@ -209,9 +209,6 @@ false - - false - true diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index f73468f10b383cb71cf29e100f62cf78785a7157..7c6337349578e93190b074a7041606bc8addd0b8 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -569,7 +569,7 @@ Data is paused - Because your set data limit was reached, the device has paused data usage for the remainder of this cycle.\n\nResuming may lead to charges from your carrier. + The data limit you set has been reached. You are no longer using cellular data.\n\nIf you resume, charges may apply for data usage. Resume @@ -1001,6 +1001,9 @@ Network may be monitored + + Network may be monitored + Device monitoring @@ -1037,6 +1040,9 @@ You\'re connected to %1$s, which can monitor your personal network activity, including emails, apps, and websites. + + You\'re connected to %1$s, which can monitor your personal network activity, including emails, apps, and websites. + Your work profile is managed by %1$s. It is connected to %2$s, which can monitor your work network activity, including emails, apps, and websites.\n\nFor more information, contact your administrator. @@ -1243,11 +1249,6 @@ Use the new Quick Settings - - Enable split-screen swipe-up gesture - - Enable gesture to enter split-screen by swiping up from the Overview button - Experimental @@ -1629,7 +1630,10 @@ Edit order of settings. - + Page %1$d of %2$d + + Notifications can\'t be silenced or blocked diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index ca1b5698f69ad3e288361d383fc0696ab13366a1..9c3b2d6143565e72b44dd1e46b9f382cb3bff010 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -42,7 +42,7 @@ - -