diff options
103 files changed, 1173 insertions, 250 deletions
diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp index 2fa1ee6b3869..a893ec8b862b 100644 --- a/cmds/bootanimation/BootAnimation.cpp +++ b/cmds/bootanimation/BootAnimation.cpp @@ -74,6 +74,7 @@ static const char LAST_TIME_CHANGED_FILE_NAME[] = "last_time_change"; static const char LAST_TIME_CHANGED_FILE_PATH[] = "/data/system/time/last_time_change"; static const char ACCURATE_TIME_FLAG_FILE_NAME[] = "time_is_accurate"; static const char ACCURATE_TIME_FLAG_FILE_PATH[] = "/data/system/time/time_is_accurate"; +static const char TIME_FORMAT_12_HOUR_FLAG_FILE_PATH[] = "/data/system/time/time_format_12_hour"; // Java timestamp format. Don't show the clock if the date is before 2000-01-01 00:00:00. static const long long ACCURATE_TIME_EPOCH = 946684800000; static constexpr char FONT_BEGIN_CHAR = ' '; @@ -99,7 +100,7 @@ static const std::vector<std::string> PLAY_SOUND_BOOTREASON_BLACKLIST { // --------------------------------------------------------------------------- BootAnimation::BootAnimation() : Thread(false), mClockEnabled(true), mTimeIsAccurate(false), - mTimeCheckThread(NULL) { + mTimeFormat12Hour(false), mTimeCheckThread(NULL) { mSession = new SurfaceComposerClient(); // If the system has already booted, the animation is not being used for a boot. @@ -589,9 +590,10 @@ void BootAnimation::drawText(const char* str, const Font& font, bool bold, int* glBindTexture(GL_TEXTURE_2D, 0); } -// We render 24 hour time. +// We render 12 or 24 hour time. void BootAnimation::drawClock(const Font& font, const int xPos, const int yPos) { - static constexpr char TIME_FORMAT[] = "%H:%M"; + static constexpr char TIME_FORMAT_12[] = "%l:%M"; + static constexpr char TIME_FORMAT_24[] = "%H:%M"; static constexpr int TIME_LENGTH = 6; time_t rawtime; @@ -599,7 +601,8 @@ void BootAnimation::drawClock(const Font& font, const int xPos, const int yPos) struct tm* timeInfo = localtime(&rawtime); char timeBuff[TIME_LENGTH]; - size_t length = strftime(timeBuff, TIME_LENGTH, TIME_FORMAT, timeInfo); + const char* timeFormat = mTimeFormat12Hour ? TIME_FORMAT_12 : TIME_FORMAT_24; + size_t length = strftime(timeBuff, TIME_LENGTH, timeFormat, timeInfo); if (length != TIME_LENGTH - 1) { ALOGE("Couldn't format time; abandoning boot animation clock"); @@ -1061,6 +1064,11 @@ bool BootAnimation::updateIsTimeAccurate() { } struct stat statResult; + + if(stat(TIME_FORMAT_12_HOUR_FLAG_FILE_PATH, &statResult) == 0) { + mTimeFormat12Hour = true; + } + if(stat(ACCURATE_TIME_FLAG_FILE_PATH, &statResult) == 0) { mTimeIsAccurate = true; return true; diff --git a/cmds/bootanimation/BootAnimation.h b/cmds/bootanimation/BootAnimation.h index 42759f1acf0d..7a2e4c28f767 100644 --- a/cmds/bootanimation/BootAnimation.h +++ b/cmds/bootanimation/BootAnimation.h @@ -152,6 +152,7 @@ private: sp<Surface> mFlingerSurface; bool mClockEnabled; bool mTimeIsAccurate; + bool mTimeFormat12Hour; bool mSystemBoot; String8 mZipFileName; SortedVector<String8> mLoadedFiles; diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java index 163e7d2661b9..b311c218de30 100644 --- a/core/java/android/accessibilityservice/AccessibilityService.java +++ b/core/java/android/accessibilityservice/AccessibilityService.java @@ -334,7 +334,8 @@ public abstract class AccessibilityService extends Service { public static final int GLOBAL_ACTION_HOME = 2; /** - * Action to toggle showing the overview of recent apps + * Action to toggle showing the overview of recent apps. Will fail on platforms that don't + * show recent apps. */ public static final int GLOBAL_ACTION_RECENTS = 3; diff --git a/core/java/android/content/pm/ShortcutManager.java b/core/java/android/content/pm/ShortcutManager.java index a93870ece823..f7c4d592b3a9 100644 --- a/core/java/android/content/pm/ShortcutManager.java +++ b/core/java/android/content/pm/ShortcutManager.java @@ -193,7 +193,11 @@ import java.util.List; * The following list includes descriptions for the different attributes within a static shortcut: * <dl> * <dt>{@code android:shortcutId}</dt> - * <dd>Mandatory shortcut ID</dd> + * <dd>Mandatory shortcut ID. + * <p> + * This must be a string literal. + * A resource string, such as <code>@string/foo</code>, cannot be used. + * </dd> * * <dt>{@code android:enabled}</dt> * <dd>Default is {@code true}. Can be set to {@code false} in order @@ -206,15 +210,24 @@ import java.util.List; * * <dt>{@code android:shortcutShortLabel}</dt> * <dd>Mandatory shortcut short label. - * See {@link ShortcutInfo.Builder#setShortLabel(CharSequence)}.</dd> + * See {@link ShortcutInfo.Builder#setShortLabel(CharSequence)}. + * <p> + * This must be a resource string, such as <code>@string/shortcut_label</code>. + * </dd> * * <dt>{@code android:shortcutLongLabel}</dt> * <dd>Shortcut long label. - * See {@link ShortcutInfo.Builder#setLongLabel(CharSequence)}.</dd> + * See {@link ShortcutInfo.Builder#setLongLabel(CharSequence)}. + * <p> + * This must be a resource string, such as <code>@string/shortcut_long_label</code>. + * </dd> * * <dt>{@code android:shortcutDisabledMessage}</dt> * <dd>When {@code android:enabled} is set to - * {@code false}, this attribute is used to display a custom disabled message.</dd> + * {@code false}, this attribute is used to display a custom disabled message. + * <p> + * This must be a resource string, such as <code>@string/shortcut_disabled_message</code>. + * </dd> * * <dt>{@code intent}</dt> * <dd>Intent to launch when the user selects the shortcut. diff --git a/core/java/android/net/metrics/IpManagerEvent.java b/core/java/android/net/metrics/IpManagerEvent.java index a5b4eb5aff86..e0a026ed678d 100644 --- a/core/java/android/net/metrics/IpManagerEvent.java +++ b/core/java/android/net/metrics/IpManagerEvent.java @@ -38,9 +38,15 @@ public final class IpManagerEvent implements Parcelable { public static final int PROVISIONING_OK = 1; public static final int PROVISIONING_FAIL = 2; public static final int COMPLETE_LIFECYCLE = 3; + /** @hide */ public static final int ERROR_STARTING_IPV4 = 4; + /** @hide */ public static final int ERROR_STARTING_IPV6 = 5; + /** @hide */ public static final int ERROR_STARTING_IPREACHABILITYMONITOR = 6; /** {@hide} */ - @IntDef(value = {PROVISIONING_OK, PROVISIONING_FAIL, COMPLETE_LIFECYCLE}) + @IntDef(value = { + PROVISIONING_OK, PROVISIONING_FAIL, COMPLETE_LIFECYCLE, + ERROR_STARTING_IPV4, ERROR_STARTING_IPV6, ERROR_STARTING_IPREACHABILITYMONITOR, + }) @Retention(RetentionPolicy.SOURCE) public @interface EventType {} @@ -95,6 +101,7 @@ public final class IpManagerEvent implements Parcelable { final static class Decoder { static final SparseArray<String> constants = MessageUtils.findMessageNames( - new Class[]{IpManagerEvent.class}, new String[]{"PROVISIONING_", "COMPLETE_"}); + new Class[]{IpManagerEvent.class}, + new String[]{"PROVISIONING_", "COMPLETE_", "ERROR_"}); } } diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 3f1789bf9d88..ee2596bd2b9f 100755 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -5164,6 +5164,16 @@ public final class Settings { "accessibility_soft_keyboard_mode"; /** + * Should we disable all animations when accessibility is turned on. On low-power devices + * like Android Wear, the performance makes the device unusable. Turning off animations + * is a partial fix. + * + * @hide + */ + public static final String ACCESSIBILITY_DISABLE_ANIMATIONS = + "accessibility_disable_animations"; + + /** * Default soft keyboard behavior. * * @hide @@ -6441,6 +6451,7 @@ public final class Settings { ACCESSIBILITY_CAPTIONING_TYPEFACE, ACCESSIBILITY_CAPTIONING_FONT_SCALE, ACCESSIBILITY_CAPTIONING_WINDOW_COLOR, + ACCESSIBILITY_DISABLE_ANIMATIONS, TTS_USE_DEFAULTS, TTS_DEFAULT_RATE, TTS_DEFAULT_PITCH, diff --git a/core/java/android/view/RoundScrollbarRenderer.java b/core/java/android/view/RoundScrollbarRenderer.java index b77be8c00e69..694232f9dfd5 100644 --- a/core/java/android/view/RoundScrollbarRenderer.java +++ b/core/java/android/view/RoundScrollbarRenderer.java @@ -31,8 +31,8 @@ class RoundScrollbarRenderer { private static final int MAX_SCROLLBAR_ANGLE_SWIPE = 16; private static final int MIN_SCROLLBAR_ANGLE_SWIPE = 6; private static final float WIDTH_PERCENTAGE = 0.02f; - private static final int DEFAULT_THUMB_COLOR = 0xFF757575; - private static final int DEFAULT_TRACK_COLOR = 0x21FFFFFF; + private static final int DEFAULT_THUMB_COLOR = 0x4CFFFFFF; + private static final int DEFAULT_TRACK_COLOR = 0x26FFFFFF; private final Paint mThumbPaint = new Paint(); private final Paint mTrackPaint = new Paint(); diff --git a/core/java/android/view/inputmethod/InputConnection.java b/core/java/android/view/inputmethod/InputConnection.java index 8023201bc284..71c1d624976b 100644 --- a/core/java/android/view/inputmethod/InputConnection.java +++ b/core/java/android/view/inputmethod/InputConnection.java @@ -860,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. * - * <p>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:</p> + * <p>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:</p> * <ul> - * <li>Editor must keep {@link EditorInfo#contentMimeTypes} to be {@code null} if it does + * <li>Editor must keep {@link EditorInfo#contentMimeTypes} equal to {@code null} if it does * not support this method at all.</li> * <li>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}. * </li> - * <li>Editor can ignore the cursor position when inserting the provided context.</li> + * <li>Editor can ignore the cursor position when inserting the provided content.</li> * <li>Editor can return {@code true} asynchronously, even before it starts loading the * content.</li> - * <li>Editor should provide a way to delete the content inserted by this method, or revert - * the effect caused by this method.</li> + * <li>Editor should provide a way to delete the content inserted by this method or to + * revert the effect caused by this method.</li> * <li>IME should not call this method when there is any composing text, in case calling - * this method causes focus change.</li> + * this method causes a focus change.</li> * <li>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.</li> * </ul> * * @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/widget/ArrayAdapter.java b/core/java/android/widget/ArrayAdapter.java index 9d228cf667b1..bbc50dafa576 100644 --- a/core/java/android/widget/ArrayAdapter.java +++ b/core/java/android/widget/ArrayAdapter.java @@ -312,10 +312,10 @@ public class ArrayAdapter<T> extends BaseAdapter implements Filterable, ThemedSp } /** - * Control whether methods that change the list ({@link #add}, - * {@link #insert}, {@link #remove}, {@link #clear}) automatically call - * {@link #notifyDataSetChanged}. If set to false, caller must - * manually call notifyDataSetChanged() to have the changes + * Control whether methods that change the list ({@link #add}, {@link #addAll(Collection)}, + * {@link #addAll(Object[])}, {@link #insert}, {@link #remove}, {@link #clear}, + * {@link #sort(Comparator)}) automatically call {@link #notifyDataSetChanged}. If set to + * false, caller must manually call notifyDataSetChanged() to have the changes * reflected in the attached view. * * The default is true, and calling notifyDataSetChanged() diff --git a/core/java/com/android/internal/policy/EmergencyAffordanceManager.java b/core/java/com/android/internal/policy/EmergencyAffordanceManager.java index bed7c1ba4ed3..eb75bd497434 100644 --- a/core/java/com/android/internal/policy/EmergencyAffordanceManager.java +++ b/core/java/com/android/internal/policy/EmergencyAffordanceManager.java @@ -20,6 +20,7 @@ import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Build; +import android.os.UserHandle; import android.provider.Settings; /** @@ -72,7 +73,7 @@ public class EmergencyAffordanceManager { Intent intent = new Intent(Intent.ACTION_CALL_EMERGENCY); intent.setData(getPhoneUri(context)); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(intent); + context.startActivityAsUser(intent, UserHandle.CURRENT); } /** diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp index d1fe07bcc779..f94c86150dc6 100644 --- a/core/jni/com_android_internal_os_Zygote.cpp +++ b/core/jni/com_android_internal_os_Zygote.cpp @@ -454,6 +454,20 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra SetForkLoad(true); #endif + sigset_t sigchld; + sigemptyset(&sigchld); + sigaddset(&sigchld, SIGCHLD); + + // Temporarily block SIGCHLD during forks. The SIGCHLD handler might + // log, which would result in the logging FDs we close being reopened. + // This would cause failures because the FDs are not whitelisted. + // + // Note that the zygote process is single threaded at this point. + if (sigprocmask(SIG_BLOCK, &sigchld, nullptr) == -1) { + ALOGE("sigprocmask(SIG_SETMASK, { SIGCHLD }) failed: %s", strerror(errno)); + RuntimeAbort(env, __LINE__, "Call to sigprocmask(SIG_BLOCK, { SIGCHLD }) failed."); + } + // Close any logging related FDs before we start evaluating the list of // file descriptors. __android_log_close(); @@ -485,6 +499,11 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra RuntimeAbort(env, __LINE__, "Unable to reopen whitelisted descriptors."); } + if (sigprocmask(SIG_UNBLOCK, &sigchld, nullptr) == -1) { + ALOGE("sigprocmask(SIG_SETMASK, { SIGCHLD }) failed: %s", strerror(errno)); + RuntimeAbort(env, __LINE__, "Call to sigprocmask(SIG_UNBLOCK, { SIGCHLD }) failed."); + } + // Keep capabilities across UID change, unless we're staying root. if (uid != 0) { EnableKeepCapabilities(env); @@ -618,6 +637,11 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra SetForkLoad(false); #endif + // We blocked SIGCHLD prior to a fork, we unblock it here. + if (sigprocmask(SIG_UNBLOCK, &sigchld, nullptr) == -1) { + ALOGE("sigprocmask(SIG_SETMASK, { SIGCHLD }) failed: %s", strerror(errno)); + RuntimeAbort(env, __LINE__, "Call to sigprocmask(SIG_UNBLOCK, { SIGCHLD }) failed."); + } } return pid; } diff --git a/core/jni/fd_utils-inl.h b/core/jni/fd_utils-inl.h index af2706911949..e1ed5416e012 100644 --- a/core/jni/fd_utils-inl.h +++ b/core/jni/fd_utils-inl.h @@ -240,6 +240,18 @@ class FileDescriptorInfo { is_sock(false) { } + static bool StartsWith(const std::string& str, const std::string& prefix) { + return str.compare(0, prefix.size(), prefix) == 0; + } + + static bool EndsWith(const std::string& str, const std::string& suffix) { + if (suffix.size() > str.size()) { + return false; + } + + return str.compare(str.size() - suffix.size(), suffix.size(), suffix) == 0; + } + // Returns true iff. a given path is whitelisted. A path is whitelisted // if it belongs to the whitelist (see kPathWhitelist) or if it's a path // under /system/framework that ends with ".jar" or if it is a system @@ -251,31 +263,40 @@ class FileDescriptorInfo { } } - static const char* kFrameworksPrefix = "/system/framework/"; - static const char* kJarSuffix = ".jar"; - if (android::base::StartsWith(path, kFrameworksPrefix) - && android::base::EndsWith(path, kJarSuffix)) { + static const std::string kFrameworksPrefix = "/system/framework/"; + static const std::string kJarSuffix = ".jar"; + if (StartsWith(path, kFrameworksPrefix) && EndsWith(path, kJarSuffix)) { return true; } // Whitelist files needed for Runtime Resource Overlay, like these: // /system/vendor/overlay/framework-res.apk - // /system/vendor/overlay/PG/android-framework-runtime-resource-overlay.apk + // /system/vendor/overlay-subdir/pg/framework-res.apk // /data/resource-cache/system@vendor@overlay@framework-res.apk@idmap - // /data/resource-cache/system@vendor@overlay@PG@framework-res.apk@idmap - static const char* kOverlayDir = "/system/vendor/overlay/"; - static const char* kApkSuffix = ".apk"; + // /data/resource-cache/system@vendor@overlay-subdir@pg@framework-res.apk@idmap + // See AssetManager.cpp for more details on overlay-subdir. + static const std::string kOverlayDir = "/system/vendor/overlay/"; + static const std::string kVendorOverlayDir = "/vendor/overlay"; + static const std::string kOverlaySubdir = "/system/vendor/overlay-subdir/"; + static const std::string kApkSuffix = ".apk"; + + if ((StartsWith(path, kOverlayDir) || StartsWith(path, kOverlaySubdir) + || StartsWith(path, kVendorOverlayDir)) + && EndsWith(path, kApkSuffix) + && path.find("/../") == std::string::npos) { + return true; + } - if (android::base::StartsWith(path, kOverlayDir) - && android::base::EndsWith(path, kApkSuffix) + static const std::string kOverlayIdmapPrefix = "/data/resource-cache/"; + static const std::string kOverlayIdmapSuffix = ".apk@idmap"; + if (StartsWith(path, kOverlayIdmapPrefix) && EndsWith(path, kOverlayIdmapSuffix) && path.find("/../") == std::string::npos) { return true; } - static const char* kOverlayIdmapPrefix = "/data/resource-cache/"; - static const char* kOverlayIdmapSuffix = ".apk@idmap"; - if (android::base::StartsWith(path, kOverlayIdmapPrefix) - && android::base::EndsWith(path, kOverlayIdmapSuffix)) { + // All regular files that are placed under this path are whitelisted automatically. + static const std::string kZygoteWhitelistPath = "/vendor/zygote_whitelist/"; + if (StartsWith(path, kZygoteWhitelistPath) && path.find("/../") == std::string::npos) { return true; } diff --git a/core/res/res/layout-notround-watch/alert_dialog_title_material.xml b/core/res/res/layout-notround-watch/alert_dialog_title_material.xml index 0ab56f95efbe..08eecef1da95 100644 --- a/core/res/res/layout-notround-watch/alert_dialog_title_material.xml +++ b/core/res/res/layout-notround-watch/alert_dialog_title_material.xml @@ -18,14 +18,14 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" + android:paddingTop="?attr/dialogPreferredPadding" + android:paddingBottom="8dp" android:orientation="vertical" - android:gravity="top|center_horizontal" - android:minHeight="@dimen/alert_dialog_title_height"> + android:gravity="center_horizontal|top"> <ImageView android:id="@+id/icon" android:adjustViewBounds="true" android:maxHeight="24dp" android:maxWidth="24dp" - android:layout_marginTop="8dp" android:layout_marginStart="8dp" android:layout_marginBottom="8dp" android:layout_width="wrap_content" @@ -33,7 +33,6 @@ android:src="@null" /> <TextView android:id="@+id/alertTitle" style="?android:attr/windowTitleStyle" - android:layout_marginBottom="8dp" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> diff --git a/core/res/res/layout-round-watch/alert_dialog_title_material.xml b/core/res/res/layout-round-watch/alert_dialog_title_material.xml index aefe28f7f359..dac1e324be81 100644 --- a/core/res/res/layout-round-watch/alert_dialog_title_material.xml +++ b/core/res/res/layout-round-watch/alert_dialog_title_material.xml @@ -18,6 +18,7 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" + android:paddingBottom="8dp" android:orientation="vertical" android:gravity="top|center_horizontal"> <FrameLayout @@ -30,7 +31,6 @@ android:maxHeight="24dp" android:maxWidth="24dp" android:layout_marginTop="@dimen/screen_percentage_10" - android:layout_marginBottom="8dp" android:layout_gravity="center_horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" @@ -38,7 +38,6 @@ </FrameLayout> <TextView android:id="@+id/alertTitle" style="?android:attr/windowTitleStyle" - android:layout_marginBottom="8dp" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> diff --git a/core/res/res/layout-watch/alert_dialog_material.xml b/core/res/res/layout-watch/alert_dialog_material.xml index 2fe13de2120a..960b927a0e64 100644 --- a/core/res/res/layout-watch/alert_dialog_material.xml +++ b/core/res/res/layout-watch/alert_dialog_material.xml @@ -50,7 +50,7 @@ <TextView android:id="@+id/message" android:layout_width="match_parent" android:layout_height="wrap_content" - android:gravity="@integer/config_dialogTextGravity" + android:gravity="center_horizontal|top" android:textAppearance="@style/TextAppearance.Material.Subhead" android:paddingStart="?dialogPreferredPadding" android:paddingEnd="?dialogPreferredPadding" @@ -80,7 +80,6 @@ android:layout_height="wrap_content" android:layout_gravity="bottom" android:orientation="vertical" - android:minHeight="@dimen/alert_dialog_button_bar_height" android:paddingBottom="?dialogPreferredPadding" style="?android:attr/buttonBarStyle" android:measureWithLargestChild="true"> diff --git a/core/res/res/layout-watch/preference_list_fragment_material.xml b/core/res/res/layout-watch/preference_list_fragment_material.xml index ae8f203a7ce6..22e66d513936 100644 --- a/core/res/res/layout-watch/preference_list_fragment_material.xml +++ b/core/res/res/layout-watch/preference_list_fragment_material.xml @@ -44,7 +44,7 @@ android:paddingEnd="@dimen/dialog_padding_material" android:paddingBottom="8dp" android:textAppearance="@style/TextAppearance.Material.Title" - android:gravity="center" /> + android:gravity="center_horizontal|top" /> </com.android.internal.widget.WatchHeaderListView> </FrameLayout> diff --git a/core/res/res/layout/select_dialog_multichoice_material.xml b/core/res/res/layout/select_dialog_multichoice_material.xml index 36e8e57b2988..731fe1619634 100644 --- a/core/res/res/layout/select_dialog_multichoice_material.xml +++ b/core/res/res/layout/select_dialog_multichoice_material.xml @@ -26,5 +26,5 @@ android:paddingStart="@dimen/select_dialog_padding_start_material" android:paddingEnd="?attr/dialogPreferredPadding" android:drawableStart="?attr/listChoiceIndicatorMultiple" - android:drawablePadding="20dp" + android:drawablePadding="@dimen/select_dialog_drawable_padding_start_material" android:ellipsize="marquee" /> diff --git a/core/res/res/layout/select_dialog_singlechoice_material.xml b/core/res/res/layout/select_dialog_singlechoice_material.xml index 995272ad80ef..77b693058e82 100644 --- a/core/res/res/layout/select_dialog_singlechoice_material.xml +++ b/core/res/res/layout/select_dialog_singlechoice_material.xml @@ -26,5 +26,5 @@ android:paddingStart="@dimen/select_dialog_padding_start_material" android:paddingEnd="?attr/dialogPreferredPadding" android:drawableStart="?attr/listChoiceIndicatorSingle" - android:drawablePadding="20dp" + android:drawablePadding="@dimen/select_dialog_drawable_padding_start_material" android:ellipsize="marquee" /> diff --git a/core/res/res/values-bn-rBD/strings.xml b/core/res/res/values-bn-rBD/strings.xml index 8d893e53a91c..1274e963e30b 100644 --- a/core/res/res/values-bn-rBD/strings.xml +++ b/core/res/res/values-bn-rBD/strings.xml @@ -1432,7 +1432,7 @@ <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string> <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"সরান"</string> <string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"প্রস্তাবিত স্তরের চেয়ে বেশি উঁচুতে ভলিউম বাড়াবেন?\n\nউঁচু ভলিউমে বেশি সময় ধরে কিছু শুনলে আপনার শ্রবনশক্তির ক্ষতি হতে পারে।"</string> - <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"অ্যাক্সেসযোগ্যতা সক্রিয় করতে দুইটি আঙ্গুলকে চেপে নীচে ধরে রাখুন৷"</string> + <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"অ্যাক্সেসযোগ্যতা সক্রিয় করতে দুইটি আঙ্গুলকে চেপে নিচে ধরে রাখুন৷"</string> <string name="accessibility_enabled" msgid="1381972048564547685">"অ্যাক্সেসযোগ্যতা সক্ষম করা হয়েছে৷"</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"অ্যাক্সেসযোগ্যতা বাতিল করা হয়েছে৷"</string> <string name="user_switched" msgid="3768006783166984410">"বর্তমান ব্যবহারকারী <xliff:g id="NAME">%1$s</xliff:g>৷"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 137d924ac1fc..b0dbb1d72a88 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -67,8 +67,8 @@ </plurals> <string name="imei" msgid="2625429890869005782">"IMEI"</string> <string name="meid" msgid="4841221237681254195">"MEID"</string> - <string name="ClipMmi" msgid="6952821216480289285">"ID de l\'emissor (trucada entrant)"</string> - <string name="ClirMmi" msgid="7784673673446833091">"ID de l\'emissor (trucada de sortida)"</string> + <string name="ClipMmi" msgid="6952821216480289285">"Identificador de trucada (trucada entrant)"</string> + <string name="ClirMmi" msgid="7784673673446833091">"Identificador de trucada (trucada de sortida)"</string> <string name="ColpMmi" msgid="3065121483740183974">"Identificador de la línia connectada"</string> <string name="ColrMmi" msgid="4996540314421889589">"Restricció de l\'identificador de la línia connectada"</string> <string name="CfMmi" msgid="5123218989141573515">"Desviació de trucades"</string> @@ -82,12 +82,12 @@ <string name="RuacMmi" msgid="7827887459138308886">"Rebuig de trucades molestes no desitjades"</string> <string name="CndMmi" msgid="3116446237081575808">"Lliurament de número que truca"</string> <string name="DndMmi" msgid="1265478932418334331">"No molesteu"</string> - <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"El valor predeterminat de l\'identificador de l\'emissor és restringit. Següent trucada: restringit"</string> - <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"El valor predeterminat de l\'identificador de l\'emissor és restringit. Següent trucada: no restringit"</string> - <string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"El valor predeterminat de l\'identificador de l\'emissor és no restringit. Següent trucada: restringit"</string> - <string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"El valor predeterminat de l\'identificador de l\'emissor és no restringit. Següent trucada: no restringit"</string> + <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"El valor predeterminat de l\'identificador de trucada és restringit. Trucada següent: restringit"</string> + <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"El valor predeterminat de l\'identificador de trucada és restringit. Trucada següent: no restringit"</string> + <string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"El valor predeterminat de l\'identificador de trucada és no restringit. Trucada següent: restringit"</string> + <string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"El valor predeterminat de l\'identificador de trucada és no restringit. Trucada següent: no restringit"</string> <string name="serviceNotProvisioned" msgid="8614830180508686666">"No s\'ha proveït el servei."</string> - <string name="CLIRPermanent" msgid="3377371145926835671">"No pots canviar la configuració de l\'identificador de l\'emissor."</string> + <string name="CLIRPermanent" msgid="3377371145926835671">"No pots canviar la configuració de l\'identificador de trucada."</string> <string name="RestrictedOnData" msgid="8653794784690065540">"El servei de dades està bloquejat."</string> <string name="RestrictedOnEmergency" msgid="6581163779072833665">"El servei d\'emergència està bloquejat."</string> <string name="RestrictedOnNormal" msgid="4953867011389750673">"El servei de veu està bloquejat."</string> diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml index 160efff177e3..572d716a4761 100644 --- a/core/res/res/values-hy-rAM/strings.xml +++ b/core/res/res/values-hy-rAM/strings.xml @@ -1137,7 +1137,7 @@ <string name="time_picker_dialog_title" msgid="8349362623068819295">"Սահմանել ժամը"</string> <string name="date_picker_dialog_title" msgid="5879450659453782278">"Սահմանել ամսաթիվը"</string> <string name="date_time_set" msgid="5777075614321087758">"Սահմանել"</string> - <string name="date_time_done" msgid="2507683751759308828">"Կատարված է"</string> + <string name="date_time_done" msgid="2507683751759308828">"Պատրաստ է"</string> <string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff33b5e5">"Նոր` "</font></string> <string name="perms_description_app" msgid="5139836143293299417">"Տրամադրված է <xliff:g id="APP_NAME">%1$s</xliff:g>-ի կողմից:"</string> <string name="no_permissions" msgid="7283357728219338112">"Թույլտվություններ չեն պահանջվում"</string> @@ -1214,7 +1214,7 @@ <string name="ime_action_search" msgid="658110271822807811">"Որոնել"</string> <string name="ime_action_send" msgid="2316166556349314424">"Ուղարկել"</string> <string name="ime_action_next" msgid="3138843904009813834">"Հաջորդը"</string> - <string name="ime_action_done" msgid="8971516117910934605">"Կատարված է"</string> + <string name="ime_action_done" msgid="8971516117910934605">"Պատրաստ է"</string> <string name="ime_action_previous" msgid="1443550039250105948">"Նախորդ"</string> <string name="ime_action_default" msgid="2840921885558045721">"Կատարել"</string> <string name="dial_number_using" msgid="5789176425167573586">"Հավաքել հեռախոսահամարը`\nօգտագործելով <xliff:g id="NUMBER">%s</xliff:g>-ը"</string> @@ -1263,7 +1263,7 @@ <item quantity="one"><xliff:g id="INDEX">%d</xliff:g>՝ <xliff:g id="TOTAL">%d</xliff:g>-ից</item> <item quantity="other"><xliff:g id="INDEX">%d</xliff:g>՝ <xliff:g id="TOTAL">%d</xliff:g>-ից</item> </plurals> - <string name="action_mode_done" msgid="7217581640461922289">"Կատարված է"</string> + <string name="action_mode_done" msgid="7217581640461922289">"Պատրաստ է"</string> <string name="progress_erasing" product="nosdcard" msgid="4521573321524340058">"Ջնջում է USB կրիչը..."</string> <string name="progress_erasing" product="default" msgid="6596988875507043042">"Ջնջում է SD քարտը..."</string> <string name="share" msgid="1778686618230011964">"Կիսվել"</string> @@ -1305,7 +1305,7 @@ <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string> <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Չեղարկել"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Ջնջել"</string> - <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Կատարված է"</string> + <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Պատրաստ է"</string> <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Ռեժիմի փոփոխում"</string> <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Մուտք"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index b23a96637c57..39824c72f072 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -254,7 +254,7 @@ <string name="permgrouplab_storage" msgid="1971118770546336966">"저장"</string> <string name="permgroupdesc_storage" msgid="637758554581589203">"기기 사진, 미디어, 파일 액세스"</string> <string name="permgrouplab_microphone" msgid="171539900250043464">"마이크"</string> - <string name="permgroupdesc_microphone" msgid="4988812113943554584">"오디오를 녹음할 수 있도록"</string> + <string name="permgroupdesc_microphone" msgid="4988812113943554584">"오디오 녹음"</string> <string name="permgrouplab_camera" msgid="4820372495894586615">"카메라"</string> <string name="permgroupdesc_camera" msgid="3250611594678347720">"사진 및 동영상 촬영"</string> <string name="permgrouplab_phone" msgid="5229115638567440675">"전화"</string> diff --git a/core/res/res/values-notround-watch/dimens_material.xml b/core/res/res/values-notround-watch/dimens_material.xml index 9cacb117cf7b..9fdf55b8a31d 100644 --- a/core/res/res/values-notround-watch/dimens_material.xml +++ b/core/res/res/values-notround-watch/dimens_material.xml @@ -15,12 +15,16 @@ --> <resources> <dimen name="dialog_padding_material">8dp</dimen> - <dimen name="preference_fragment_padding_vertical_material">0dp</dimen> + <dimen name="preference_fragment_padding_vertical_material">8dp</dimen> - <dimen name="list_item_padding_horizontal_material">16dp</dimen> - <dimen name="list_item_padding_start_material">16dp</dimen> - <dimen name="list_item_padding_end_material">16dp</dimen> + <dimen name="list_item_padding_horizontal_material">8dp</dimen> + <dimen name="list_item_padding_start_material">8dp</dimen> + <dimen name="list_item_padding_end_material">8dp</dimen> - <dimen name="dialog_list_padding_top_no_title">8dp</dimen> - <dimen name="dialog_list_padding_bottom_no_buttons">8dp</dimen> + <dimen name="dialog_list_padding_top_no_title">0dp</dimen> + <dimen name="dialog_list_padding_bottom_no_buttons">0dp</dimen> + + <!-- Dialog padding minus control padding, used to fix alignment. --> + <dimen name="select_dialog_padding_start_material">8dp</dimen> + <dimen name="select_dialog_drawable_padding_start_material">8dp</dimen> </resources> diff --git a/core/res/res/values-round-watch/config_material.xml b/core/res/res/values-round-watch/config_material.xml index 11798709f148..ae4a6eedf4fd 100644 --- a/core/res/res/values-round-watch/config_material.xml +++ b/core/res/res/values-round-watch/config_material.xml @@ -20,9 +20,6 @@ <!-- Don't clip on round screens so the list can scroll past the rounded edges. --> <bool name="config_preferenceFragmentClipToPadding">false</bool> - <!-- Gravity that should be used for dialog text styles. Equivalent to: Gravity.CENTER_HORIZONTAL | Gravity.TOP --> - <integer name="config_dialogTextGravity">0x00000031</integer> - <!-- The amount to offset when scrolling to a selection in an AlertDialog --> <dimen name="config_alertDialogSelectionScrollOffset">@dimen/screen_percentage_15</dimen> </resources> diff --git a/core/res/res/values-round-watch/dimens_material.xml b/core/res/res/values-round-watch/dimens_material.xml index f2de4e013a78..c8f27b1724e3 100644 --- a/core/res/res/values-round-watch/dimens_material.xml +++ b/core/res/res/values-round-watch/dimens_material.xml @@ -23,4 +23,8 @@ <dimen name="dialog_list_padding_top_no_title">@dimen/screen_percentage_15</dimen> <dimen name="dialog_list_padding_bottom_no_buttons">@dimen/screen_percentage_15</dimen> + + <!-- Dialog padding minus control padding, used to fix alignment. --> + <dimen name="select_dialog_padding_start_material">@dimen/screen_percentage_15</dimen> + <dimen name="select_dialog_drawable_padding_start_material">8dp</dimen> </resources> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 1351f169a130..7d6ed4788d26 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -671,7 +671,7 @@ <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Nödsamtalsnummer"</string> <string name="lockscreen_carrier_default" msgid="6169005837238288522">"Ingen tjänst"</string> <string name="lockscreen_screen_locked" msgid="7288443074806832904">"Skärmen har låsts."</string> - <string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Tryck på Menu om du vill låsa upp eller ringa nödsamtal."</string> + <string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Tryck på Menu för att låsa upp eller ringa nödsamtal."</string> <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Tryck på Menu för att låsa upp."</string> <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Rita grafiskt lösenord för att låsa upp"</string> <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Nödsamtal"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index a089fd42feb6..efc7adac8e13 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -773,7 +773,7 @@ <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Bu sayfada kal"</string> <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>\n\nBu sayfadan ayrılmak istediğinizden emin misiniz?"</string> <string name="save_password_label" msgid="6860261758665825069">"Onayla"</string> - <string name="double_tap_toast" msgid="4595046515400268881">"İpucu: Yakınlaştırmak ve uzaklaştırmak için iki kez hafifçe dokunun."</string> + <string name="double_tap_toast" msgid="4595046515400268881">"İpucu: Yakınlaştırmak ve uzaklaştırmak için iki kez dokunun."</string> <string name="autofill_this_form" msgid="4616758841157816676">"Otomatik Doldur"</string> <string name="setup_autofill" msgid="7103495070180590814">"Otomatik doldurma ayarla"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> @@ -1133,7 +1133,7 @@ <string name="carrier_app_dialog_button" msgid="7900235513678617329">"UYGULAMAYI AL"</string> <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"ŞİMDİ DEĞİL"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"Yeni SIM kart takıldı"</string> - <string name="carrier_app_notification_text" msgid="1132487343346050225">"Kurmak için hafifçe dokunun"</string> + <string name="carrier_app_notification_text" msgid="1132487343346050225">"Kurmak için dokunun"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"Saati ayarlayın"</string> <string name="date_picker_dialog_title" msgid="5879450659453782278">"Tarihi ayarlayın"</string> <string name="date_time_set" msgid="5777075614321087758">"Ayarla"</string> @@ -1531,7 +1531,7 @@ <string name="reason_unknown" msgid="6048913880184628119">"bilinmiyor"</string> <string name="reason_service_unavailable" msgid="7824008732243903268">"Yazdırma hizmeti etkin değil"</string> <string name="print_service_installed_title" msgid="2246317169444081628">"<xliff:g id="NAME">%s</xliff:g> hizmeti yüklendi"</string> - <string name="print_service_installed_message" msgid="5897362931070459152">"Etkinleştirmek için hafifçe dokunun"</string> + <string name="print_service_installed_message" msgid="5897362931070459152">"Etkinleştirmek için dokunun"</string> <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Yönetici PIN\'ini girin"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"PIN\'i girin"</string> <string name="restr_pin_incorrect" msgid="8571512003955077924">"Yanlış"</string> @@ -1659,9 +1659,9 @@ <string name="user_encrypted_message" msgid="4923292604515744267">"Kilidi açmak için dokunun"</string> <string name="user_encrypted_detail" msgid="5708447464349420392">"Kullanıcı verileri kilitlendi"</string> <string name="profile_encrypted_detail" msgid="3700965619978314974">"İş profili kilitlendi"</string> - <string name="profile_encrypted_message" msgid="6964994232310195874">"İş profilinin kilidini açmak için hafifçe dokunun"</string> + <string name="profile_encrypted_message" msgid="6964994232310195874">"İş profilinin kilidini açmak için dokunun"</string> <string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"<xliff:g id="PRODUCT_NAME">%1$s</xliff:g> cihazına bağlandı"</string> - <string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Dosyaları görüntülemek için hafifçe dokunun"</string> + <string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Dosyaları görüntülemek için dokunun"</string> <string name="pin_target" msgid="3052256031352291362">"Sabitle"</string> <string name="unpin_target" msgid="3556545602439143442">"Sabitlemeyi kaldır"</string> <string name="app_info" msgid="6856026610594615344">"Uygulama bilgileri"</string> diff --git a/core/res/res/values-watch/colors_material.xml b/core/res/res/values-watch/colors_material.xml index 18bfd4db5ae0..1456976e897e 100644 --- a/core/res/res/values-watch/colors_material.xml +++ b/core/res/res/values-watch/colors_material.xml @@ -14,13 +14,13 @@ limitations under the License. --> <resources> - <color name="background_material_dark">#ff232e33</color> - <color name="background_floating_material_dark">#ff3e5059</color> + <color name="background_material_dark">#232E33</color> + <color name="background_floating_material_dark">#3E5059</color> - <color name="accent_material_700">#ff2e4978</color> - <color name="accent_material_light">#ff4285f4</color> - <color name="accent_material_dark">#ff5e97f6</color> - <color name="accent_material_50">#ffd0def7</color> + <color name="accent_material_700">#5385DB</color> + <color name="accent_material_light">#75A4F5</color> + <color name="accent_material_dark">#5E97F6</color> + <color name="accent_material_50">#93B7F5</color> <color name="primary_material_dark">#4D4D4D</color> diff --git a/core/res/res/values-watch/config.xml b/core/res/res/values-watch/config.xml index 7c05b7a8e362..d13d15468825 100644 --- a/core/res/res/values-watch/config.xml +++ b/core/res/res/values-watch/config.xml @@ -62,4 +62,7 @@ ListView/GridView are notably absent since this is their default anyway. Set to true for watch devices. --> <bool name="config_focusScrollContainersInTouchMode">true</bool> + + <!-- The small screens of watch devices makes multi-window support undesireable. --> + <bool name="config_supportsMultiWindow">false</bool> </resources> diff --git a/core/res/res/values-notround-watch/config_material.xml b/core/res/res/values-watch/dimens.xml index a99674f3f060..4c8b39ca92a7 100644 --- a/core/res/res/values-notround-watch/config_material.xml +++ b/core/res/res/values-watch/dimens.xml @@ -13,13 +13,9 @@ See the License for the specific language governing permissions and limitations under the License. --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds, only for Material theme. Do not translate. - - NOTE: The naming convention is "config_camelCaseValue". --> - -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- Gravity that should be used for dialog text styles. Equivalent to: Gravity.START | Gravity.TOP --> - <integer name="config_dialogTextGravity">0x00800033</integer> +<resources> + <!-- Dialog title height, not used in watch due to dynamically sized button bar --> + <dimen name="alert_dialog_title_height">0dp</dimen> + <!-- Dialog button bar height, not used in watch due to dynamically sized button bar --> + <dimen name="alert_dialog_button_bar_height">0dp</dimen> </resources> diff --git a/core/res/res/values-watch/styles_material.xml b/core/res/res/values-watch/styles_material.xml index af4207ed4e6f..0053c12d9d84 100644 --- a/core/res/res/values-watch/styles_material.xml +++ b/core/res/res/values-watch/styles_material.xml @@ -98,7 +98,7 @@ please see styles_device_defaults.xml. <item name="maxLines">@empty</item> <item name="scrollHorizontally">false</item> <item name="textAppearance">@style/TextAppearance.Material.DialogWindowTitle</item> - <item name="gravity">@integer/config_dialogTextGravity</item> + <item name="gravity">center_horizontal|top</item> <item name="ellipsize">end</item> </style> </resources> diff --git a/core/res/res/values/colors_device_defaults.xml b/core/res/res/values/colors_device_defaults.xml index 89691e90d46e..8f0350a887b9 100644 --- a/core/res/res/values/colors_device_defaults.xml +++ b/core/res/res/values/colors_device_defaults.xml @@ -28,10 +28,10 @@ <color name="tertiary_device_default_settings">@color/tertiary_material_settings</color> <color name="quaternary_device_default_settings">@color/quaternary_material_settings</color> - <color name="accent_device_default_700">@color/material_deep_teal_700</color> + <color name="accent_device_default_700">@color/accent_material_700</color> <color name="accent_device_default_light">@color/accent_material_light</color> <color name="accent_device_default_dark">@color/accent_material_dark</color> - <color name="accent_device_default_50">@color/material_deep_teal_50</color> + <color name="accent_device_default_50">@color/accent_material_50</color> <color name="background_device_default_dark">@color/background_material_dark</color> <color name="background_device_default_light">@color/background_material_light</color> diff --git a/core/res/res/values/colors_material.xml b/core/res/res/values/colors_material.xml index 92426c6a9bca..37feff8daf7f 100644 --- a/core/res/res/values/colors_material.xml +++ b/core/res/res/values/colors_material.xml @@ -36,8 +36,10 @@ <color name="tertiary_material_settings">@color/material_blue_grey_700</color> <color name="quaternary_material_settings">@color/material_blue_grey_200</color> + <color name="accent_material_700">@color/material_deep_teal_700</color> <color name="accent_material_light">@color/material_deep_teal_500</color> <color name="accent_material_dark">@color/material_deep_teal_200</color> + <color name="accent_material_50">@color/material_deep_teal_50</color> <color name="button_material_dark">#ff5a595b</color> <color name="button_material_light">#ffd6d7d7</color> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index f8c463ce9ba2..90c19fb4e861 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1936,6 +1936,12 @@ mirror the content of the default display. --> <bool name="config_localDisplaysMirrorContent">true</bool> + <!-- The default mode for the default display. One of the following values (See Display.java): + 0 - COLOR_MODE_DEFAULT + 7 - COLOR_MODE_SRGB + --> + <integer name="config_defaultDisplayDefaultColorMode">0</integer> + <!-- When true use the linux /dev/input/event subsystem to detect the switch changes on the headphone/microphone jack. When false use the older uevent framework. --> <bool name="config_useDevInputEventForAudioJack">false</bool> diff --git a/core/res/res/values/dimens_material.xml b/core/res/res/values/dimens_material.xml index 30e7b3137712..ebe577c73758 100644 --- a/core/res/res/values/dimens_material.xml +++ b/core/res/res/values/dimens_material.xml @@ -129,6 +129,7 @@ <!-- Dialog padding minus control padding, used to fix alignment. --> <dimen name="select_dialog_padding_start_material">20dp</dimen> + <dimen name="select_dialog_drawable_padding_start_material">20dp</dimen> <dimen name="seekbar_track_background_height_material">2dp</dimen> <dimen name="seekbar_track_progress_height_material">2dp</dimen> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index ecce83368266..bbfee1420100 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -307,6 +307,7 @@ <java-symbol type="bool" name="config_supportsMultiWindow" /> <java-symbol type="bool" name="config_guestUserEphemeral" /> <java-symbol type="bool" name="config_localDisplaysMirrorContent" /> + <java-symbol type="integer" name="config_defaultDisplayDefaultColorMode" /> <java-symbol type="bool" name="config_enableAppWidgetService" /> <java-symbol type="string" name="config_defaultPictureInPictureBounds" /> <java-symbol type="integer" name="config_wifi_framework_5GHz_preference_boost_threshold" /> diff --git a/docs/html/guide/topics/resources/providing-resources.jd b/docs/html/guide/topics/resources/providing-resources.jd index 80a989a57e28..99aeb4379eeb 100644 --- a/docs/html/guide/topics/resources/providing-resources.jd +++ b/docs/html/guide/topics/resources/providing-resources.jd @@ -905,20 +905,25 @@ PNG file and two small XML files that point to it. (An example XML file is shown <h4>Drawable</h4> -<p>To create an alias to an existing drawable, use the {@code <bitmap>} element. -For example:</p> +<p> + To create an alias to an existing drawable, use the {@code <drawable>} + element. For example: +</p> <pre> <?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/icon_ca" /> +<resources> + <drawable name="icon">@drawable/icon_ca</drawable> +</resources> </pre> -<p>If you save this file as {@code icon.xml} (in an alternative resource directory, such as -{@code res/drawable-en-rCA/}), it is compiled into a resource that you -can reference as {@code R.drawable.icon}, but is actually an alias for the {@code -R.drawable.icon_ca} resource (which is saved in {@code res/drawable/}).</p> - +<p> + If you save this file as {@code drawables.xml} (in an alternative resource + directory, such as {@code res/values-en-rCA/}), it is compiled into a + resource that you can reference as {@code R.drawable.icon}, but is actually + an alias for the {@code R.drawable.icon_ca} resource (which is saved in + {@code res/drawable/}). +</p> <h4>Layout</h4> diff --git a/docs/html/guide/topics/ui/settings.jd b/docs/html/guide/topics/ui/settings.jd index 619fd268aef9..b51e6d97ae0a 100644 --- a/docs/html/guide/topics/ui/settings.jd +++ b/docs/html/guide/topics/ui/settings.jd @@ -390,7 +390,9 @@ setComponent()} method.</dd> <dd>The package part of the component name, as per the {@link android.content.Intent#setComponent setComponent()} method.</dd> </dl> - +<p class="note"><strong>Note: </strong>You must use string literals as the values for these +intent attributes. You cannot use resource strings, such as <code>@string/foo</code>, to define the attributes. +</p> <h2 id="Activity">Creating a Preference Activity</h2> diff --git a/libs/androidfw/AssetManager.cpp b/libs/androidfw/AssetManager.cpp index 98168ef986a6..80968e51d48c 100644 --- a/libs/androidfw/AssetManager.cpp +++ b/libs/androidfw/AssetManager.cpp @@ -805,6 +805,7 @@ void AssetManager::addSystemOverlays(const char* pathOverlaysList, sharedRes->add(oass, oidmap, offset + 1, false); const_cast<AssetManager*>(this)->mAssetPaths.add(oap); const_cast<AssetManager*>(this)->mZipSet.addOverlay(targetPackagePath, oap); + delete oidmap; } } diff --git a/packages/BackupRestoreConfirmation/res/values-bn-rBD/strings.xml b/packages/BackupRestoreConfirmation/res/values-bn-rBD/strings.xml index 440cb647c024..2b69d5bfd540 100644 --- a/packages/BackupRestoreConfirmation/res/values-bn-rBD/strings.xml +++ b/packages/BackupRestoreConfirmation/res/values-bn-rBD/strings.xml @@ -24,13 +24,13 @@ <string name="restore_confirm_text" msgid="7499866728030461776">"একটি সংযুক্ত ডেস্কটপ কম্পিউটার থেকে সমস্ত ডেটার সম্পূর্ণ ব্যাকআপ নেওয়ার অনুরোধ করা হয়েছে৷ আপনি কি এটি করার অনুমতি দিতে চান?\n\nযদি আপনি নিজের থেকে এই ব্যাকআপ নেওয়ার অনুরোধ না করে থাকেন, তবে এই প্রক্রিয়াটিতে অনুমতি প্রদান করবেন না৷ এটি বর্তমানে ডিভাইসটিতে থাকা সমস্ত ডেটাকে প্রতিস্থাপন করবে!"</string> <string name="allow_restore_button_label" msgid="3081286752277127827">"আমার ডেটা পুনরুদ্ধার করুন"</string> <string name="deny_restore_button_label" msgid="1724367334453104378">"পুনরুদ্ধার করবেন না"</string> - <string name="current_password_text" msgid="8268189555578298067">"দয়া করে নীচে আপনার বর্তমান ব্যাকআপের পাসওয়ার্ড দিন:"</string> - <string name="device_encryption_restore_text" msgid="1570864916855208992">"দয়া করে নীচে আপনার ডিভাইসের এনক্রিপশান পাসওয়ার্ড লিখুন৷"</string> - <string name="device_encryption_backup_text" msgid="5866590762672844664">"দয়া করে নীচে আপানার ডিভাইসের এনক্রিপশান পাসওয়ার্ড লিখুন৷ এছাড়াও ব্যাকআপ সংরক্ষণাগার এনক্রিপ্ট করতে এটি ব্যবহার করা হবে৷"</string> + <string name="current_password_text" msgid="8268189555578298067">"দয়া করে নিচে আপনার বর্তমান ব্যাকআপের পাসওয়ার্ড দিন:"</string> + <string name="device_encryption_restore_text" msgid="1570864916855208992">"দয়া করে নিচে আপনার ডিভাইসের এনক্রিপশান পাসওয়ার্ড লিখুন৷"</string> + <string name="device_encryption_backup_text" msgid="5866590762672844664">"দয়া করে নিচে আপানার ডিভাইসের এনক্রিপশান পাসওয়ার্ড লিখুন৷ এছাড়াও ব্যাকআপ সংরক্ষণাগার এনক্রিপ্ট করতে এটি ব্যবহার করা হবে৷"</string> <string name="backup_enc_password_text" msgid="4981585714795233099">"সম্পূর্ণ ব্যাকআপ ডেটা এনক্রিপ্ট করতে দয়া করে একটি পাসওয়ার্ড লিখুন৷ যদি এটি খালি রেখে দেওয়া হয় তবে আপনার বর্তমান ব্যাকআপ পাসওয়ার্ডটি ব্যবহার করা হবে:"</string> - <string name="backup_enc_password_optional" msgid="1350137345907579306">"আপনি যদি সম্পূর্ণ ব্যাকআপ ডেটা এনক্রিপ্ট করতে চান তাহলে নীচে একটি পাসওয়ার্ড লিখুন:"</string> - <string name="backup_enc_password_required" msgid="7889652203371654149">"আপনার ডিভাইস এনক্রিপ্ট হয়ে থাকার কারণে আপনার ব্যাকআপকে এনক্রিপ্ট করতে হবে। দয়া করে নীচে একটি পাসওয়ার্ড দিন:"</string> - <string name="restore_enc_password_text" msgid="6140898525580710823">"যদি পুনরুদ্ধার করা ডেটা এনক্রিপ্ট করা থাকে, তবে দয়া করে নীচে পাসওয়ার্ডটি লিখুন:"</string> + <string name="backup_enc_password_optional" msgid="1350137345907579306">"আপনি যদি সম্পূর্ণ ব্যাকআপ ডেটা এনক্রিপ্ট করতে চান তাহলে নিচে একটি পাসওয়ার্ড লিখুন:"</string> + <string name="backup_enc_password_required" msgid="7889652203371654149">"আপনার ডিভাইস এনক্রিপ্ট হয়ে থাকার কারণে আপনার ব্যাকআপকে এনক্রিপ্ট করতে হবে। দয়া করে নিচে একটি পাসওয়ার্ড দিন:"</string> + <string name="restore_enc_password_text" msgid="6140898525580710823">"যদি পুনরুদ্ধার করা ডেটা এনক্রিপ্ট করা থাকে, তবে দয়া করে নিচে পাসওয়ার্ডটি লিখুন:"</string> <string name="toast_backup_started" msgid="550354281452756121">"ব্যাকআপ নেওয়া শুরু হয়েছে..."</string> <string name="toast_backup_ended" msgid="3818080769548726424">"ব্যাকআপ নেওয়া সম্পূর্ণ হয়েছে"</string> <string name="toast_restore_started" msgid="7881679218971277385">"পুনরুদ্ধার করা শুরু হচ্ছে..."</string> diff --git a/packages/BackupRestoreConfirmation/res/values-sk/strings.xml b/packages/BackupRestoreConfirmation/res/values-sk/strings.xml index 804f980b1674..44d01deafe6b 100644 --- a/packages/BackupRestoreConfirmation/res/values-sk/strings.xml +++ b/packages/BackupRestoreConfirmation/res/values-sk/strings.xml @@ -19,7 +19,7 @@ <string name="backup_confirm_title" msgid="827563724209303345">"Úplná záloha"</string> <string name="restore_confirm_title" msgid="5469365809567486602">"Úplné obnovenie"</string> <string name="backup_confirm_text" msgid="1878021282758896593">"Bola vyžiadaná úplná záloha všetkých dát do pripojeného počítača. Chcete túto akciu povoliť?\n\nAk ste zálohu nevyžiadali vy, túto operáciu nepovoľujte."</string> - <string name="allow_backup_button_label" msgid="4217228747769644068">"Zálohovať dáta"</string> + <string name="allow_backup_button_label" msgid="4217228747769644068">"Zálohovať moje dáta"</string> <string name="deny_backup_button_label" msgid="6009119115581097708">"Nezálohovať"</string> <string name="restore_confirm_text" msgid="7499866728030461776">"Z pripojeného počítača bolo vyžiadané úplné obnovenie všetkých údajov. Chcete túto akciu povoliť?\n\nAk ste toto obnovenie nevyžiadali vy, túto operáciu nepovoľujte. Táto akcia nahradí všetky údaje v zariadení."</string> <string name="allow_restore_button_label" msgid="3081286752277127827">"Obnoviť údaje"</string> diff --git a/packages/DocumentsUI/res/values-b+sr+Latn/strings.xml b/packages/DocumentsUI/res/values-b+sr+Latn/strings.xml index 75b0d861ec1a..88aeab519cff 100644 --- a/packages/DocumentsUI/res/values-b+sr+Latn/strings.xml +++ b/packages/DocumentsUI/res/values-b+sr+Latn/strings.xml @@ -44,7 +44,7 @@ <string name="button_copy" msgid="8706475544635021302">"Kopiraj"</string> <string name="button_move" msgid="2202666023104202232">"Premesti"</string> <string name="button_dismiss" msgid="3714065566893946085">"Odbaci"</string> - <string name="button_retry" msgid="4392027584153752797">"Pokušaj ponovo"</string> + <string name="button_retry" msgid="4392027584153752797">"Probaj ponovo"</string> <string name="sort_name" msgid="9183560467917256779">"Prema imenu"</string> <string name="sort_date" msgid="586080032956151448">"Prema datumu izmene"</string> <string name="sort_size" msgid="3350681319735474741">"Prema veličini"</string> diff --git a/packages/DocumentsUI/res/values-fa/strings.xml b/packages/DocumentsUI/res/values-fa/strings.xml index f2f59ede2b1a..cc27e8e9a0b5 100644 --- a/packages/DocumentsUI/res/values-fa/strings.xml +++ b/packages/DocumentsUI/res/values-fa/strings.xml @@ -36,8 +36,8 @@ <string name="menu_new_window" msgid="1226032889278727538">"پنجره جدید"</string> <string name="menu_copy_to_clipboard" msgid="489311381979634291">"کپی"</string> <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"جایگذاری"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"نمایش فضای ذخیرهسازی داخلی"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"پنهان کردن فضای ذخیرهسازی داخلی"</string> + <string name="menu_advanced_show" msgid="4693652895715631401">"نمایش حافظه داخلی"</string> + <string name="menu_advanced_hide" msgid="4218809952721972589">"پنهان کردن حافظه داخلی"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"نمایش اندازه فایل"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"پنهان کردن اندازه فایل"</string> <string name="button_select" msgid="527196987259139214">"انتخاب"</string> @@ -112,7 +112,7 @@ <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"بعضی از فایلها تبدیل شدند"</string> <string name="open_external_dialog_request" msgid="5789329484285817629">"به <xliff:g id="APPNAME"><b>^1</b></xliff:g> اجازه داده شود به فهرست راهنمای <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> در <xliff:g id="STORAGE"><i>^3</i></xliff:g> دسترسی داشته باشد؟"</string> <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"به <xliff:g id="APPNAME"><b>^1</b></xliff:g> اجازه دسترسی به دایرکتوری <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> داده شود؟"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"به <xliff:g id="APPNAME"><b>^1</b></xliff:g> اجازه میدهید به دادههایتان دسترسی پیدا کند، از جمله عکسها و ویدیوهایتان در <xliff:g id="STORAGE"><i>^2</i></xliff:g>؟"</string> + <string name="open_external_dialog_root_request" msgid="8899108702926347720">"به <xliff:g id="APPNAME"><b>^1</b></xliff:g> اجازه میدهید به دادههایتان دسترسی پیدا کند، از جمله عکسها و ویدئوهایتان در <xliff:g id="STORAGE"><i>^2</i></xliff:g>؟"</string> <string name="never_ask_again" msgid="4295278542972859268">"دوباره سؤال نشود"</string> <string name="allow" msgid="7225948811296386551">"ارزیابیشده"</string> <string name="deny" msgid="2081879885755434506">"اجازه ندارد"</string> diff --git a/packages/DocumentsUI/res/values-kk-rKZ/strings.xml b/packages/DocumentsUI/res/values-kk-rKZ/strings.xml index 27ac0a663215..075f2560b3f5 100644 --- a/packages/DocumentsUI/res/values-kk-rKZ/strings.xml +++ b/packages/DocumentsUI/res/values-kk-rKZ/strings.xml @@ -23,7 +23,7 @@ <string name="menu_create_dir" msgid="2547620241173881754">"Жаңа қалта"</string> <string name="menu_grid" msgid="6878021334497835259">"Торлы көрініс"</string> <string name="menu_list" msgid="7279285939892417279">"Тізім көрінісі"</string> - <string name="menu_sort" msgid="7677740407158414452">"Белгіге қарай сұрыптау"</string> + <string name="menu_sort" msgid="7677740407158414452">"Сұрыптау"</string> <string name="menu_search" msgid="3816712084502856974">"Іздеу"</string> <string name="menu_settings" msgid="8239065133341597825">"Жад параметрлері"</string> <string name="menu_open" msgid="432922957274920903">"Ашу"</string> @@ -53,7 +53,7 @@ <string name="save_error" msgid="6167009778003223664">"Құжатты сақтау орындалмады"</string> <string name="create_error" msgid="3735649141335444215">"Қалта жасақтау іске аспады"</string> <string name="query_error" msgid="5999895349602476581">"Қазір мазмұнды жүктеу мүмкін емес"</string> - <string name="root_recent" msgid="4470053704320518133">"Жуықта қолданылған"</string> + <string name="root_recent" msgid="4470053704320518133">"Соңғы"</string> <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> бос"</string> <string name="root_type_service" msgid="2178854894416775409">"Жад қызметтері"</string> <string name="root_type_shortcut" msgid="3318760609471618093">"Төте пернелер"</string> diff --git a/packages/DocumentsUI/res/values-kn-rIN/strings.xml b/packages/DocumentsUI/res/values-kn-rIN/strings.xml index 1eb499be5a78..7becf4e7776a 100644 --- a/packages/DocumentsUI/res/values-kn-rIN/strings.xml +++ b/packages/DocumentsUI/res/values-kn-rIN/strings.xml @@ -24,7 +24,7 @@ <string name="menu_grid" msgid="6878021334497835259">"ಗ್ರಿಡ್ ವೀಕ್ಷಣೆ"</string> <string name="menu_list" msgid="7279285939892417279">"ಪಟ್ಟಿ ವೀಕ್ಷಣೆ"</string> <string name="menu_sort" msgid="7677740407158414452">"ಈ ಪ್ರಕಾರ ವಿಂಗಡಿಸು"</string> - <string name="menu_search" msgid="3816712084502856974">"ಹುಡುಕು"</string> + <string name="menu_search" msgid="3816712084502856974">"ಹುಡುಕಿ"</string> <string name="menu_settings" msgid="8239065133341597825">"ಸಂಗ್ರಹಣೆ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> <string name="menu_open" msgid="432922957274920903">"ತೆರೆ"</string> <string name="menu_save" msgid="2394743337684426338">"ಉಳಿಸು"</string> diff --git a/packages/DocumentsUI/res/values-nl/strings.xml b/packages/DocumentsUI/res/values-nl/strings.xml index 07c41f8096ac..7bcd8539ad03 100644 --- a/packages/DocumentsUI/res/values-nl/strings.xml +++ b/packages/DocumentsUI/res/values-nl/strings.xml @@ -125,14 +125,14 @@ <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> item</item> </plurals> <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"<xliff:g id="NAME">%1$s</xliff:g> verwijderen?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Map <xliff:g id="NAME">%1$s</xliff:g> en de bijbehorende inhoud verwijderen?"</string> + <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Map <xliff:g id="NAME">%1$s</xliff:g> en de bijbehorende content verwijderen?"</string> <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> bestanden verwijderen?</item> <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> bestand verwijderen?</item> </plurals> <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> mappen en de bijbehorende inhoud verwijderen?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> map en de bijbehorende inhoud verwijderen?</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> mappen en de bijbehorende content verwijderen?</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> map en de bijbehorende content verwijderen?</item> </plurals> <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> items verwijderen?</item> diff --git a/packages/DocumentsUI/res/values-sr/strings.xml b/packages/DocumentsUI/res/values-sr/strings.xml index 393573985ab4..ee9a9edf6c3d 100644 --- a/packages/DocumentsUI/res/values-sr/strings.xml +++ b/packages/DocumentsUI/res/values-sr/strings.xml @@ -44,7 +44,7 @@ <string name="button_copy" msgid="8706475544635021302">"Копирај"</string> <string name="button_move" msgid="2202666023104202232">"Премести"</string> <string name="button_dismiss" msgid="3714065566893946085">"Одбаци"</string> - <string name="button_retry" msgid="4392027584153752797">"Покушај поново"</string> + <string name="button_retry" msgid="4392027584153752797">"Пробај поново"</string> <string name="sort_name" msgid="9183560467917256779">"Према имену"</string> <string name="sort_date" msgid="586080032956151448">"Према датуму измене"</string> <string name="sort_size" msgid="3350681319735474741">"Према величини"</string> diff --git a/packages/DocumentsUI/res/values-sv/strings.xml b/packages/DocumentsUI/res/values-sv/strings.xml index 53a26b609ce9..5fd3c8c1437b 100644 --- a/packages/DocumentsUI/res/values-sv/strings.xml +++ b/packages/DocumentsUI/res/values-sv/strings.xml @@ -43,7 +43,7 @@ <string name="button_select" msgid="527196987259139214">"Välj"</string> <string name="button_copy" msgid="8706475544635021302">"Kopiera"</string> <string name="button_move" msgid="2202666023104202232">"Flytta"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Ta bort permanent"</string> + <string name="button_dismiss" msgid="3714065566893946085">"Avvisa"</string> <string name="button_retry" msgid="4392027584153752797">"Försök igen"</string> <string name="sort_name" msgid="9183560467917256779">"Efter namn"</string> <string name="sort_date" msgid="586080032956151448">"Efter ändringsdatum"</string> diff --git a/packages/DocumentsUI/res/values-tr/strings.xml b/packages/DocumentsUI/res/values-tr/strings.xml index 24107c602740..4ba5f4bbf6bb 100644 --- a/packages/DocumentsUI/res/values-tr/strings.xml +++ b/packages/DocumentsUI/res/values-tr/strings.xml @@ -96,7 +96,7 @@ <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> dosya silinemedi</item> <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> dosya silinemedi</item> </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Ayrıntıları görmek için hafifçe dokunun"</string> + <string name="notification_touch_for_details" msgid="6268189413228855582">"Ayrıntıları görmek için dokunun"</string> <string name="close" msgid="3043722427445528732">"Kapat"</string> <string name="copy_failure_alert_content" msgid="4563147454522476183">"Şu dosyalar kopyalanamadı: <xliff:g id="LIST">%1$s</xliff:g>"</string> <string name="move_failure_alert_content" msgid="2635075788682922861">"Şu dosyalar taşınamadı: <xliff:g id="LIST">%1$s</xliff:g>"</string> diff --git a/packages/DocumentsUI/res/values-uz-rUZ/strings.xml b/packages/DocumentsUI/res/values-uz-rUZ/strings.xml index 1d0e01bac588..a0ac3296678c 100644 --- a/packages/DocumentsUI/res/values-uz-rUZ/strings.xml +++ b/packages/DocumentsUI/res/values-uz-rUZ/strings.xml @@ -115,7 +115,7 @@ <string name="open_external_dialog_root_request" msgid="8899108702926347720">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> ilovasiga <xliff:g id="STORAGE"><i>^2</i></xliff:g> xotirasidagi ma’lumotlardan, jumladan, rasmlar va videolardan foydalanishiga ruxsat berilsinmi?"</string> <string name="never_ask_again" msgid="4295278542972859268">"Boshqa so‘ralmasin"</string> <string name="allow" msgid="7225948811296386551">"Ruxsat berish"</string> - <string name="deny" msgid="2081879885755434506">"Rad qilish"</string> + <string name="deny" msgid="2081879885755434506">"Rad etish"</string> <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ta belgilandi</item> <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ta belgilandi</item> diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java index 3ef9b8e1b8c4..10e5dcc91678 100644 --- a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java +++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java @@ -161,7 +161,8 @@ public class ExternalStorageProvider extends DocumentsProvider { final VolumeInfo privateVol = mStorageManager.findPrivateForEmulated(volume); title = mStorageManager.getBestVolumeDescription(privateVol); } - } else if (volume.getType() == VolumeInfo.TYPE_PUBLIC) { + } else if (volume.getType() == VolumeInfo.TYPE_PUBLIC + && volume.getMountUserId() == userId) { rootId = volume.getFsUuid(); title = mStorageManager.getBestVolumeDescription(volume); } else { diff --git a/packages/Keyguard/res/values-b+sr+Latn/strings.xml b/packages/Keyguard/res/values-b+sr+Latn/strings.xml index 570f4bc96f86..800612520436 100644 --- a/packages/Keyguard/res/values-b+sr+Latn/strings.xml +++ b/packages/Keyguard/res/values-b+sr+Latn/strings.xml @@ -56,7 +56,7 @@ <string name="kg_wrong_pattern" msgid="1850806070801358830">"Pogrešan šablon"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Pogrešna lozinka"</string> <string name="kg_wrong_pin" msgid="1131306510833563801">"Pogrešan PIN"</string> - <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Pokušajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekunde(i)."</string> + <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Probajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekunde(i)."</string> <string name="kg_pattern_instructions" msgid="398978611683075868">"Nacrtajte šablon"</string> <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Unesite PIN SIM kartice"</string> <string name="kg_sim_pin_instructions_multi" msgid="7818515973197201434">"Unesite PIN za SIM „<xliff:g id="CARRIER">%1$s</xliff:g>“"</string> @@ -72,9 +72,9 @@ <string name="kg_invalid_puk" msgid="3638289409676051243">"Ponovo unesite ispravni PUK kôd. Ponovljeni pokušaji će trajno onemogućiti SIM."</string> <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN kodovi se ne podudaraju"</string> <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Previše pokušaja unosa šablona"</string> - <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Uneli ste netačni PIN <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. \n\nPokušajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunde(i)."</string> - <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Uneli ste netačnu lozinku <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. \n\nPokušajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunde(i)."</string> - <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Nacrtali ste šablon za otključavanje netačno <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. \n\nPokušajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunde(i)."</string> + <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Uneli ste netačni PIN <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. \n\nProbajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunde(i)."</string> + <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Uneli ste netačnu lozinku <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. \n\nProbajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunde(i)."</string> + <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Nacrtali ste šablon za otključavanje netačno <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. \n\nProbajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunde(i)."</string> <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="8774056606869646621">"Pogrešno ste pokušali da otključate tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> put(a). Imate još <xliff:g id="NUMBER_1">%2$d</xliff:g> pokušaj(a), nakon čega se tablet resetuje i svi podaci sa njega brišu."</string> <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="1843331751334128428">"Pogrešno ste pokušali da otključate telefon <xliff:g id="NUMBER_0">%1$d</xliff:g> put(a). Imate još <xliff:g id="NUMBER_1">%2$d</xliff:g> pokušaj(a), nakon čega se telefon resetuje i svi podaci sa njega brišu."</string> <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="258925501999698032">"Pogrešno ste pokušali da otključate tablet <xliff:g id="NUMBER">%d</xliff:g> put(a). Tablet će biti resetovan i svi podaci sa njega će biti izbrisani."</string> @@ -87,8 +87,8 @@ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="6853071165802933545">"Pogrešno ste pokušali da otključate telefon <xliff:g id="NUMBER_0">%1$d</xliff:g> put(a). Imate još <xliff:g id="NUMBER_1">%2$d</xliff:g> pokušaj(a), nakon čega se poslovni profil uklanja i svi podaci sa profila brišu."</string> <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="4686386497449912146">"Pogrešno ste pokušali da otključate tablet <xliff:g id="NUMBER">%d</xliff:g> put(a). Poslovni profil će biti uklonjen i svi podaci sa njega će biti izbrisani."</string> <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Pogrešno ste pokušali da otključate telefon <xliff:g id="NUMBER">%d</xliff:g> put(a). Poslovni profil će biti uklonjen i svi podaci sa njega će biti izbrisani."</string> - <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Nacrtali ste šablon za otključavanje netačno <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Posle još <xliff:g id="NUMBER_1">%2$d</xliff:g> 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 <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunde(i)."</string> - <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Nacrtali ste šablon za otključavanje netačno <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Posle još <xliff:g id="NUMBER_1">%2$d</xliff:g> 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 <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunde(i)."</string> + <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Nacrtali ste šablon za otključavanje netačno <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Posle još <xliff:g id="NUMBER_1">%2$d</xliff:g> 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 <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunde(i)."</string> + <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Nacrtali ste šablon za otključavanje netačno <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Posle još <xliff:g id="NUMBER_1">%2$d</xliff:g> 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 <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunde(i)."</string> <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Netačan SIM PIN kôd. Sada morate da kontaktirate mobilnog operatera da biste otključali uređaj."</string> <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="6721575017538162249"> <item quantity="one">Netačan SIM PIN kôd. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaj.</item> diff --git a/packages/Keyguard/res/values-da/strings.xml b/packages/Keyguard/res/values-da/strings.xml index ebea6eeb1989..b98a2536c2d2 100644 --- a/packages/Keyguard/res/values-da/strings.xml +++ b/packages/Keyguard/res/values-da/strings.xml @@ -128,5 +128,5 @@ <item quantity="one">Enheden blev sidst låst op for <xliff:g id="NUMBER_1">%d</xliff:g> timer siden. Bekræft adgangskoden.</item> <item quantity="other">Enheden blev sidst låst op for <xliff:g id="NUMBER_1">%d</xliff:g> timer siden. Bekræft adgangskoden.</item> </plurals> - <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Kan ikke genkendes"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Ikke genkendt"</string> </resources> diff --git a/packages/Keyguard/res/values-sr/strings.xml b/packages/Keyguard/res/values-sr/strings.xml index 840cae79665a..23c0b50f9c30 100644 --- a/packages/Keyguard/res/values-sr/strings.xml +++ b/packages/Keyguard/res/values-sr/strings.xml @@ -56,7 +56,7 @@ <string name="kg_wrong_pattern" msgid="1850806070801358830">"Погрешан шаблон"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Погрешна лозинка"</string> <string name="kg_wrong_pin" msgid="1131306510833563801">"Погрешан PIN"</string> - <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Покушајте поново за <xliff:g id="NUMBER">%d</xliff:g> секунде(и)."</string> + <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Пробајте поново за <xliff:g id="NUMBER">%d</xliff:g> секунде(и)."</string> <string name="kg_pattern_instructions" msgid="398978611683075868">"Нацртајте шаблон"</string> <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Унесите PIN SIM картице"</string> <string name="kg_sim_pin_instructions_multi" msgid="7818515973197201434">"Унесите PIN за SIM „<xliff:g id="CARRIER">%1$s</xliff:g>“"</string> @@ -72,9 +72,9 @@ <string name="kg_invalid_puk" msgid="3638289409676051243">"Поново унесите исправни PUK кôд. Поновљени покушаји ће трајно онемогућити SIM."</string> <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN кодови се не подударају"</string> <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Превише покушаја уноса шаблона"</string> - <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Унели сте нетачни PIN <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. \n\nПокушајте поново за <xliff:g id="NUMBER_1">%2$d</xliff:g> секунде(и)."</string> - <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Унели сте нетачну лозинку <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. \n\nПокушајте поново за <xliff:g id="NUMBER_1">%2$d</xliff:g> секунде(и)."</string> - <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Нацртали сте шаблон за откључавање нетачно <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. \n\nПокушајте поново за <xliff:g id="NUMBER_1">%2$d</xliff:g> секунде(и)."</string> + <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Унели сте нетачни PIN <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. \n\nПробајте поново за <xliff:g id="NUMBER_1">%2$d</xliff:g> секунде(и)."</string> + <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Унели сте нетачну лозинку <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. \n\nПробајте поново за <xliff:g id="NUMBER_1">%2$d</xliff:g> секунде(и)."</string> + <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Нацртали сте шаблон за откључавање нетачно <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. \n\nПробајте поново за <xliff:g id="NUMBER_1">%2$d</xliff:g> секунде(и)."</string> <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="8774056606869646621">"Погрешно сте покушали да откључате таблет <xliff:g id="NUMBER_0">%1$d</xliff:g> пут(а). Имате још <xliff:g id="NUMBER_1">%2$d</xliff:g> покушај(а), након чега се таблет ресетује и сви подаци са њега бришу."</string> <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="1843331751334128428">"Погрешно сте покушали да откључате телефон <xliff:g id="NUMBER_0">%1$d</xliff:g> пут(а). Имате још <xliff:g id="NUMBER_1">%2$d</xliff:g> покушај(а), након чега се телефон ресетује и сви подаци са њега бришу."</string> <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="258925501999698032">"Погрешно сте покушали да откључате таблет <xliff:g id="NUMBER">%d</xliff:g> пут(а). Таблет ће бити ресетован и сви подаци са њега ће бити избрисани."</string> @@ -87,8 +87,8 @@ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="6853071165802933545">"Погрешно сте покушали да откључате телефон <xliff:g id="NUMBER_0">%1$d</xliff:g> пут(а). Имате још <xliff:g id="NUMBER_1">%2$d</xliff:g> покушај(а), након чега се пословни профил уклања и сви подаци са профила бришу."</string> <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="4686386497449912146">"Погрешно сте покушали да откључате таблет <xliff:g id="NUMBER">%d</xliff:g> пут(а). Пословни профил ће бити уклоњен и сви подаци са њега ће бити избрисани."</string> <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Погрешно сте покушали да откључате телефон <xliff:g id="NUMBER">%d</xliff:g> пут(а). Пословни профил ће бити уклоњен и сви подаци са њега ће бити избрисани."</string> - <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Нацртали сте шаблон за откључавање нетачно <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. После још <xliff:g id="NUMBER_1">%2$d</xliff:g> неуспешна(их) покушаја, од вас ће бити затражено да откључате таблет помоћу налога е-поште.\n\nПокушајте поново за <xliff:g id="NUMBER_2">%3$d</xliff:g> секунде(и)."</string> - <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Нацртали сте шаблон за откључавање нетачно <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. После још <xliff:g id="NUMBER_1">%2$d</xliff:g> неуспешна(их) покушаја, од вас ће бити затражено да откључате телефон помоћу налога е-поште.\n\nПокушајте поново за <xliff:g id="NUMBER_2">%3$d</xliff:g> секунде(и)."</string> + <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Нацртали сте шаблон за откључавање нетачно <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. После још <xliff:g id="NUMBER_1">%2$d</xliff:g> неуспешна(их) покушаја, од вас ће бити затражено да откључате таблет помоћу налога е-поште.\n\nПробајте поново за <xliff:g id="NUMBER_2">%3$d</xliff:g> секунде(и)."</string> + <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Нацртали сте шаблон за откључавање нетачно <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. После још <xliff:g id="NUMBER_1">%2$d</xliff:g> неуспешна(их) покушаја, од вас ће бити затражено да откључате телефон помоћу налога е-поште.\n\nПробајте поново за <xliff:g id="NUMBER_2">%3$d</xliff:g> секунде(и)."</string> <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Нетачан SIM PIN кôд. Сада морате да контактирате мобилног оператера да бисте откључали уређај."</string> <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="6721575017538162249"> <item quantity="one">Нетачан SIM PIN кôд. Имате још <xliff:g id="NUMBER_1">%d</xliff:g> покушај.</item> diff --git a/packages/Keyguard/res/values-sv/strings.xml b/packages/Keyguard/res/values-sv/strings.xml index 527c8e65b384..4a1d67b8d94a 100644 --- a/packages/Keyguard/res/values-sv/strings.xml +++ b/packages/Keyguard/res/values-sv/strings.xml @@ -34,7 +34,7 @@ <string name="keyguard_plugged_in_charging_fast" msgid="6671162730167305479">"Laddas snabbt"</string> <string name="keyguard_plugged_in_charging_slowly" msgid="1964714661071163229">"Laddas långsamt"</string> <string name="keyguard_low_battery" msgid="8143808018719173859">"Anslut din laddare."</string> - <string name="keyguard_instructions_when_pattern_disabled" msgid="1332288268600329841">"Tryck på Meny om du vill låsa upp."</string> + <string name="keyguard_instructions_when_pattern_disabled" msgid="1332288268600329841">"Tryck på Meny för att låsa upp."</string> <string name="keyguard_network_locked_message" msgid="9169717779058037168">"Nätverk låst"</string> <string name="keyguard_missing_sim_message_short" msgid="494980561304211931">"Inget SIM-kort"</string> <string name="keyguard_missing_sim_message" product="tablet" msgid="1445849005909260039">"Inget SIM-kort i surfplattan."</string> diff --git a/packages/Keyguard/res/values-zh-rCN/strings.xml b/packages/Keyguard/res/values-zh-rCN/strings.xml index 0723ab19e7b6..e15950f7779d 100644 --- a/packages/Keyguard/res/values-zh-rCN/strings.xml +++ b/packages/Keyguard/res/values-zh-rCN/strings.xml @@ -36,7 +36,7 @@ <string name="keyguard_low_battery" msgid="8143808018719173859">"请连接充电器。"</string> <string name="keyguard_instructions_when_pattern_disabled" msgid="1332288268600329841">"按“菜单”键解锁。"</string> <string name="keyguard_network_locked_message" msgid="9169717779058037168">"网络已锁定"</string> - <string name="keyguard_missing_sim_message_short" msgid="494980561304211931">"无 SIM 卡"</string> + <string name="keyguard_missing_sim_message_short" msgid="494980561304211931">"没有 SIM 卡"</string> <string name="keyguard_missing_sim_message" product="tablet" msgid="1445849005909260039">"平板电脑中没有SIM卡。"</string> <string name="keyguard_missing_sim_message" product="default" msgid="3481110395508637643">"手机中没有SIM卡。"</string> <string name="keyguard_missing_sim_instructions" msgid="5210891509995942250">"请插入SIM卡。"</string> diff --git a/packages/MtpDocumentsProvider/res/values-gl-rES/strings.xml b/packages/MtpDocumentsProvider/res/values-gl-rES/strings.xml index 54bf4a9771ec..7e61c7cedff9 100644 --- a/packages/MtpDocumentsProvider/res/values-gl-rES/strings.xml +++ b/packages/MtpDocumentsProvider/res/values-gl-rES/strings.xml @@ -19,7 +19,7 @@ <string name="app_label" msgid="6271216747302322594">"Host MTP"</string> <string name="downloads_app_label" msgid="7120690641874849726">"Descargas"</string> <string name="root_name" msgid="5819495383921089536">"<xliff:g id="STORAGE_NAME">%2$s</xliff:g> de <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Accedendo aos ficheiros de <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> + <string name="accessing_notification_title" msgid="3030133609230917944">"Accedendo aos ficheiros do dispositivo <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> <string name="error_busy_device" msgid="3997316850357386589">"O outro dispositivo está ocupado. Non podes transferir ficheiros ata que estea dispoñible."</string> <string name="error_locked_device" msgid="7557872102188356147">"Non se atopou ningún ficheiro. Se o outro dispositivo está bloqueado, desbloquéao e téntao de novo."</string> </resources> diff --git a/packages/PrintSpooler/res/values-ar/strings.xml b/packages/PrintSpooler/res/values-ar/strings.xml index d23e1bc93595..9751ca283b7d 100644 --- a/packages/PrintSpooler/res/values-ar/strings.xml +++ b/packages/PrintSpooler/res/values-ar/strings.xml @@ -30,7 +30,7 @@ <string name="destination_default_text" msgid="5422708056807065710">"اختر طابعة"</string> <string name="template_all_pages" msgid="3322235982020148762">"جميع الصفحات وعددها <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> <string name="template_page_range" msgid="428638530038286328">"النطاق <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> - <string name="pages_range_example" msgid="8558694453556945172">"مثلاً، ۱—۵،۹،۷—۱۰"</string> + <string name="pages_range_example" msgid="8558694453556945172">"مثلاً، ١—٥،٨،١١—١٣"</string> <string name="print_preview" msgid="8010217796057763343">"معاينة قبل الطباعة"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"تثبيت برنامج عرض PDF للمعاينة"</string> <string name="printing_app_crashed" msgid="854477616686566398">"تعطّل تطبيق الطباعة"</string> diff --git a/packages/PrintSpooler/res/values-b+sr+Latn/strings.xml b/packages/PrintSpooler/res/values-b+sr+Latn/strings.xml index c2b84d0165ca..a75874415d85 100644 --- a/packages/PrintSpooler/res/values-b+sr+Latn/strings.xml +++ b/packages/PrintSpooler/res/values-b+sr+Latn/strings.xml @@ -103,8 +103,8 @@ <item msgid="3199660090246166812">"Vodoravno"</item> </string-array> <string name="print_write_error_message" msgid="5787642615179572543">"Upisivanje u datoteku nije moguće"</string> - <string name="print_error_default_message" msgid="8602678405502922346">"Žao nam je, ovo nije uspelo. Pokušajte ponovo."</string> - <string name="print_error_retry" msgid="1426421728784259538">"Pokušajte ponovo"</string> + <string name="print_error_default_message" msgid="8602678405502922346">"Žao nam je, ovo nije uspelo. Probajte ponovo."</string> + <string name="print_error_retry" msgid="1426421728784259538">"Probajte ponovo"</string> <string name="print_error_printer_unavailable" msgid="8985614415253203381">"Ovaj štampač trenutno nije dostupan."</string> <string name="print_cannot_load_page" msgid="6179560924492912009">"Nije uspeo prikaz pregleda"</string> <string name="print_preparing_preview" msgid="3939930735671364712">"Priprema pregleda..."</string> diff --git a/packages/PrintSpooler/res/values-ja/strings.xml b/packages/PrintSpooler/res/values-ja/strings.xml index 6d03880d5399..0519083eb4af 100644 --- a/packages/PrintSpooler/res/values-ja/strings.xml +++ b/packages/PrintSpooler/res/values-ja/strings.xml @@ -29,7 +29,7 @@ <string name="label_pages" msgid="7768589729282182230">"ページ"</string> <string name="destination_default_text" msgid="5422708056807065710">"プリンタを選択"</string> <string name="template_all_pages" msgid="3322235982020148762">"<xliff:g id="PAGE_COUNT">%1$s</xliff:g>ページすべて"</string> - <string name="template_page_range" msgid="428638530038286328">"<xliff:g id="PAGE_COUNT">%1$s</xliff:g>ページ分"</string> + <string name="template_page_range" msgid="428638530038286328">"範囲選択(<xliff:g id="PAGE_COUNT">%1$s</xliff:g>ページ内)"</string> <string name="pages_range_example" msgid="8558694453556945172">"例: 1-5,8,11-13"</string> <string name="print_preview" msgid="8010217796057763343">"印刷プレビュー"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"プレビュー用PDFビューアをインストール"</string> diff --git a/packages/PrintSpooler/res/values-kn-rIN/strings.xml b/packages/PrintSpooler/res/values-kn-rIN/strings.xml index f4b9d6190f4a..487ac0128159 100644 --- a/packages/PrintSpooler/res/values-kn-rIN/strings.xml +++ b/packages/PrintSpooler/res/values-kn-rIN/strings.xml @@ -47,7 +47,7 @@ <string name="savetopdf_button" msgid="2976186791686924743">"PDF ಗೆ ಉಳಿಸು"</string> <string name="print_options_expanded" msgid="6944679157471691859">"ಪ್ರಿಂಟ್ ಆಯ್ಕೆಗಳನ್ನು ವಿಸ್ತರಿಸಲಾಗಿದೆ"</string> <string name="print_options_collapsed" msgid="7455930445670414332">"ಪ್ರಿಂಟ್ ಆಯ್ಕೆಗಳನ್ನು ಮುಚ್ಚಲಾಗಿದೆ"</string> - <string name="search" msgid="5421724265322228497">"ಹುಡುಕು"</string> + <string name="search" msgid="5421724265322228497">"ಹುಡುಕಿ"</string> <string name="all_printers_label" msgid="3178848870161526399">"ಎಲ್ಲಾ ಪ್ರಿಂಟರ್ಗಳು"</string> <string name="add_print_service_label" msgid="5356702546188981940">"ಸೇವೆಯನ್ನು ಸೇರಿಸು"</string> <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"ಹುಡುಕಾಟ ಪೆಟ್ಟಿಗೆಯನ್ನು ತೋರಿಸಲಾಗಿದೆ"</string> @@ -81,10 +81,10 @@ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> ರದ್ದು ಮಾಡಲಾಗುತ್ತಿದೆ"</string> <string name="failed_notification_title_template" msgid="2256217208186530973">"ಮುದ್ರಕ ದೋಷ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> <string name="blocked_notification_title_template" msgid="1175435827331588646">"ಮುದ್ರಕವು <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> ನಿರ್ಬಂಧಿಸಿದೆ"</string> - <string name="cancel" msgid="4373674107267141885">"ರದ್ದುಮಾಡು"</string> + <string name="cancel" msgid="4373674107267141885">"ರದ್ದುಮಾಡಿ"</string> <string name="restart" msgid="2472034227037808749">"ಮರುಪ್ರಾರಂಭಿಸು"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"ಮುದ್ರಕಕ್ಕೆ ಸಂಪರ್ಕವಿಲ್ಲ"</string> - <string name="reason_unknown" msgid="5507940196503246139">"ಅಜ್ಞಾತ"</string> + <string name="reason_unknown" msgid="5507940196503246139">"ಅಪರಿಚಿತ"</string> <string name="print_service_security_warning_title" msgid="2160752291246775320">"<xliff:g id="SERVICE">%1$s</xliff:g> ಬಳಸುವುದೇ?"</string> <string name="print_service_security_warning_summary" msgid="1427434625361692006">"ನಿಮ್ಮ ಡಾಕ್ಯುಮೆಂಟ್ ಪ್ರಿಂಟರ್ಗೆ ಹೋಗುವ ಸಂದರ್ಭದಲ್ಲಿ ಒಂದು ಅಥವಾ ಅದಕ್ಕಿಂತ ಹೆಚ್ಚು ಸರ್ವರ್ಗಳ ಮೂಲಕ ಹಾದು ಹೋಗಬಹುದು."</string> <string-array name="color_mode_labels"> diff --git a/packages/PrintSpooler/res/values-sr/strings.xml b/packages/PrintSpooler/res/values-sr/strings.xml index 3b66b380bb72..c96fd914786d 100644 --- a/packages/PrintSpooler/res/values-sr/strings.xml +++ b/packages/PrintSpooler/res/values-sr/strings.xml @@ -103,8 +103,8 @@ <item msgid="3199660090246166812">"Водоравно"</item> </string-array> <string name="print_write_error_message" msgid="5787642615179572543">"Уписивање у датотеку није могуће"</string> - <string name="print_error_default_message" msgid="8602678405502922346">"Жао нам је, ово није успело. Покушајте поново."</string> - <string name="print_error_retry" msgid="1426421728784259538">"Покушајте поново"</string> + <string name="print_error_default_message" msgid="8602678405502922346">"Жао нам је, ово није успело. Пробајте поново."</string> + <string name="print_error_retry" msgid="1426421728784259538">"Пробајте поново"</string> <string name="print_error_printer_unavailable" msgid="8985614415253203381">"Овај штампач тренутно није доступан."</string> <string name="print_cannot_load_page" msgid="6179560924492912009">"Није успео приказ прегледа"</string> <string name="print_preparing_preview" msgid="3939930735671364712">"Припрема прегледа..."</string> diff --git a/packages/PrintSpooler/res/values-zh-rCN/strings.xml b/packages/PrintSpooler/res/values-zh-rCN/strings.xml index 3debf8e60cdb..d4e796339bc9 100644 --- a/packages/PrintSpooler/res/values-zh-rCN/strings.xml +++ b/packages/PrintSpooler/res/values-zh-rCN/strings.xml @@ -60,7 +60,7 @@ <item quantity="one">找到 <xliff:g id="COUNT_0">%1$s</xliff:g> 台打印机</item> </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> - <string name="printer_info_desc" msgid="7181988788991581654">"关于此打印机的更多信息"</string> + <string name="printer_info_desc" msgid="7181988788991581654">"此打印机的详细信息"</string> <string name="could_not_create_file" msgid="3425025039427448443">"无法创建文件"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"部分打印服务已停用"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"正在搜索打印机"</string> diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml index 060a5fb15be3..345c0bb5adcf 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 @@ <string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Wi-Fi veza je otkazala"</string> <string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Problem sa potvrdom autentičnosti"</string> <string name="wifi_not_in_range" msgid="1136191511238508967">"Nije u opsegu"</string> - <string name="wifi_no_internet" msgid="9151470775868728896">"Pristup internetu nije otkriven, automatsko povezivanje nije moguće."</string> + <string name="wifi_no_internet_no_reconnect" msgid="2211781637653149657">"Pristup internetu nije otkriven, automatsko povezivanje nije moguće."</string> + <string name="wifi_no_internet" msgid="5011955173375805204">"Nema pristupa internetu."</string> <string name="saved_network" msgid="4352716707126620811">"Sačuvao/la je <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="connected_via_wfa" msgid="3805736726317410714">"Povezano preko Wi‑Fi pomoćnika"</string> <string name="connected_via_passpoint" msgid="2826205693803088747">"Veza je uspostavljena preko pristupne tačke %1$s"</string> @@ -233,8 +234,6 @@ <string name="debug_layout_summary" msgid="2001775315258637682">"Prikaži granice klipa, margine itd."</string> <string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Nametni smer rasporeda zdesna nalevo"</string> <string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Nametni smer rasporeda ekrana zdesna nalevo za sve lokalitete"</string> - <string name="show_cpu_usage" msgid="2389212910758076024">"Prik. upotrebu procesora"</string> - <string name="show_cpu_usage_summary" msgid="2113341923988958266">"Postav. element sa trenutnom upotrebom procesora"</string> <string name="force_hw_ui" msgid="6426383462520888732">"Prinudni prikaz pom. GPU"</string> <string name="force_hw_ui_summary" msgid="5535991166074861515">"Prinudno koristi GPU za 2D crtanje"</string> <string name="force_msaa" msgid="7920323238677284387">"Nametni 4x MSAA"</string> @@ -282,7 +281,7 @@ <string name="enable_webview_multiprocess_desc" msgid="2485604010404197724">"Pokrećite WebView prikazivače zasebno"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"Primena WebView-a"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Podesite primenu WebView-a"</string> - <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Ovaj izbor više nije važeći. Pokušajte ponovo."</string> + <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Ovaj izbor više nije važeći. Probajte ponovo."</string> <string name="convert_to_file_encryption" msgid="3060156730651061223">"Konvertuj u šifrovanje datoteka"</string> <string name="convert_to_file_encryption_enabled" msgid="2861258671151428346">"Konvertuj..."</string> <string name="convert_to_file_encryption_done" msgid="7859766358000523953">"Već se koristi šifrovanje datoteka"</string> @@ -341,4 +340,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Najveći"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Prilagođeni (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Pomoć i povratne informacije"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Meni"</string> </resources> diff --git a/packages/SettingsLib/res/values-be-rBY/strings.xml b/packages/SettingsLib/res/values-be-rBY/strings.xml index 03de8bab32c1..52077fb7c481 100644 --- a/packages/SettingsLib/res/values-be-rBY/strings.xml +++ b/packages/SettingsLib/res/values-be-rBY/strings.xml @@ -28,7 +28,8 @@ <string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Збой падлучэння Wi-Fi"</string> <string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Праблема аўтэнтыфікацыі"</string> <string name="wifi_not_in_range" msgid="1136191511238508967">"Не ў зоне дасягальнасці"</string> - <string name="wifi_no_internet" msgid="9151470775868728896">"Доступ да інтэрнэту не выяўлены, аўтаматычнае перападлучэнне не адбудзецца."</string> + <string name="wifi_no_internet_no_reconnect" msgid="2211781637653149657">"Доступ да інтэрнэту не выяўлены, аўтаматычнае перападключэнне не адбудзецца."</string> + <string name="wifi_no_internet" msgid="5011955173375805204">"Няма доступу да інтэрнэту."</string> <string name="saved_network" msgid="4352716707126620811">"Хто захаваў: <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="connected_via_wfa" msgid="3805736726317410714">"Падлучана праз памочніка Wi‑Fi"</string> <string name="connected_via_passpoint" msgid="2826205693803088747">"Падлучана праз %1$s"</string> @@ -233,8 +234,6 @@ <string name="debug_layout_summary" msgid="2001775315258637682">"Паказаць межы кліпу, палі і г. д."</string> <string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Прымусовая раскладка справа налева"</string> <string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Прымусовая раскладка экрана справа налева для ўсіх рэгіянальных налад"</string> - <string name="show_cpu_usage" msgid="2389212910758076024">"Паказаць выкарыстанне ЦП"</string> - <string name="show_cpu_usage_summary" msgid="2113341923988958266">"Наклад на экран з бягучым выкарыстаннем працэсара"</string> <string name="force_hw_ui" msgid="6426383462520888732">"Прымусовае адлюстраванне GPU"</string> <string name="force_hw_ui_summary" msgid="5535991166074861515">"Прымусовае выкарыстанне GPU для 2-мерных чарцяжоў"</string> <string name="force_msaa" msgid="7920323238677284387">"Прымусовае выкананне 4x MSAA"</string> @@ -341,4 +340,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Найвялікшы"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Карыстальніцкі (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Даведка і водгукі"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Меню"</string> </resources> diff --git a/packages/SettingsLib/res/values-bs-rBA/strings.xml b/packages/SettingsLib/res/values-bs-rBA/strings.xml index a11bf3212836..8c7c4e0df94e 100644 --- a/packages/SettingsLib/res/values-bs-rBA/strings.xml +++ b/packages/SettingsLib/res/values-bs-rBA/strings.xml @@ -28,7 +28,8 @@ <string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Greška pri povezivanju na Wi-Fi"</string> <string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Problem pri provjeri vjerodostojnosti."</string> <string name="wifi_not_in_range" msgid="1136191511238508967">"Nije u dometu"</string> - <string name="wifi_no_internet" msgid="9151470775868728896">"Pristup internetu nije pronađen. Neće se ponovo povezivati automatski."</string> + <string name="wifi_no_internet_no_reconnect" msgid="2211781637653149657">"Pristup internetu nije pronađen. Neće se ponovo povezivati automatski."</string> + <string name="wifi_no_internet" msgid="5011955173375805204">"Nema pristupa internetu."</string> <string name="saved_network" msgid="4352716707126620811">"Sačuvao <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="connected_via_wfa" msgid="3805736726317410714">"Povezani preko Wi-Fi pomoćnika"</string> <string name="connected_via_passpoint" msgid="2826205693803088747">"Povezani preko %1$s"</string> @@ -146,9 +147,9 @@ <string name="vpn_settings_not_available" msgid="956841430176985598">"VPN postavke nisu dostupne za ovog korisnika"</string> <string name="tethering_settings_not_available" msgid="6765770438438291012">"Postavke za privezivanje nisu dostupne za ovog korisnika"</string> <string name="apn_settings_not_available" msgid="7873729032165324000">"Postavke za naziv pristupne tačke nisu dostupne za ovog korisnika"</string> - <string name="enable_adb" msgid="7982306934419797485">"USB otklanjanje grešaka"</string> + <string name="enable_adb" msgid="7982306934419797485">"Otklanjanje grešaka putem uređaja spojenog na USB"</string> <string name="enable_adb_summary" msgid="4881186971746056635">"Način rada za uklanjanje grešaka kada je povezan USB"</string> - <string name="clear_adb_keys" msgid="4038889221503122743">"Ukini odobrenja otklanjanja grešaka USB-om"</string> + <string name="clear_adb_keys" msgid="4038889221503122743">"Ukini odobrenja otklanjanja grešaka putem uređaja spojenog na USB"</string> <string name="bugreport_in_power" msgid="7923901846375587241">"Prečica za izvještaj o greškama"</string> <string name="bugreport_in_power_summary" msgid="1778455732762984579">"Prikaži tipku za prijavu grešaka u izborniku za potrošnju energije"</string> <string name="keep_screen_on" msgid="1146389631208760344">"Ostani aktivan"</string> @@ -185,9 +186,9 @@ <string name="allow_mock_location_summary" msgid="317615105156345626">"Dozvoli lažne lokacije"</string> <string name="debug_view_attributes" msgid="6485448367803310384">"Omogući pregled atributa prikaza"</string> <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"Uvijek drži mobilne podatke aktivnim, čak i kada je Wi-Fi je aktivan (za brzo prebacivanje između mreža)."</string> - <string name="adb_warning_title" msgid="6234463310896563253">"Omogućiti USB otklanjanje grešaka?"</string> - <string name="adb_warning_message" msgid="7316799925425402244">"USB otklanjanje grešaka je namijenjeno samo u svrhe razvoja aplikacija. Koristite ga za kopiranje podataka između računara i uređaja, instaliranje aplikacija na uređaj bez obavještenja te čitanje podataka iz zapisnika."</string> - <string name="adb_keys_warning_message" msgid="5659849457135841625">"Opozvati pristup otklanjanju grešaka USB-om za sve računare koje ste prethodno ovlastili?"</string> + <string name="adb_warning_title" msgid="6234463310896563253">"Omogućiti otklanjanje grešaka putem uređaja spojenog na USB?"</string> + <string name="adb_warning_message" msgid="7316799925425402244">"Otklanjanje grešaka putem uređaja spojenog na USB je namijenjeno samo u svrhe razvoja aplikacija. Koristite ga za kopiranje podataka između računara i uređaja, instaliranje aplikacija na uređaj bez obavještenja te čitanje podataka iz zapisnika."</string> + <string name="adb_keys_warning_message" msgid="5659849457135841625">"Opozvati pristup otklanjanju grešaka putem uređaja spojenog na USB za sve računare koje ste prethodno ovlastili?"</string> <string name="dev_settings_warning_title" msgid="7244607768088540165">"Dopustiti postavke za razvoj?"</string> <string name="dev_settings_warning_message" msgid="2298337781139097964">"Ove postavke su namijenjene samo za svrhe razvoja. Mogu izazvati pogrešno ponašanje uređaja i aplikacija na njemu."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verifikuj aplikacije putem USB-a"</string> @@ -233,8 +234,6 @@ <string name="debug_layout_summary" msgid="2001775315258637682">"Prikaži granice isječka, margine itd."</string> <string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Prisilno postavi raspored s desna u lijevo"</string> <string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Prisilno postavi raspored ekrana s desna u lijevo za sve regije"</string> - <string name="show_cpu_usage" msgid="2389212910758076024">"Prikaži korištenje CPU-a"</string> - <string name="show_cpu_usage_summary" msgid="2113341923988958266">"Trenutno korištenje CPU-a prikazuje se u nadsloju preko ekrana"</string> <string name="force_hw_ui" msgid="6426383462520888732">"Prisili GPU iscrtavanje"</string> <string name="force_hw_ui_summary" msgid="5535991166074861515">"Prisilno koristite GPU za 2d crtanje"</string> <string name="force_msaa" msgid="7920323238677284387">"Prinudno primjeni 4x MSAA"</string> @@ -341,4 +340,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Najveće"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Prilagodi (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Pomoć i povratne informacije"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Meni"</string> </resources> diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index 25384434313c..732d515498ed 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -91,7 +91,7 @@ <string name="tether_settings_title_wifi" msgid="3277144155960302049">"Point d\'accès Wi-Fi mobile"</string> <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Via Bluetooth"</string> <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"Partage de connexion"</string> - <string name="tether_settings_title_all" msgid="8356136101061143841">"Partage de connexion et point d\'accès mobile"</string> + <string name="tether_settings_title_all" msgid="8356136101061143841">"Partage de connexion"</string> <string name="managed_user_title" msgid="8109605045406748842">"Toutes les applis profess."</string> <string name="user_guest" msgid="8475274842845401871">"Invité"</string> <string name="unknown" msgid="1592123443519355854">"Inconnu"</string> diff --git a/packages/SettingsLib/res/values-nl/arrays.xml b/packages/SettingsLib/res/values-nl/arrays.xml index 4cdd4fa559a1..d1903103cda3 100644 --- a/packages/SettingsLib/res/values-nl/arrays.xml +++ b/packages/SettingsLib/res/values-nl/arrays.xml @@ -50,12 +50,12 @@ </string-array> <string-array name="hdcp_checking_titles"> <item msgid="441827799230089869">"Nooit controleren"</item> - <item msgid="6042769699089883931">"Alleen controleren op DRM-inhoud"</item> + <item msgid="6042769699089883931">"Alleen controleren op DRM-content"</item> <item msgid="9174900380056846820">"Altijd controleren"</item> </string-array> <string-array name="hdcp_checking_summaries"> <item msgid="505558545611516707">"HDCP-controle nooit gebruiken"</item> - <item msgid="3878793616631049349">"HDCP-controle alleen voor DRM-inhoud gebruiken"</item> + <item msgid="3878793616631049349">"HDCP-controle alleen voor DRM-content gebruiken"</item> <item msgid="45075631231212732">"HDCP-controle altijd gebruiken"</item> </string-array> <string-array name="select_logd_size_titles"> diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index feb78df79078..2c22ee9f32e2 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -132,10 +132,10 @@ <item msgid="8903157781070679765">"Normaal"</item> <item msgid="164347302621392996">"Snel"</item> <item msgid="5794028588101562009">"Sneller"</item> - <item msgid="7163942783888652942">"Zeer snel"</item> - <item msgid="7831712693748700507">"Vlug"</item> - <item msgid="5194774745031751806">"Zeer vlug"</item> - <item msgid="9085102246155045744">"Snelst"</item> + <item msgid="7163942783888652942">"Nog sneller"</item> + <item msgid="7831712693748700507">"Heel erg snel"</item> + <item msgid="5194774745031751806">"Snelst"</item> + <item msgid="9085102246155045744">"Allerallersnelst"</item> </string-array> <string name="choose_profile" msgid="8229363046053568878">"Profiel kiezen"</string> <string name="category_personal" msgid="1299663247844969448">"Persoonlijk"</string> diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml index a536874b750b..c459571616d8 100644 --- a/packages/SettingsProvider/res/values/defaults.xml +++ b/packages/SettingsProvider/res/values/defaults.xml @@ -220,4 +220,7 @@ <!-- Default setting for ability to add users from the lock screen --> <bool name="def_add_users_from_lockscreen">false</bool> + + <!-- Default setting for disable animations when accessibility is turned on. --> + <bool name="def_accessibility_disable_animations">false</bool> </resources> diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java index d55bb4f44aa5..07bcce67c87e 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java @@ -2484,6 +2484,9 @@ class DatabaseHelper extends SQLiteOpenHelper { loadStringSetting(stmt, Settings.Secure.ACCESSIBILITY_SCREEN_READER_URL, R.string.def_accessibility_screen_reader_url); + loadBooleanSetting(stmt, Settings.Secure.ACCESSIBILITY_DISABLE_ANIMATIONS, + R.bool.def_accessibility_disable_animations); + if (SystemProperties.getBoolean("ro.lockscreen.disable.default", false) == true) { loadSetting(stmt, Settings.System.LOCKSCREEN_DISABLED, "1"); } else { diff --git a/packages/Shell/res/values-tr/strings.xml b/packages/Shell/res/values-tr/strings.xml index d444d786e594..69d526a04a1f 100644 --- a/packages/Shell/res/values-tr/strings.xml +++ b/packages/Shell/res/values-tr/strings.xml @@ -22,7 +22,7 @@ <string name="bugreport_updating_title" msgid="4423539949559634214">"Hata raporuna ayrıntılar ekleniyor"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Lütfen bekleyin…"</string> <string name="bugreport_finished_text" product="watch" msgid="1223616207145252689">"Hata raporu kısa süre içinde telefonda görüntülenecektir"</string> - <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Hata raporunuzu paylaşmak için hafifçe dokunun"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Hata raporunuzu paylaşmak için dokunun"</string> <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Hata raporunu ekran görüntüsüz paylaşmak için dokunun veya bitirmek için ekran görüntüsünü bekleyin"</string> <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Hata raporunu ekran görüntüsüz paylaşmak için dokunun veya bitirmek için ekran görüntüsünü bekleyin"</string> <string name="bugreport_confirm" msgid="5917407234515812495">"Hata raporları, sistemin çeşitli günlük dosyalarından veriler içerir. Bu günlükler, hassas olarak kabul ettiğiniz verileri (uygulama kullanımı ve konum verileri gibi) içerebilir. Hata raporlarını yalnızca güvendiğiniz kişiler ve uygulamalarla paylaşın."</string> diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index a74fbf81a021..ba845bde4347 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -267,6 +267,22 @@ </intent-filter> </activity> + <activity android:name=".recents.grid.RecentsGridActivity" + android:label="@string/accessibility_desc_recent_apps" + android:exported="false" + android:launchMode="singleInstance" + android:excludeFromRecents="true" + android:stateNotNeeded="true" + android:resumeWhilePausing="true" + android:screenOrientation="behind" + android:resizeableActivity="true" + android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout" + android:theme="@style/RecentsTheme.Wallpaper"> + <intent-filter> + <action android:name="com.android.systemui.recents.TOGGLE_RECENTS" /> + </intent-filter> + </activity> + <activity android:name=".recents.tv.RecentsTvActivity" android:label="@string/accessibility_desc_recent_apps" android:exported="false" diff --git a/packages/SystemUI/res/layout-sw600dp/recents_grid.xml b/packages/SystemUI/res/layout-sw600dp/recents_grid.xml new file mode 100644 index 000000000000..07ec23714c3b --- /dev/null +++ b/packages/SystemUI/res/layout-sw600dp/recents_grid.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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. +--> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + android:id="@+id/recents_container"> + <include layout="@layout/recents_stack_action_button" /> + <FrameLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:id="@+id/recents_view" + android:layout_marginLeft="12dp" + android:layout_marginTop="10dp" + android:layout_marginRight="12dp" + android:layout_marginBottom="5dp" + android:gravity="center"> + </FrameLayout> +</LinearLayout> + diff --git a/packages/SystemUI/res/values-bn-rBD/strings.xml b/packages/SystemUI/res/values-bn-rBD/strings.xml index 2cd7b0450107..f3a007e9f768 100644 --- a/packages/SystemUI/res/values-bn-rBD/strings.xml +++ b/packages/SystemUI/res/values-bn-rBD/strings.xml @@ -531,7 +531,7 @@ <string name="keyboard_key_home" msgid="2243500072071305073">"হোম"</string> <string name="keyboard_key_back" msgid="2337450286042721351">"ফিরুন"</string> <string name="keyboard_key_dpad_up" msgid="5584144111755734686">"উপরে"</string> - <string name="keyboard_key_dpad_down" msgid="7331518671788337815">"নীচে"</string> + <string name="keyboard_key_dpad_down" msgid="7331518671788337815">"নিচে"</string> <string name="keyboard_key_dpad_left" msgid="1346446024676962251">"বাম"</string> <string name="keyboard_key_dpad_right" msgid="3317323247127515341">"ডান"</string> <string name="keyboard_key_dpad_center" msgid="2566737770049304658">"কেন্দ্র"</string> diff --git a/packages/SystemUI/res/values-bs-rBA-land/strings.xml b/packages/SystemUI/res/values-bs-rBA-land/strings.xml index bdc652af8f1a..56a4ad276d08 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 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="toast_rotation_locked" msgid="7609673011431556092">"Ekran je sada zaključan u pejzažnom prikazu."</string> + <string name="toast_rotation_locked" msgid="7609673011431556092">"Ekran je sada zaključan u vodoravnom prikazu."</string> </resources> diff --git a/packages/SystemUI/res/values-fa-land/strings.xml b/packages/SystemUI/res/values-fa-land/strings.xml index adc2b118894f..fe67cf0a7d41 100644 --- a/packages/SystemUI/res/values-fa-land/strings.xml +++ b/packages/SystemUI/res/values-fa-land/strings.xml @@ -19,5 +19,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="toast_rotation_locked" msgid="7609673011431556092">"صفحه اکنون در جهت افقی قفل است."</string> + <string name="toast_rotation_locked" msgid="7609673011431556092">"صفحه اکنون در حالت افقی قفل است."</string> </resources> diff --git a/packages/SystemUI/res/values-fa/strings_tv.xml b/packages/SystemUI/res/values-fa/strings_tv.xml index 2894abba3b92..b97a64650dfc 100644 --- a/packages/SystemUI/res/values-fa/strings_tv.xml +++ b/packages/SystemUI/res/values-fa/strings_tv.xml @@ -25,7 +25,7 @@ <string name="pip_pause" msgid="8412075640017218862">"مکث"</string> <string name="pip_hold_home" msgid="340086535668778109">"کنترل PIP با نگهداشتن "<b>"HOME"</b></string> <string name="pip_onboarding_title" msgid="7850436557670253991">"تصویر در تصویر"</string> - <string name="pip_onboarding_description" msgid="4028124563309465267">"تا زمانی که ویدیوی دیگری را پخش کنید، این صفحه حالت ویدیو در ویدیوی شما را حفظ میکند. برای کنترل آن، دکمه "<b>"صفحه اصلی"</b>" را فشار دهید و نگه دارید."</string> + <string name="pip_onboarding_description" msgid="4028124563309465267">"تا زمانی که ویدئوی دیگری را پخش کنید، این صفحه حالت ویدئو در ویدئوی شما را حفظ میکند. برای کنترل آن، دکمه "<b>"صفحه اصلی"</b>" را فشار دهید و نگه دارید."</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"متوجه شدم"</string> <string name="recents_tv_dismiss" msgid="3555093879593377731">"رد کردن"</string> <string-array name="recents_tv_blacklist_array"> diff --git a/packages/SystemUI/res/values-it/strings_car.xml b/packages/SystemUI/res/values-it/strings_car.xml index ae26c9e102bd..19c4e2b02ad0 100644 --- a/packages/SystemUI/res/values-it/strings_car.xml +++ b/packages/SystemUI/res/values-it/strings_car.xml @@ -20,5 +20,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="car_lockscreen_disclaimer_title" msgid="7997539137376896441">"Guida in modo sicuro"</string> - <string name="car_lockscreen_disclaimer_text" msgid="3061224684092952864">"È 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."</string> + <string name="car_lockscreen_disclaimer_text" msgid="3061224684092952864">"È 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."</string> </resources> diff --git a/packages/SystemUI/res/values-kn-rIN/strings_tv.xml b/packages/SystemUI/res/values-kn-rIN/strings_tv.xml index 5afb322d3ea6..edaa8e60a444 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 @@ <string name="pip_pause" msgid="8412075640017218862">"ವಿರಾಮ"</string> <string name="pip_hold_home" msgid="340086535668778109">"PIP ನಿಯಂತ್ರಿಸಲು "<b>"HOME"</b>" ಕೀಯನ್ನು ಹಿಡಿದುಕೊಳ್ಳಿ"</string> <string name="pip_onboarding_title" msgid="7850436557670253991">"ಚಿತ್ರದಲ್ಲಿ ಚಿತ್ರ"</string> - <string name="pip_onboarding_description" msgid="4028124563309465267">"ನೀವು ಮತ್ತೊಂದನ್ನು ಪ್ಲೇ ಮಾಡುವ ತನಕ ಇದು ನಿಮ್ಮ ವೀಡಿಯೋವನ್ನು ವೀಕ್ಷಣೆಯಲ್ಲಿರಿಸುತ್ತದೆ. ಅದನ್ನು ನಿಯಂತ್ರಿಸಲು "<b>"ಹೋಮ್"</b>" ಅನ್ನು ಒತ್ತಿ ಹಿಡಿಯಿರಿ."</string> + <string name="pip_onboarding_description" msgid="4028124563309465267">"ನೀವು ಮತ್ತೊಂದನ್ನು ಪ್ಲೇ ಮಾಡುವ ತನಕ ಇದು ನಿಮ್ಮ ವೀಡಿಯೋವನ್ನು ವೀಕ್ಷಣೆಯಲ್ಲಿರಿಸುತ್ತದೆ. ಅದನ್ನು ನಿಯಂತ್ರಿಸಲು "<b>"ಮುಖಪುಟ"</b>" ಅನ್ನು ಒತ್ತಿ ಹಿಡಿಯಿರಿ."</string> <string name="pip_onboarding_button" msgid="3957426748484904611">"ಅರ್ಥವಾಯಿತು"</string> <string name="recents_tv_dismiss" msgid="3555093879593377731">"ವಜಾಗೊಳಿಸಿ"</string> <string-array name="recents_tv_blacklist_array"> diff --git a/packages/SystemUI/src/com/android/systemui/recents/Recents.java b/packages/SystemUI/src/com/android/systemui/recents/Recents.java index 5b25f0525d92..eb9beb64d2be 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/Recents.java +++ b/packages/SystemUI/src/com/android/systemui/recents/Recents.java @@ -57,10 +57,13 @@ import com.android.systemui.recents.events.component.ShowUserToastEvent; import com.android.systemui.recents.events.ui.RecentsDrawnEvent; import com.android.systemui.recents.misc.SystemServicesProxy; import com.android.systemui.recents.model.RecentsTaskLoader; +import com.android.systemui.recents.grid.RecentsGridImpl; import com.android.systemui.recents.tv.RecentsTvImpl; import com.android.systemui.stackdivider.Divider; import java.util.ArrayList; +import java.util.HashSet; +import java.util.Set; /** @@ -77,6 +80,13 @@ public class Recents extends SystemUI public final static int BIND_TO_SYSTEM_USER_RETRY_DELAY = 5000; public final static int RECENTS_GROW_TARGET_INVALID = -1; + public final static Set<String> RECENTS_ACTIVITIES = new HashSet<>(); + static { + RECENTS_ACTIVITIES.add(RecentsImpl.RECENTS_ACTIVITY); + RECENTS_ACTIVITIES.add(RecentsTvImpl.RECENTS_TV_ACTIVITY); + RECENTS_ACTIVITIES.add(RecentsGridImpl.RECENTS_MOSAIC_ACTIVITY); + } + // Purely for experimentation private final static String RECENTS_OVERRIDE_SYSPROP_KEY = "persist.recents_override_pkg"; private final static String ACTION_SHOW_RECENTS = "com.android.systemui.recents.ACTION_SHOW"; @@ -197,6 +207,8 @@ public class Recents extends SystemUI getSystemService(Context.UI_MODE_SERVICE); if (uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION) { mImpl = new RecentsTvImpl(mContext); + } else if (SystemProperties.getBoolean("ro.recents.grid", false) == true) { + mImpl = new RecentsGridImpl(mContext); } else { mImpl = new RecentsImpl(mContext); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/grid/RecentsGridActivity.java b/packages/SystemUI/src/com/android/systemui/recents/grid/RecentsGridActivity.java new file mode 100644 index 000000000000..cf455708500f --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/recents/grid/RecentsGridActivity.java @@ -0,0 +1,317 @@ +/* + * 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.systemui.recents.grid; + +import android.app.Activity; +import android.content.Intent; +import android.content.res.Configuration; +import android.graphics.Rect; +import android.os.Bundle; +import android.util.Log; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.widget.FrameLayout; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.MetricsProto.MetricsEvent; +import com.android.systemui.R; +import com.android.systemui.recents.Recents; +import com.android.systemui.recents.RecentsActivity; +import com.android.systemui.recents.RecentsActivityLaunchState; +import com.android.systemui.recents.RecentsConfiguration; +import com.android.systemui.recents.RecentsImpl; +import com.android.systemui.recents.events.EventBus; +import com.android.systemui.recents.events.activity.ConfigurationChangedEvent; +import com.android.systemui.recents.events.activity.HideRecentsEvent; +import com.android.systemui.recents.events.activity.LaunchNextTaskRequestEvent; +import com.android.systemui.recents.events.activity.LaunchTaskEvent; +import com.android.systemui.recents.events.activity.ToggleRecentsEvent; +import com.android.systemui.recents.events.component.RecentsVisibilityChangedEvent; +import com.android.systemui.recents.events.ui.AllTaskViewsDismissedEvent; +import com.android.systemui.recents.events.ui.DeleteTaskDataEvent; +import com.android.systemui.recents.events.ui.DismissAllTaskViewsEvent; +import com.android.systemui.recents.events.ui.DismissTaskViewEvent; +import com.android.systemui.recents.events.ui.TaskViewDismissedEvent; +import com.android.systemui.recents.misc.SystemServicesProxy; +import com.android.systemui.recents.misc.Utilities; +import com.android.systemui.recents.model.RecentsTaskLoadPlan; +import com.android.systemui.recents.model.RecentsTaskLoader; +import com.android.systemui.recents.model.Task; +import com.android.systemui.recents.model.TaskStack; +import com.android.systemui.recents.views.TaskView; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * The main grid recents activity started by the RecentsImpl. + */ +public class RecentsGridActivity extends Activity implements ViewTreeObserver.OnPreDrawListener { + private final static String TAG = "RecentsGridActivity"; + + private TaskStack mTaskStack; + private List<Task> mTasks = new ArrayList<>(); + private List<View> mTaskViews = new ArrayList<>(); + private FrameLayout mRecentsView; + private TextView mEmptyView; + private View mClearAllButton; + private int mDisplayOrientation = Configuration.ORIENTATION_UNDEFINED; + private Rect mDisplayRect = new Rect(); + private LayoutInflater mInflater; + private boolean mTouchExplorationEnabled; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.recents_grid); + SystemServicesProxy ssp = Recents.getSystemServices(); + + mInflater = LayoutInflater.from(this); + mDisplayOrientation = Utilities.getAppConfiguration(this).orientation; + mDisplayRect = ssp.getDisplayRect(); + mTouchExplorationEnabled = ssp.isTouchExplorationEnabled(); + + mRecentsView = (FrameLayout) findViewById(R.id.recents_view); + LinearLayout recentsContainer = (LinearLayout) findViewById(R.id.recents_container); + mEmptyView = (TextView) mInflater.inflate(R.layout.recents_empty, recentsContainer, false); + mClearAllButton = findViewById(R.id.button); + + FrameLayout.LayoutParams emptyViewLayoutParams = new FrameLayout.LayoutParams( + FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT); + emptyViewLayoutParams.gravity = Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL; + mEmptyView.setLayoutParams(emptyViewLayoutParams); + mRecentsView.addView(mEmptyView); + + mClearAllButton.setVisibility(View.VISIBLE); + LinearLayout.LayoutParams lp = + (LinearLayout.LayoutParams) mClearAllButton.getLayoutParams(); + lp.gravity = Gravity.END; + + mClearAllButton.setOnClickListener(v -> { + EventBus.getDefault().send(new DismissAllTaskViewsEvent()); + }); + + mRecentsView.setOnClickListener(v -> { + EventBus.getDefault().send(new HideRecentsEvent( + false /* triggeredFromAltTab */, false /* triggeredFromHomeKey */)); + }); + + EventBus.getDefault().register(this, RecentsActivity.EVENT_BUS_PRIORITY); + } + + private TaskView createView() { + return (TaskView) mInflater.inflate(R.layout.recents_task_view, mRecentsView, false); + } + + private void clearTaskViews() { + for (View taskView : mTaskViews) { + ViewGroup parent = (ViewGroup) taskView.getParent(); + if (parent != null) { + parent.removeView(taskView); + } + } + mTaskViews.clear(); + } + + private void updateControlVisibility() { + boolean empty = (mTasks.size() == 0); + mClearAllButton.setVisibility(empty ? View.INVISIBLE : View.VISIBLE); + mEmptyView.setVisibility(empty ? View.VISIBLE : View.INVISIBLE); + if (empty) { + mEmptyView.bringToFront(); + } + } + + private void updateRecentsTasks() { + RecentsTaskLoader loader = Recents.getTaskLoader(); + RecentsTaskLoadPlan plan = RecentsImpl.consumeInstanceLoadPlan(); + if (plan == null) { + plan = loader.createLoadPlan(this); + } + RecentsConfiguration config = Recents.getConfiguration(); + RecentsActivityLaunchState launchState = config.getLaunchState(); + if (!plan.hasTasks()) { + loader.preloadTasks(plan, -1, !launchState.launchedFromHome); + } + int numVisibleTasks = 9; + mTaskStack = plan.getTaskStack(); + RecentsTaskLoadPlan.Options loadOpts = new RecentsTaskLoadPlan.Options(); + loadOpts.runningTaskId = launchState.launchedToTaskId; + loadOpts.numVisibleTasks = numVisibleTasks; + loadOpts.numVisibleTaskThumbnails = numVisibleTasks; + loader.loadTasks(this, plan, loadOpts); + + List<Task> stackTasks = mTaskStack.getStackTasks(); + Collections.reverse(stackTasks); + mTasks = stackTasks; + + updateControlVisibility(); + + clearTaskViews(); + for (int i = 0; i < mTasks.size(); i++) { + Task task = mTasks.get(i); + TaskView taskView = createView(); + taskView.onTaskBound(task, mTouchExplorationEnabled, mDisplayOrientation, mDisplayRect); + Recents.getTaskLoader().loadTaskData(task); + taskView.setTouchEnabled(true); + // Show dismiss button right away. + taskView.startNoUserInteractionAnimation(); + mTaskViews.add(taskView); + } + } + + @Override + protected void onStart() { + super.onStart(); + EventBus.getDefault().send(new RecentsVisibilityChangedEvent(this, true)); + mRecentsView.getViewTreeObserver().addOnPreDrawListener(this); + } + + @Override + public void onResume() { + super.onResume(); + updateRecentsTasks(); + } + + @Override + protected void onStop() { + super.onStop(); + EventBus.getDefault().send(new RecentsVisibilityChangedEvent(this, false)); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + EventBus.getDefault().unregister(this); + } + + @Override + public void onBackPressed() { + // Back behaves like the recents button so just trigger a toggle event. + EventBus.getDefault().send(new ToggleRecentsEvent()); + } + + @Override + public boolean onPreDraw() { + mRecentsView.getViewTreeObserver().removeOnPreDrawListener(this); + int width = mRecentsView.getWidth(); + int height = mRecentsView.getHeight(); + + List<Rect> rects = TaskGridLayoutAlgorithm.getRectsForTaskCount( + mTasks.size(), width, height, false /* allowLineOfThree */, 30 /* padding */); + for (int i = 0; i < rects.size(); i++) { + Rect rect = rects.get(i); + View taskView = mTaskViews.get(i); + taskView.setLayoutParams(new FrameLayout.LayoutParams(rect.width(), rect.height())); + taskView.setTranslationX(rect.left); + taskView.setTranslationY(rect.top); + mRecentsView.addView(taskView); + } + return true; + } + + void dismissRecentsToHome() { + Intent startMain = new Intent(Intent.ACTION_MAIN); + startMain.addCategory(Intent.CATEGORY_HOME); + startActivity(startMain); + } + + /**** EventBus events ****/ + + public final void onBusEvent(HideRecentsEvent event) { + if (event.triggeredFromAltTab) { + // Do nothing for now. + } else if (event.triggeredFromHomeKey) { + dismissRecentsToHome(); + } + } + + public final void onBusEvent(ToggleRecentsEvent event) { + // Always go back home for simplicity for now. If recents is entered from another app, this + // code will eventually need to go back to the original app. + dismissRecentsToHome(); + } + + public final void onBusEvent(DismissTaskViewEvent event) { + int taskIndex = mTaskViews.indexOf(event.taskView); + if (taskIndex != -1) { + mTasks.remove(taskIndex); + ((ViewGroup) event.taskView.getParent()).removeView(event.taskView); + mTaskViews.remove(taskIndex); + EventBus.getDefault().send( + new TaskViewDismissedEvent(event.taskView.getTask(), event.taskView, null)); + } + } + + public final void onBusEvent(TaskViewDismissedEvent event) { + mRecentsView.announceForAccessibility(this.getString( + R.string.accessibility_recents_item_dismissed, event.task.title)); + updateControlVisibility(); + + EventBus.getDefault().send(new DeleteTaskDataEvent(event.task)); + + MetricsLogger.action(this, MetricsEvent.OVERVIEW_DISMISS, + event.task.key.getComponent().toString()); + } + + public final void onBusEvent(DeleteTaskDataEvent event) { + // Remove any stored data from the loader. + RecentsTaskLoader loader = Recents.getTaskLoader(); + loader.deleteTaskData(event.task, false); + + // Remove the task from activity manager. + SystemServicesProxy ssp = Recents.getSystemServices(); + ssp.removeTask(event.task.key.id); + } + + public final void onBusEvent(final DismissAllTaskViewsEvent event) { + // Keep track of the tasks which will have their data removed. + ArrayList<Task> tasks = new ArrayList<>(mTaskStack.getStackTasks()); + mRecentsView.announceForAccessibility(this.getString( + R.string.accessibility_recents_all_items_dismissed)); + mTaskStack.removeAllTasks(); + for (int i = tasks.size() - 1; i >= 0; i--) { + EventBus.getDefault().send(new DeleteTaskDataEvent(tasks.get(i))); + } + mTasks = new ArrayList<>(); + updateRecentsTasks(); + + MetricsLogger.action(this, MetricsEvent.OVERVIEW_DISMISS_ALL); + } + + public final void onBusEvent(AllTaskViewsDismissedEvent event) { + SystemServicesProxy ssp = Recents.getSystemServices(); + if (!ssp.hasDockedTask()) { + dismissRecentsToHome(); + } + } + + public final void onBusEvent(LaunchNextTaskRequestEvent event) { + // Always go back home for simplicity for now. Quick switch will be supported soon. + EventBus.getDefault().send(new HideRecentsEvent(false, true)); + } + + public final void onBusEvent(LaunchTaskEvent event) { + startActivity(event.task.key.baseIntent); + } +} + diff --git a/packages/SystemUI/src/com/android/systemui/recents/grid/RecentsGridImpl.java b/packages/SystemUI/src/com/android/systemui/recents/grid/RecentsGridImpl.java new file mode 100644 index 000000000000..ba7a4a736352 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/recents/grid/RecentsGridImpl.java @@ -0,0 +1,48 @@ +/* + * 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.systemui.recents.grid; + +import android.app.ActivityManager; +import android.content.Context; +import android.content.Intent; +import android.os.UserHandle; + +import com.android.systemui.recents.RecentsImpl; +import com.android.systemui.recents.events.EventBus; +import com.android.systemui.recents.events.activity.RecentsActivityStartingEvent; + +public class RecentsGridImpl extends RecentsImpl { + public static final String RECENTS_MOSAIC_ACTIVITY = + "com.android.systemui.recents.grid.RecentsGridActivity"; + + public RecentsGridImpl(Context context) { + super(context); + } + + @Override + protected void startRecentsActivity(ActivityManager.RunningTaskInfo runningTask, + boolean isHomeStackVisible, boolean animate, int growTarget) { + Intent intent = new Intent(); + intent.setClassName(RECENTS_PACKAGE, RECENTS_MOSAIC_ACTIVITY); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK + | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS + | Intent.FLAG_ACTIVITY_TASK_ON_HOME); + + mContext.startActivityAsUser(intent, UserHandle.CURRENT); + EventBus.getDefault().send(new RecentsActivityStartingEvent()); + } +} + diff --git a/packages/SystemUI/src/com/android/systemui/recents/grid/TaskGridLayoutAlgorithm.java b/packages/SystemUI/src/com/android/systemui/recents/grid/TaskGridLayoutAlgorithm.java new file mode 100644 index 000000000000..6e2c6c03f188 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/recents/grid/TaskGridLayoutAlgorithm.java @@ -0,0 +1,110 @@ +/* + * 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.systemui.recents.grid; + +import android.graphics.Rect; +import android.util.Log; + +import java.util.ArrayList; +import java.util.List; + +class TaskGridLayoutAlgorithm { + + private static final String TAG = "TaskGridLayoutAlgorithm"; + + static List<Rect> getRectsForTaskCount(int count, int containerWidth, int containerHeight, + boolean allowLineOfThree, int padding) { + return getRectsForTaskCount(count, containerWidth, containerHeight, allowLineOfThree, + padding, null); + } + + static List<Rect> getRectsForTaskCount(int count, int containerWidth, int containerHeight, + boolean allowLineOfThree, int padding, Rect preCalculatedTile) { + int singleLineMaxCount = allowLineOfThree ? 3 : 2; + List<Rect> rects = new ArrayList<>(count); + boolean landscape = (containerWidth > containerHeight); + + // We support at most 9 tasks in this layout. + count = Math.min(count, 9); + + if (count == 0) { + return rects; + } + if (count <= singleLineMaxCount) { + if (landscape) { + // Single line. + int taskWidth = 0; + int emptySpace = 0; + if (preCalculatedTile != null) { + taskWidth = preCalculatedTile.width(); + emptySpace = containerWidth - (count * taskWidth) - (count - 1) * padding; + } else { + // Divide available space in equal parts. + taskWidth = (containerWidth - (count - 1) * padding) / count; + } + for (int i = 0; i < count; i++) { + int left = emptySpace / 2 + i * taskWidth + i * padding; + rects.add(new Rect(left, 0, left + taskWidth, containerHeight)); + } + } else { + // Single column. Divide available space in equal parts. + int taskHeight = (containerHeight - (count - 1) * padding) / count; + for (int i = 0; i < count; i++) { + int top = i * taskHeight + i * padding; + rects.add(new Rect(0, top, containerWidth, top + taskHeight)); + } + } + } else if (count < 7) { + // Two lines. + int lineHeight = (containerHeight - padding) / 2; + int lineTaskCount = (int) Math.ceil((double) count / 2); + List<Rect> rectsA = getRectsForTaskCount( + lineTaskCount, containerWidth, lineHeight, true /* allowLineOfThree */, padding, + null); + List<Rect> rectsB = getRectsForTaskCount( + count - lineTaskCount, containerWidth, lineHeight, true /* allowLineOfThree */, + padding, rectsA.get(0)); + for (Rect rect : rectsB) { + rect.offset(0, lineHeight + padding); + } + rects.addAll(rectsA); + rects.addAll(rectsB); + } else { + // Three lines. + int lineHeight = (containerHeight - 2 * padding) / 3; + int lineTaskCount = (int) Math.ceil((double) count / 3); + List<Rect> rectsA = getRectsForTaskCount( + lineTaskCount, containerWidth, lineHeight, true /* allowLineOfThree */, padding, null); + List<Rect> rectsB = getRectsForTaskCount( + lineTaskCount, containerWidth, lineHeight, true /* allowLineOfThree */, padding, + rectsA.get(0)); + List<Rect> rectsC = getRectsForTaskCount( + count - (2 * lineTaskCount), containerWidth, lineHeight, + true /* allowLineOfThree */, padding, rectsA.get(0)); + for (Rect rect : rectsB) { + rect.offset(0, lineHeight + padding); + } + for (Rect rect : rectsC) { + rect.offset(0, 2 * (lineHeight + padding)); + } + rects.addAll(rectsA); + rects.addAll(rectsB); + rects.addAll(rectsC); + } + return rects; + } +} + diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java index 930ed795af9f..4b4db8236d1e 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java +++ b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java @@ -78,6 +78,7 @@ import android.view.accessibility.AccessibilityManager; import com.android.internal.app.AssistUtils; import com.android.internal.os.BackgroundThread; import com.android.systemui.R; +import com.android.systemui.recents.Recents; import com.android.systemui.recents.RecentsDebugFlags; import com.android.systemui.recents.RecentsImpl; import com.android.systemui.recents.model.Task; @@ -413,8 +414,7 @@ public class SystemServicesProxy { } return (homeStackVisibleNotOccluded && topActivity != null && topActivity.getPackageName().equals(RecentsImpl.RECENTS_PACKAGE) - && (topActivity.getClassName().equals(RecentsImpl.RECENTS_ACTIVITY) - || topActivity.getClassName().equals(RecentsTvImpl.RECENTS_TV_ACTIVITY))); + && Recents.RECENTS_ACTIVITIES.contains(topActivity.getClassName())); } catch (RemoteException e) { e.printStackTrace(); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java index 4ecdd7788001..115e65ad8c39 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java @@ -360,12 +360,12 @@ public class TaskView extends FixedSizeFrameLayout implements Task.TaskCallbacks } /** Enables/disables handling touch on this task view. */ - void setTouchEnabled(boolean enabled) { + public void setTouchEnabled(boolean enabled) { setOnClickListener(enabled ? this : null); } /** Animates this task view if the user does not interact with the stack after a certain time. */ - void startNoUserInteractionAnimation() { + public void startNoUserInteractionAnimation() { mHeaderView.startNoUserInteractionAnimation(); } diff --git a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java index 15c163f6e281..00cd04f9ddfd 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java +++ b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java @@ -544,8 +544,9 @@ public class ZenModePanel extends LinearLayout { setToMidnight(nextAlarm); if (weekRange.compareTo(nextAlarm) >= 0) { - return ZenModeConfig.toNextAlarmCondition(mContext, now, - nextAlarmMs, ActivityManager.getCurrentUser()); + return ZenModeConfig.toTimeCondition(mContext, nextAlarmMs, + Math.round((nextAlarmMs - now) / (float) MINUTES_MS), + ActivityManager.getCurrentUser(), true); } } return null; diff --git a/packages/SystemUI/tests/src/com/android/systemui/recents/grid/TaskGridLayoutAlgorithmTest.java b/packages/SystemUI/tests/src/com/android/systemui/recents/grid/TaskGridLayoutAlgorithmTest.java new file mode 100644 index 000000000000..e5a74ae8eccd --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/recents/grid/TaskGridLayoutAlgorithmTest.java @@ -0,0 +1,112 @@ +/* + * 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.systemui.recents.grid; + +import android.graphics.Rect; +import android.test.suitebuilder.annotation.SmallTest; +import com.android.systemui.SysuiTestCase; + +import java.util.List; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertTrue; + +@SmallTest +public class TaskGridLayoutAlgorithmTest extends SysuiTestCase { + + public void testOneTile() { + List<Rect> rects = TaskGridLayoutAlgorithm.getRectsForTaskCount( + 1, 1000, 500, false /* allowLineOfThree */, 0 /* padding */); + assertEquals(1, rects.size()); + Rect singleRect = rects.get(0); + assertEquals(1000, singleRect.width()); + } + + public void testTwoTilesLandscape() { + List<Rect> rects = TaskGridLayoutAlgorithm.getRectsForTaskCount( + 2, 1200, 500, false /* allowLineOfThree */, 0 /* padding */); + assertEquals(2, rects.size()); + for (Rect rect : rects) { + assertEquals(600, rect.width()); + assertEquals(500, rect.height()); + } + } + + public void testTwoTilesLandscapeWithPadding() { + List<Rect> rects = TaskGridLayoutAlgorithm.getRectsForTaskCount( + 2, 1200, 500, false /* allowLineOfThree */, 10 /* padding */); + assertEquals(2, rects.size()); + Rect rectA = rects.get(0); + Rect rectB = rects.get(1); + assertEquals(595, rectA.width()); + assertEquals(595, rectB.width()); + assertEquals(605, rectB.left); + } + + public void testTwoTilesPortrait() { + List<Rect> rects = TaskGridLayoutAlgorithm.getRectsForTaskCount( + 2, 500, 1200, false /* allowLineOfThree */, 0 /* padding */); + assertEquals(2, rects.size()); + for (Rect rect : rects) { + assertEquals(500, rect.width()); + assertEquals(600, rect.height()); + } + } + + public void testThreeTiles() { + List<Rect> rects = TaskGridLayoutAlgorithm.getRectsForTaskCount( + 3, 1200, 500, false /* allowLineOfThree */, 0 /* padding */); + assertEquals(3, rects.size()); + for (Rect rect : rects) { + assertEquals(600, rect.width()); + assertEquals(250, rect.height()); + } + // The third tile should be on the second line, in the middle. + Rect rectC = rects.get(2); + assertEquals(300, rectC.left); + assertEquals(250, rectC.top); + } + + public void testFourTiles() { + List<Rect> rects = TaskGridLayoutAlgorithm.getRectsForTaskCount( + 4, 1200, 500, false /* allowLineOfThree */, 0 /* padding */); + assertEquals(4, rects.size()); + for (Rect rect : rects) { + assertEquals(600, rect.width()); + assertEquals(250, rect.height()); + } + Rect rectD = rects.get(3); + assertEquals(600, rectD.left); + assertEquals(250, rectD.top); + } + + public void testNineTiles() { + List<Rect> rects = TaskGridLayoutAlgorithm.getRectsForTaskCount( + 9, 1200, 600, false /* allowLineOfThree */, 0 /* padding */); + assertEquals(9, rects.size()); + for (Rect rect : rects) { + assertEquals(400, rect.width()); + assertEquals(200, rect.height()); + } + Rect rectE = rects.get(4); + assertEquals(400, rectE.left); + assertEquals(200, rectE.top); + Rect rectI = rects.get(8); + assertEquals(800, rectI.left); + assertEquals(400, rectI.top); + } +} + diff --git a/packages/VpnDialogs/res/values-ro/strings.xml b/packages/VpnDialogs/res/values-ro/strings.xml index 4865e964fc74..e2e1e44021b0 100644 --- a/packages/VpnDialogs/res/values-ro/strings.xml +++ b/packages/VpnDialogs/res/values-ro/strings.xml @@ -25,5 +25,5 @@ <string name="duration" msgid="3584782459928719435">"Durată:"</string> <string name="data_transmitted" msgid="7988167672982199061">"Trimise:"</string> <string name="data_received" msgid="4062776929376067820">"Primite:"</string> - <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> (de) octeți/<xliff:g id="NUMBER_1">%2$s</xliff:g> (de) pachete"</string> + <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> octeți/<xliff:g id="NUMBER_1">%2$s</xliff:g> pachete"</string> </resources> diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index e00178f8ea41..58bb5f379312 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -2891,8 +2891,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { sendDownAndUpKeyEvents(KeyEvent.KEYCODE_HOME); } return true; case AccessibilityService.GLOBAL_ACTION_RECENTS: { - openRecents(); - } return true; + return openRecents(); + } case AccessibilityService.GLOBAL_ACTION_NOTIFICATIONS: { expandNotifications(); } return true; @@ -3385,14 +3385,19 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { Binder.restoreCallingIdentity(token); } - private void openRecents() { + private boolean openRecents() { final long token = Binder.clearCallingIdentity(); - - StatusBarManagerInternal statusBarService = LocalServices.getService( - StatusBarManagerInternal.class); - statusBarService.toggleRecentApps(); - - Binder.restoreCallingIdentity(token); + try { + StatusBarManagerInternal statusBarService = LocalServices.getService( + StatusBarManagerInternal.class); + if (statusBarService == null) { + return false; + } + statusBarService.toggleRecentApps(); + } finally { + Binder.restoreCallingIdentity(token); + } + return true; } private void showGlobalActions() { diff --git a/services/core/java/com/android/server/LockSettingsService.java b/services/core/java/com/android/server/LockSettingsService.java index a91e2053c01d..ae5ed6b8d7fd 100644 --- a/services/core/java/com/android/server/LockSettingsService.java +++ b/services/core/java/com/android/server/LockSettingsService.java @@ -584,6 +584,20 @@ public class LockSettingsService extends ILockSettings.Stub { Slog.e(TAG, "Unable to remove tied profile key", e); } } + + boolean isWatch = mContext.getPackageManager().hasSystemFeature( + PackageManager.FEATURE_WATCH); + // Wear used to set DISABLE_LOCKSCREEN to 'true', but because Wear now allows accounts + // and device management the lockscreen must be re-enabled now for users that upgrade. + if (isWatch && getString("migrated_wear_lockscreen_disabled", null, 0) == null) { + final int userCount = users.size(); + for (int i = 0; i < userCount; i++) { + int id = users.get(i).id; + setBoolean(LockPatternUtils.DISABLE_LOCKSCREEN_KEY, false, id); + } + setString("migrated_wear_lockscreen_disabled", "true", 0); + Slog.i(TAG, "Migrated lockscreen_disabled for Wear devices"); + } } catch (RemoteException re) { Slog.e(TAG, "Unable to migrate old data", re); } diff --git a/services/core/java/com/android/server/PinnerService.java b/services/core/java/com/android/server/PinnerService.java index 356ccb3596a9..fa5a52c712cd 100644 --- a/services/core/java/com/android/server/PinnerService.java +++ b/services/core/java/com/android/server/PinnerService.java @@ -63,7 +63,7 @@ public final class PinnerService extends SystemService { private BinderService mBinderService; - private final long MAX_CAMERA_PIN_SIZE = 50 * (1 << 20); //50MB max + private final long MAX_CAMERA_PIN_SIZE = 80 * (1 << 20); //80MB max private PinnerHandler mPinnerHandler = null; @@ -192,6 +192,9 @@ public final class PinnerService extends SystemService { if (isResolverActivity(cameraResolveInfo.activityInfo)) { + if (DEBUG) { + Slog.v(TAG, "cameraIntent returned resolverActivity"); + } return null; } diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index 971989b21219..9c762cce7e0f 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -220,6 +220,11 @@ public final class DisplayManagerService extends SystemService { private final DisplayViewport mTempDefaultViewport = new DisplayViewport(); private final DisplayViewport mTempExternalTouchViewport = new DisplayViewport(); + // The default color mode for default displays. Overrides the usual + // Display.Display.COLOR_MODE_DEFAULT for displays with the + // DisplayDeviceInfo.FLAG_DEFAULT_DISPLAY flag set. + private final int mDefaultDisplayDefaultColorMode; + // Temporary list of deferred work to perform when setting the display state. // Only used by requestDisplayState. The field is self-synchronized and only // intended for use inside of the requestGlobalDisplayStateInternal function. @@ -232,6 +237,8 @@ public final class DisplayManagerService extends SystemService { mUiHandler = UiThread.getHandler(); mDisplayAdapterListener = new DisplayAdapterListener(); mSingleDisplayDemoMode = SystemProperties.getBoolean("persist.demo.singledisplay", false); + mDefaultDisplayDefaultColorMode = mContext.getResources().getInteger( + com.android.internal.R.integer.config_defaultDisplayDefaultColorMode); PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); mGlobalDisplayBrightness = pm.getDefaultScreenBrightnessSetting(); @@ -703,6 +710,14 @@ public final class DisplayManagerService extends SystemService { } if (display != null && display.getPrimaryDisplayDeviceLocked() == device) { int colorMode = mPersistentDataStore.getColorMode(device); + if (colorMode == Display.COLOR_MODE_INVALID) { + if ((device.getDisplayDeviceInfoLocked().flags + & DisplayDeviceInfo.FLAG_DEFAULT_DISPLAY) != 0) { + colorMode = mDefaultDisplayDefaultColorMode; + } else { + colorMode = Display.COLOR_MODE_DEFAULT; + } + } display.setRequestedColorModeLocked(colorMode); } scheduleTraversalLocked(false); @@ -1043,6 +1058,7 @@ public final class DisplayManagerService extends SystemService { pw.println(" mNextNonDefaultDisplayId=" + mNextNonDefaultDisplayId); pw.println(" mDefaultViewport=" + mDefaultViewport); pw.println(" mExternalTouchViewport=" + mExternalTouchViewport); + pw.println(" mDefaultDisplayDefaultColorMode=" + mDefaultDisplayDefaultColorMode); pw.println(" mSingleDisplayDemoMode=" + mSingleDisplayDemoMode); pw.println(" mWifiDisplayScanRequestCount=" + mWifiDisplayScanRequestCount); diff --git a/services/core/java/com/android/server/display/PersistentDataStore.java b/services/core/java/com/android/server/display/PersistentDataStore.java index 5616fb97bad7..47701b99860a 100644 --- a/services/core/java/com/android/server/display/PersistentDataStore.java +++ b/services/core/java/com/android/server/display/PersistentDataStore.java @@ -183,11 +183,11 @@ final class PersistentDataStore { public int getColorMode(DisplayDevice device) { if (!device.hasStableUniqueId()) { - return Display.COLOR_MODE_DEFAULT; + return Display.COLOR_MODE_INVALID; } DisplayState state = getDisplayState(device.getUniqueId(), false); if (state == null) { - return Display.COLOR_MODE_DEFAULT; + return Display.COLOR_MODE_INVALID; } return state.getColorMode(); } diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java index ae98077c7c2c..5f58c5d9e56a 100644 --- a/services/core/java/com/android/server/location/GnssLocationProvider.java +++ b/services/core/java/com/android/server/location/GnssLocationProvider.java @@ -417,6 +417,12 @@ public class GnssLocationProvider implements LocationProviderInterface { private int mYearOfHardware = 0; + // Set lower than the current ITAR limit of 600m/s to allow this to trigger even if GPS HAL + // stops output right at 600m/s, depriving this of the information of a device that reaches + // greater than 600m/s, and higher than the speed of sound to avoid impacting most use cases. + private static final float ITAR_SPEED_LIMIT_METERS_PER_SECOND = 400.0F; + private boolean mItarSpeedLimitExceeded = false; + private final IGnssStatusProvider mGnssStatusProvider = new IGnssStatusProvider.Stub() { @Override public void registerGnssStatusCallback(IGnssStatusListener callback) { @@ -1414,6 +1420,12 @@ public class GnssLocationProvider implements LocationProviderInterface { mStarted = true; mSingleShot = singleShot; mPositionMode = GPS_POSITION_MODE_STANDALONE; + // Notify about suppressed output, if speed limit was previously exceeded. + // Elsewhere, we check again with every speed output reported. + if (mItarSpeedLimitExceeded) { + Log.i(TAG, "startNavigating with ITAR limit in place. Output limited " + + "until slow enough speed reported."); + } boolean agpsEnabled = (Settings.Global.getInt(mContext.getContentResolver(), @@ -1500,7 +1512,17 @@ public class GnssLocationProvider implements LocationProviderInterface { * called from native code to update our position. */ private void reportLocation(int flags, double latitude, double longitude, double altitude, - float speed, float bearing, float accuracy, long timestamp) { + float speedMetersPerSecond, float bearing, float accuracy, long timestamp) { + if ((flags & LOCATION_HAS_SPEED) == LOCATION_HAS_SPEED) { + mItarSpeedLimitExceeded = speedMetersPerSecond > ITAR_SPEED_LIMIT_METERS_PER_SECOND; + } + + if (mItarSpeedLimitExceeded) { + Log.i(TAG, "Hal reported a speed in excess of ITAR limit." + + " GPS/GNSS Navigation output blocked."); + return; // No output of location allowed + } + if (VERBOSE) Log.v(TAG, "reportLocation lat: " + latitude + " long: " + longitude + " timestamp: " + timestamp); @@ -1520,7 +1542,7 @@ public class GnssLocationProvider implements LocationProviderInterface { mLocation.removeAltitude(); } if ((flags & LOCATION_HAS_SPEED) == LOCATION_HAS_SPEED) { - mLocation.setSpeed(speed); + mLocation.setSpeed(speedMetersPerSecond); } else { mLocation.removeSpeed(); } @@ -1704,23 +1726,29 @@ public class GnssLocationProvider implements LocationProviderInterface { * called from native code to report NMEA data received */ private void reportNmea(long timestamp) { - int length = native_read_nmea(mNmeaBuffer, mNmeaBuffer.length); - String nmea = new String(mNmeaBuffer, 0 /* offset */, length); - mListenerHelper.onNmeaReceived(timestamp, nmea); + if (!mItarSpeedLimitExceeded) { + int length = native_read_nmea(mNmeaBuffer, mNmeaBuffer.length); + String nmea = new String(mNmeaBuffer, 0 /* offset */, length); + mListenerHelper.onNmeaReceived(timestamp, nmea); + } } /** * called from native code - Gps measurements callback */ private void reportMeasurementData(GnssMeasurementsEvent event) { - mGnssMeasurementsProvider.onMeasurementsAvailable(event); + if (!mItarSpeedLimitExceeded) { + mGnssMeasurementsProvider.onMeasurementsAvailable(event); + } } /** * called from native code - GPS navigation message callback */ private void reportNavigationMessage(GnssNavigationMessage event) { - mGnssNavigationMessageProvider.onNavigationMessageAvailable(event); + if (!mItarSpeedLimitExceeded) { + mGnssNavigationMessageProvider.onNavigationMessageAvailable(event); + } } /** diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java index d558b07a7a70..38d69ed287e1 100644 --- a/services/core/java/com/android/server/pm/ShortcutPackage.java +++ b/services/core/java/com/android/server/pm/ShortcutPackage.java @@ -635,7 +635,11 @@ class ShortcutPackage extends ShortcutPackageItem { return false; // Shouldn't happen. } - if (!isNewApp && !forceRescan) { + // Always scan the settings app, since its version code is the same for DR and MR1. + // TODO Fix it properly: b/32554059 + final boolean isSettings = "com.android.settings".equals(getPackageName()); + + if (!isNewApp && !forceRescan && !isSettings) { // Return if the package hasn't changed, ie: // - version code hasn't change // - lastUpdateTime hasn't change @@ -652,6 +656,11 @@ class ShortcutPackage extends ShortcutPackageItem { return false; } } + if (isSettings) { + if (ShortcutService.DEBUG) { + Slog.d(TAG, "Always scan settings."); + } + } } finally { s.logDurationStat(Stats.PACKAGE_UPDATE_CHECK, start); } diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java index 13f558e3dd13..500af0ca73d3 100644 --- a/services/core/java/com/android/server/pm/ShortcutService.java +++ b/services/core/java/com/android/server/pm/ShortcutService.java @@ -238,10 +238,19 @@ public class ShortcutService extends IShortcutService.Stub { private static List<ResolveInfo> EMPTY_RESOLVE_INFO = new ArrayList<>(0); - private static Predicate<ResolveInfo> ACTIVITY_NOT_EXPORTED = - ri -> !ri.activityInfo.exported; + // Temporarily reverted to anonymous inner class form due to: b/32554459 + private static Predicate<ResolveInfo> ACTIVITY_NOT_EXPORTED = new Predicate<ResolveInfo>() { + public boolean test(ResolveInfo ri) { + return !ri.activityInfo.exported; + } + }; - private static Predicate<PackageInfo> PACKAGE_NOT_INSTALLED = pi -> !isInstalled(pi); + // Temporarily reverted to anonymous inner class form due to: b/32554459 + private static Predicate<PackageInfo> PACKAGE_NOT_INSTALLED = new Predicate<PackageInfo>() { + public boolean test(PackageInfo pi) { + return !isInstalled(pi); + } + }; private final Handler mHandler; diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 915b882d46a5..b2f6cd2fd900 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -1042,6 +1042,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } private void interceptBackKeyDown() { + MetricsLogger.count(mContext, "key_back_down", 1); // Reset back key state for long press mBackKeyHandled = false; diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java index 6f0a43a20e8a..d62a861fdb57 100644 --- a/services/core/java/com/android/server/wm/DockedStackDividerController.java +++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java @@ -658,6 +658,14 @@ public class DockedStackDividerController implements DimLayerUser { mDelayedImeWin = imeWin; imeWin.mWinAnimator.startDelayingAnimationStart(); } + + // If we are already waiting for something to be drawn, clear out the old one so it + // still gets executed. + // TODO: Have a real system where we can wait on different windows to be drawn with + // different callbacks. + if (mService.mWaitingForDrawnCallback != null) { + mService.mWaitingForDrawnCallback.run(); + } mService.mWaitingForDrawnCallback = () -> { mAnimationStartDelayed = false; if (mDelayedImeWin != null) { diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index ca2610af3f66..5dad9c4e3ce8 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -350,11 +350,13 @@ public class WindowManagerService extends IWindowManager.Stub // Enums for animation scale update types. @Retention(RetentionPolicy.SOURCE) - @IntDef({WINDOW_ANIMATION_SCALE, TRANSITION_ANIMATION_SCALE, ANIMATION_DURATION_SCALE}) + @IntDef({WINDOW_ANIMATION_SCALE, TRANSITION_ANIMATION_SCALE, ANIMATION_DURATION_SCALE, + ACCESSIBILITY_CHANGED}) private @interface UpdateAnimationScaleMode {}; private static final int WINDOW_ANIMATION_SCALE = 0; private static final int TRANSITION_ANIMATION_SCALE = 1; private static final int ANIMATION_DURATION_SCALE = 2; + private static final int ACCESSIBILITY_CHANGED = 3; final private KeyguardDisableHandler mKeyguardDisableHandler; @@ -669,6 +671,8 @@ public class WindowManagerService extends IWindowManager.Stub Settings.Global.getUriFor(Settings.Global.TRANSITION_ANIMATION_SCALE); private final Uri mAnimationDurationScaleUri = Settings.Global.getUriFor(Settings.Global.ANIMATOR_DURATION_SCALE); + private final Uri mAccessibilityEnabledUri = + Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_ENABLED); public SettingsObserver() { super(new Handler()); @@ -681,6 +685,8 @@ public class WindowManagerService extends IWindowManager.Stub UserHandle.USER_ALL); resolver.registerContentObserver(mAnimationDurationScaleUri, false, this, UserHandle.USER_ALL); + resolver.registerContentObserver(mAccessibilityEnabledUri, false, this, + UserHandle.USER_ALL); } @Override @@ -700,6 +706,9 @@ public class WindowManagerService extends IWindowManager.Stub mode = TRANSITION_ANIMATION_SCALE; } else if (mAnimationDurationScaleUri.equals(uri)) { mode = ANIMATION_DURATION_SCALE; + } else if (mAccessibilityEnabledUri.equals(uri)) { + // Change all of them. + mode = ACCESSIBILITY_CHANGED; } else { // Ignoring unrecognized content changes return; @@ -998,13 +1007,12 @@ public class WindowManagerService extends IWindowManager.Stub public void onLowPowerModeChanged(boolean enabled) { synchronized (mWindowMap) { if (mAnimationsDisabled != enabled && !mAllowAnimationsInLowPowerMode) { - mAnimationsDisabled = enabled; - dispatchNewAnimatorScaleLocked(null); + setShouldAnimationsDisabled(enabled); } } } }); - mAnimationsDisabled = mPowerManagerInternal.getLowPowerModeEnabled(); + setShouldAnimationsDisabled(mPowerManagerInternal.getLowPowerModeEnabled()); mScreenFrozenLock = mPowerManager.newWakeLock( PowerManager.PARTIAL_WAKE_LOCK, "SCREEN_FROZEN"); mScreenFrozenLock.setReferenceCounted(false); @@ -1087,6 +1095,18 @@ public class WindowManagerService extends IWindowManager.Stub } } + private void setShouldAnimationsDisabled(boolean isLowPowerEnabled) { + boolean accessibilityEnabled = Settings.Secure.getInt(mContext.getContentResolver(), + Settings.Secure.ACCESSIBILITY_ENABLED, 0) == 1; + boolean disableAnimationsWhenAccessibility = Settings.Secure.getInt( + mContext.getContentResolver(), + Settings.Secure.ACCESSIBILITY_DISABLE_ANIMATIONS, 0) == 1; + + mAnimationsDisabled = isLowPowerEnabled || + (accessibilityEnabled && disableAnimationsWhenAccessibility); + dispatchNewAnimatorScaleLocked(null); + } + private void placeWindowAfter(WindowState pos, WindowState window) { final WindowList windows = pos.getWindowList(); final int i = windows.indexOf(pos); @@ -8590,6 +8610,11 @@ public class WindowManagerService extends IWindowManager.Stub dispatchNewAnimatorScaleLocked(null); break; } + case ACCESSIBILITY_CHANGED: { + setShouldAnimationsDisabled( + mPowerManagerInternal.getLowPowerModeEnabled()); + } + break; } break; } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 37144950e97d..96331e83dd31 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -6144,6 +6144,9 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return hasUserSetupCompleted(UserHandle.getCallingUserId()); } + // This checks only if the Setup Wizard has run. Since Wear devices pair before + // completing Setup Wizard, and pairing involves transferring user data, calling + // logic may want to check mIsWatch or mPaired in addition to hasUserSetupCompleted(). private boolean hasUserSetupCompleted(int userHandle) { if (!mHasFeature) { return true; @@ -6388,7 +6391,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } int callingUid = mInjector.binderGetCallingUid(); if (callingUid == Process.SHELL_UID || callingUid == Process.ROOT_UID) { - if (hasUserSetupCompleted(userHandle) + if ((mIsWatch || hasUserSetupCompleted(userHandle)) && hasIncompatibleAccountsLocked(userHandle, owner)) { throw new IllegalStateException("Not allowed to set the profile owner because " + "there are already some accounts on the profile"); @@ -6396,7 +6399,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return; } enforceCanManageProfileAndDeviceOwners(); - if (hasUserSetupCompleted(userHandle) && !isCallerWithSystemUid()) { + if ((mIsWatch || hasUserSetupCompleted(userHandle)) && !isCallerWithSystemUid()) { throw new IllegalStateException("Cannot set the profile owner on a user which is " + "already set-up"); } @@ -8633,6 +8636,9 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (hasUserSetupCompleted(callingUserId)) { return false; } + if (mIsWatch && hasPaired(UserHandle.USER_SYSTEM)) { + return false; + } return true; } else if (DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE.equals(action)) { if (!mInjector.userManagerIsSplitSystemUser()) { @@ -8664,7 +8670,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } if (isAdb) { // if shell command runs after user setup completed check device status. Otherwise, OK. - if (hasUserSetupCompleted(UserHandle.USER_SYSTEM)) { + if (mIsWatch || hasUserSetupCompleted(UserHandle.USER_SYSTEM)) { if (!mInjector.userManagerIsSplitSystemUser()) { if (mUserManager.getUserCount() > 1) { return CODE_NONSYSTEM_USER_EXISTS; diff --git a/services/net/java/android/net/ip/IpManager.java b/services/net/java/android/net/ip/IpManager.java index 01d93048bfe2..39f14e5ee287 100644 --- a/services/net/java/android/net/ip/IpManager.java +++ b/services/net/java/android/net/ip/IpManager.java @@ -631,6 +631,11 @@ public class IpManager extends StateMachine { return shouldLog; } + // TODO: Migrate all Log.e(...) to logError(...). + private void logError(String fmt, Object... args) { + mLocalLog.log("ERROR " + String.format(fmt, args)); + } + private void getNetworkInterface() { try { mNetworkInterface = NetworkInterface.getByName(mInterfaceName); @@ -880,7 +885,7 @@ public class IpManager extends StateMachine { mNwService.setInterfaceConfig(mInterfaceName, ifcg); if (VDBG) Log.d(mTag, "IPv4 configuration succeeded"); } catch (IllegalStateException | RemoteException e) { - Log.e(mTag, "IPv4 configuration failed: ", e); + logError("IPv4 configuration failed: %s", e); return false; } return true; @@ -944,6 +949,12 @@ public class IpManager extends StateMachine { } } + private void doImmediateProvisioningFailure(int failureType) { + if (DBG) { Log.e(mTag, "onProvisioningFailure(): " + failureType); } + recordMetric(failureType); + mCallback.onProvisioningFailure(new LinkProperties(mLinkProperties)); + } + private boolean startIPv4() { // If we have a StaticIpConfiguration attempt to apply it and // handle the result accordingly. @@ -951,9 +962,6 @@ public class IpManager extends StateMachine { if (setIPv4Address(mConfiguration.mStaticIpConfig.ipAddress)) { handleIPv4Success(new DhcpResults(mConfiguration.mStaticIpConfig)); } else { - if (VDBG) { Log.d(mTag, "onProvisioningFailure()"); } - recordMetric(IpManagerEvent.PROVISIONING_FAIL); - mCallback.onProvisioningFailure(new LinkProperties(mLinkProperties)); return false; } } else { @@ -972,16 +980,40 @@ public class IpManager extends StateMachine { mNwService.setInterfaceIpv6PrivacyExtensions(mInterfaceName, true); mNwService.enableIpv6(mInterfaceName); } catch (RemoteException re) { - Log.e(mTag, "Unable to change interface settings: " + re); + logError("Unable to change interface settings: %s", re); return false; } catch (IllegalStateException ie) { - Log.e(mTag, "Unable to change interface settings: " + ie); + logError("Unable to change interface settings: %s", ie); return false; } return true; } + private boolean startIpReachabilityMonitor() { + try { + mIpReachabilityMonitor = new IpReachabilityMonitor( + mContext, + mInterfaceName, + new IpReachabilityMonitor.Callback() { + @Override + public void notifyLost(InetAddress ip, String logMsg) { + mCallback.onReachabilityLost(logMsg); + } + }, + mAvoidBadWifiTracker); + } catch (IllegalArgumentException iae) { + // Failed to start IpReachabilityMonitor. Log it and call + // onProvisioningFailure() immediately. + // + // See http://b/31038971. + logError("IpReachabilityMonitor failure: %s", iae); + mIpReachabilityMonitor = null; + } + + return (mIpReachabilityMonitor != null); + } + private void stopAllIP() { // We don't need to worry about routes, just addresses, because: // - disableIpv6() will clear autoconf IPv6 routes as well, and @@ -1165,29 +1197,23 @@ public class IpManager extends StateMachine { mCallback.setFallbackMulticastFilter(mMulticastFiltering); } - if (mConfiguration.mEnableIPv6) { - // TODO: Consider transitionTo(mStoppingState) if this fails. - startIPv6(); + if (mConfiguration.mEnableIPv6 && !startIPv6()) { + doImmediateProvisioningFailure(IpManagerEvent.ERROR_STARTING_IPV6); + transitionTo(mStoppingState); + return; } - if (mConfiguration.mEnableIPv4) { - if (!startIPv4()) { - transitionTo(mStoppingState); - return; - } + if (mConfiguration.mEnableIPv4 && !startIPv4()) { + doImmediateProvisioningFailure(IpManagerEvent.ERROR_STARTING_IPV4); + transitionTo(mStoppingState); + return; } - if (mConfiguration.mUsingIpReachabilityMonitor) { - mIpReachabilityMonitor = new IpReachabilityMonitor( - mContext, - mInterfaceName, - new IpReachabilityMonitor.Callback() { - @Override - public void notifyLost(InetAddress ip, String logMsg) { - mCallback.onReachabilityLost(logMsg); - } - }, - mAvoidBadWifiTracker); + if (mConfiguration.mUsingIpReachabilityMonitor && !startIpReachabilityMonitor()) { + doImmediateProvisioningFailure( + IpManagerEvent.ERROR_STARTING_IPREACHABILITYMONITOR); + transitionTo(mStoppingState); + return; } } diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 08477884fea9..27741c71d62d 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -443,6 +443,13 @@ public class CarrierConfigManager { "disable_severe_when_extreme_disabled_bool"; /** + * The message expiration time in milliseconds for duplicate detection purposes. + * @hide + */ + public static final String KEY_MESSAGE_EXPIRATION_TIME_LONG = + "message_expiration_time_long"; + + /** * The data call retry configuration for different types of APN. * @hide */ @@ -1064,6 +1071,7 @@ public class CarrierConfigManager { sDefaults.putBoolean(KEY_BROADCAST_EMERGENCY_CALL_STATE_CHANGES_BOOL, false); sDefaults.putBoolean(KEY_ALWAYS_SHOW_EMERGENCY_ALERT_ONOFF_BOOL, false); sDefaults.putBoolean(KEY_DISABLE_SEVERE_WHEN_EXTREME_DISABLED_BOOL, true); + sDefaults.putLong(KEY_MESSAGE_EXPIRATION_TIME_LONG, 86400000L); sDefaults.putStringArray(KEY_CARRIER_DATA_CALL_RETRY_CONFIG_STRINGS, new String[]{ "default:default_randomization=2000,5000,10000,20000,40000,80000:5000,160000:5000," + "320000:5000,640000:5000,1280000:5000,1800000:5000", |